2

我在一个项目中工作,其中 Cairo 被选为 OpenSUSE Linux 环境中的图形库(在 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();

奇怪的是,当我运行它时,它会以 1/64 的大小连续 8 次上下颠倒和向后显示图像,然后填写图像大小的剩余部分(图像的剩余 7/8 ) 与黑色。我怀疑它与文件格式有关,并且我正在错误地解析和提供二​​进制数据,并且对 Cairo 的设置不正确。任何人都可以就如何使其正常工作提供指导吗?对于我缺乏知识并希望更好地理解这个问题,我深表歉意,非常感谢任何帮助,谢谢!:)

4

1 回答 1

1

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

现在猜测编码为 RGB24,而您让 Cairo 将位图标题解释为图像数据。

于 2013-02-07T23:39:04.583 回答