私はUbuntu LinuxとC++で開発しています。XImageをPNG形式のbase64文字列として保存するにはどうすればよいですか?
私はのXImageにデスクトップイメージを捕獲しました。 PNG形式のbase64文字列としてのXImageを保存する方法
?
私はUbuntu LinuxとC++で開発しています。XImageをPNG形式のbase64文字列として保存するにはどうすればよいですか?
私はのXImageにデスクトップイメージを捕獲しました。 PNG形式のbase64文字列としてのXImageを保存する方法
?
私は答えがlibpngを使用すべきであると言うことを約ありました。しかし、quick look at the documentationの後、私はこのライブラリの方法が必要以上に複雑であることを発見しました。(簡単なものは簡単で、難しいことは可能でなければなりません...マニュアルを見れば、libpngの簡単なことは不可能に近いと思われます) PNG形式には非常に多くのオプションがありますが、libpngは非常に柔軟でプラグイン可能ですが、単純な作業(単一色の不透明画像の保存など)をしたいときは簡単なショートカットはありません。
私はちょうど生の形式で画像をダンプして、(おそらくパイプを通して)のImageMagickを使用するように誘惑されると思います。一方
あなたの代わりに裸XのQtのを使用して検討したのですか?画面をキャプチャするのは簡単で、管理しやすい形式(QImage)で表示できます。あなたが好きな、ほぼすべてのファイル形式に保存する(PNG形式を使用して、ライブビデオのキャプチャを行いたいのであればお勧めできません、Qtを持つCPUにやや硬いがある)も自明です。ここで
は、JPEG画像にデータを変換するC関数です:
void write_jpeg(FILE *outfile, int width, int height, unsigned char *rgb, int quality)
{
struct jpeg_compress_struct cinfo;
struct jpeg_error_mgr jerr;
JSAMPROW scanline[1];
cinfo.err = jpeg_std_error(&jerr);
jpeg_create_compress(&cinfo);
jpeg_stdio_dest(&cinfo, outfile);
cinfo.image_width = width;
cinfo.image_height = height;
cinfo.input_components = 3;
cinfo.in_color_space = JCS_RGB;
jpeg_set_defaults(&cinfo);
jpeg_set_quality(&cinfo, quality, TRUE);
jpeg_start_compress(&cinfo, TRUE);
while (cinfo.next_scanline < (unsigned int) height)
{
scanline[0] = rgb + 3 * width * cinfo.next_scanline;
jpeg_write_scanlines(&cinfo, scanline, 1);
}
jpeg_finish_compress(&cinfo);
jpeg_destroy_compress(&cinfo);
}
私はあなたが簡単にあなたのコードにこれを収めることができると確信しています。あなたは、(jpegファイルの代わりに)PNGファイルを保存するために適切なライブラリを使用するだけです。
libpngは威圧的かもしれませんが、単純な画像作成のためのヘルパー/ラッパーを書くのは難しくありません。例えば、http://zarb.org/~gc/html/libpng.html – leonbloy
@leonbloy:34空ではありませんイメージをロードするだけの非コメント行は威圧的ではありません。それは愚かです。 Qtのそれは 'QImage img(filename);'です。 – 6502