[Delphi:91066] JPEG を 8bit で

199 views
Skip to first unread message

seizo

unread,
Feb 10, 2009, 9:28:56 PM2/10/09
to Del...@ml.users.gr.jp
槻 誠三(けやき せいぞう)です。

いつもこの ML には大変お世話になっております。

実は、24bit Color のビットマップを 8bit Color に減色して JPEG 形式で
保存しようとして以下の様な事をやって見たのですが、うまくいきません。
ビットマップ自体の減色は、うまくいくのですが JPEG 形式で保存したはず
のファイルを開くと 24bit Color になっています。JPEG を 8bit Color で
保存するにはどうすればいいのでしょうか。

////////////////////////////////////////////////////////////////////

procedure TForm1.Open1Click(Sender: TObject);
var
BC: Integer;
DS: TDIBSection;
begin
if OpenDialog1.Execute then
begin
Image1.Picture.LoadFromFile(OpenDialog1.Filename);
MakeBitmap; // 現在の画像をビットマップにする。
// 現在の画像のビット数を計算する。
GetObject(Image1.Picture.Bitmap.Handle, SizeOf(TDIBSection), @DS);
BC := DS.dsBmih.biBitCount;
Caption := OpenDialog1.FileName + ' - ' + IntToStr(BC) + ' bit Color';
end;
end;

procedure TForm1.MakeBitmap; // 現在の画像をビットマップにする手続き
var
Bmp: TBitmap;
begin
if (Image1.Picture.Graphic = Nil) or
(Image1.Picture.Graphic is TBitmap) then
Exit;
Bmp := TBitmap.Create;
try
if Image1.Picture.Graphic is TJPEGImage then
Bmp.Assign(Image1.Picture.Graphic)
else
begin
Bmp.Width := Image1.Picture.Graphic.Width;
Bmp.Height := Image1.Picture.Graphic.Height;
Bmp.Canvas.Draw(0, 0, Image1.Picture.Graphic);
end;
Image1.Picture.Graphic := Bmp;
finally
Bmp.Free;
end;
end;

procedure TForm1.Save1Click(Sender: TObject);
var
Bmp: TBitmap;
Jpeg: TJPEGImage;
begin
if SaveDialog1.Execute then
begin
{ メディアンカットにより減色したビットマップを返す関数 }
{ DHGL 内の中村拓男さんの関数を使わせて頂いています。}
{ 中村さん、ありがとうございます。}
Bmp := ReduceColorsByMedianCut(Image1.Picture.Bitmap, 8); // 8bit Color
try
Jpeg := TJPEGImage.Create;
try
Jpeg.PixelFormat := jf8Bit; // 念の為にこう記述したのですが
// 何の効果も無いみたいです。
Jpeg.Assign(Bmp);
Jpeg.SaveToFile(SaveDialog1.Filename);
finally
Jpeg.Free;
end;
finally
Bmp.Free;
end;
end;
end;

////////////////////////////////////////////////////////////////////

どなたかお助け下さい。

2009.02.11(Wed) 11:14
槻 誠三(けやき せいぞう)

sprh...@ka4.koalanet.ne.jp

unread,
Feb 11, 2009, 7:32:30 AM2/11/09
to Del...@ml.users.gr.jp

PixelFormat プロパティが jf24Bit, jf8Bit となっているので錯覚してしまいますが,
JPEG の 8bit color というのはグレイスケールのことです.
TJPEGImage なら Grayscale プロパティを True にしてから保存すればできます.
では PixelFormat プロパティというのは何なのかというと,これは JPEG のロードに
影響するものです.
それと,TJPEGImage は内部に DIB と JPEG のバッファを持っていて,プロパティを変える
だけでは何も変わりません.プロパティの変更を JPEG のバッファに反映させるには
Compress メソッドをコールする必要があります.


Original message:

Reply all
Reply to author
Forward
0 new messages