ファイルorTWAINから取得した巨大なBMP(2000*2500,5MBほど)をTJpegImageに入れ、JPEGNeededまたはSaveToFileを行おうとすると、「JPEGエラー #36」というエラーが出ます。どうやらBMPが巨大すぎるせいでうまくJPEGに変換できないようだという事はわかったのですが・・・
imgctlというDLLを使ってみたり、他にこの問題を調べている人はいるかと検索してみたのですが、どうにも情報が見つかりません。BMP関連で依然こちらで紹介されていたDHGLも見てみましたが、どうも違うような。
BMPを小さくすれば話は簡単なんですが、画像の内容が内容なので、なるたけ大きな画像をそのまま扱いたいのです。
他に画像処理を行うわけではないので、単純に巨大なBMPをそのままJPEGに変換できればいいのですが・・・行き詰まってしまったので、皆様のお知恵をお借りしたく思い、書き込ませていただきます。
こちらの環境は、
WindowsXP SP2
Borland C++ Builder 5
です。
宜しくお願いします。
Delphi7+win2000では普通にできるんですけどね。
2800*2800のBMPまでは確認しています。
基本的にBMPはピクセルデータそのままのはずなので、
本当に2000*2500で5MBならファイルがおかしいと思います・・・
Jpg := TJpegImage.Create;
Jpg.Assign('test.bmp');
Jpg.SaveToFile('test.jpg');
Jpg.Free;
DHGLは違わないと思います。
http://www.asahi-net.or.jp/~HA3T-NKMR/DGS/DownLoad.htm
私もTWAINの大きなBMPの処理にはTBigBitmapを
使用させていただいてます。
ちなみに5MBは巨大ではありません。
>なすか様
回答ありがとうございます。うーむ、BCBなのがいかんのか。いや、実のところ最終的には4000*5000、19MBくらいのbmpを扱うつもりなのでまずそうな。
ともあれ、ありがとうございました。
>TS様
回答ありがとうございます。5MBってわりとでかいよね、という感覚だったので「巨大な」と表現したのですが・・・そうですね、昨今は5MBの画像ってわりとありますものね。
DHGL、見てみましたが、bmpを他の画像形式に変換する、というそのものずばりなメソッドが見つからないので、どうしたものかと思っています。具体的なやり方をご存知であれば、教えていただけないでしょうか?
もっとも前述の通りの大きさの画像を扱うので、BigBitmapは使ったほうがよさそうですね。
ありがとうございました。
環境をよく見てませんでした。
>Borland C++ Builder 5
試しにカラーA3 解像度600dpi 7019*9924をスキャンして
保存すると199.29MBでした
Delphiなら
var Bitmap1:TBitmap;
Bitmap:TBigBitmap;
begin
Bitmap:=TBigBitmap.Create;
Bitmap1 := TBitmap.Create;
Bitmap1.Assign(Bitmap);
Bitmap1.Free;
Bitmap.Free;
end;
>bmpを他の画像形式に変換する、というそのものずばりなメソッドが見つから>ないので、どうしたものかと思っています。
bmpをjpgとかに変換するのは検索すればいくらでもありますが。
>TS様
ありがとうございます。BigBitmapの使い方は、おぼろげながら分かります。
問題は、まさに変換する部分なので・・・「JPEGエラー」で検索しても出てきませんし、前述の通りimgctl.dllというものを使って(Bmpを一旦DIBに変換して、それをまたJpgに変換する、というものでした)みたのですが、やはりJPEGエラー#36が出ます。なすか様の書かれている通常のやりかたを使っているものはダメなようなので、何か特殊なDLLなり何なりがいるのかと・・・
やはりDLLを片端から試してみるしかないんですかね。
ちょっと気になったことがあります。
BMPの形式ですが、もしかして一般的な規格ではないBMPだったりしませんか?
一旦普通の画像処理ソフトを使ってBMP>JPEG変換してみてはどうでしょう?
もしプロファイルを調べられるソフト(PhotoShop等)があれば、
カラービット、カラー形式など調べてみたほうがいいと思います。
スキャナなどで取り込んだ場合、インデックスカラーモードになっていて、
読み込めないことがあると思います。
こちらのホームページのDelphi - 過去のTips集
を使用なすかさんの方法と同一ですが
Bitmap1.Assign(Bitmap);
Jpg :=TJpegImage.Create;
Jpg.Assign(Bitmap1);
Jpg.SaveToFile('F:\test.jpg');
Jpg.Free;
を使用した場合
BMP 199.29MBが
JPG 12.58MBでした。
ところで使用言語はDelphiなんでしょうか。
それとも一部Delphiを使用したいと云うことでしょうか。
>なすか様
ありがとうございます。
PhotoShopで問題の画像(4000*5000,19MB)を開いてみたところ、カラーモードがインデックスカラー(8bit)というものになっていまして、これをRGBカラー(8bit)に直してみたところ、ペイントで作った同じ大きさの画像(4000*5000,57MB)とほぼ同じ容量になりました。が、相変わらず変換ができません。
しかし、ペイントで作ったほうの画像はうまく変換できましたので、これはもう画像のほうが悪いのかな、と。
プロファイルをもう少し弄り回してみます。ありがとうございました。
>TS様
いえ、TBitmapをTJPEGImageに入れるのは分かるんです。問題は、
TBitmap *pBmp = new TBitmap();
TJpegImage *pPic = new TJpegImage();
pBmp->LoadFromFile('D:\test.bmp');
pPic->Assign(pBmp);
pPic->JpegNeeded(); ←ここでJPEGエラー#36が発生
pPic->SaveToFile('D:\test.bmp'); ←上行がない場合ここでもJPEGエラー#36が発生
というふうに、Assignするあたりでなく、Jpegを作るというところでエラーがでているので、ああこりゃ変換が悪いんだと思ったのです。
が、なすか様の言うとおり画像の方が悪いんですかね、やはり。
>ところで使用言語はDelphiなんでしょうか。
いえ、C++です。C++を使っている人が質問しているのを見て、C++でも質問していいものだと。どこかへ移ったほうがいいでしょうか?
あ、いかん。上のコードですが、
pPic->SaveToFile('D:\test.bmp');
は
pPic->SaveToFile('D:\test.jpg');
でした。訂正します。
ツイート | ![]() |