2

私は、OpenSUSE Linux 環境で Cairo がグラフィック ライブラリ (Xlib 上で実行) として選択されたプロジェクトに取り組んでいます。グラフィック ライブラリやグラフィック ファイル形式を扱った経験がほとんどないので、Windows ビットマップ イメージを Cairo サーフェスに描画できるかどうか疑問に思っていました。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 に答える