是否可以将Windows位图绘制到cairo表面?

时间:2013-02-06 20:32:35

标签: c++ bitmap draw cairo

我正在一个项目中,在OpenSUSE Linux环境中,Cairo被选为图形库(在Xlib上运行)。我使用图形库或图形文件格式的经验很少,我想知道是否可以将Windows位图图像绘制到Cairo表面?在开罗画一个png似乎相对简单,但我一直在四处寻找有关绘制位图的信息,并且找不到任何东西。我拼凑了以下代码:

int height = 256;
int width = 256;
cairo_format_t format = CAIRO_FORMAT_RGB24;
int stride = cairo_format_stride_for_width (format, width);
unsigned char *bitmapData;
bitmapData = (unsigned char *)(malloc (stride * height));
std::ifstream myFile ("exampleBitmapImage.bmp", std::ios::in | std::ios::binary);
myFile.read ((char *)bitmapData, stride * height);

cairo_surface_t *imageSurface = cairo_image_surface_create_for_data (bitmapData, format, width, height, stride);
cairo_set_source_surface (cs, imageSurface, 0, 0);
cairo_paint (cs);
cairo_show_page (cs);
cairo_surface_destroy (imageSurface);

myFile.close();

奇怪的是,当我运行它时,它会连续8次将图像倒置并向后显示其大小的1/64,然后填充图像大小的剩余部分(剩余的7/8)图像)与黑色。我怀疑它与文件格式有关,并且我正在解析并错误地将二进制数据提供给Cairo并且设置不正确。谁能指导如何正常工作?我为缺乏知识而道歉,并希望更好地理解这个问题,非常感谢任何帮助,谢谢! :)

1 个答案:

答案 0 :(得分:1)

将步幅乘以-1,应该翻转位图。 查找BMP文件格式http://en.wikipedia.org/wiki/BMP_file_format和 实现位图头解析器并正确设置编码。

现在正在猜测编码为RGB24,并且你让Cairo将位图标题解释为图像数据。

相关问题