画像のサイズを300KBから100KBに変更したいのですが、
どうすればいいのでしょうか?
ちなみに、画像の種類は、JPEGもしくはBITMAPです。
サイズは、いろいろな条件で変わります。
JPEGでは無理でしょう。圧縮率と、画像サイズ(Width,Height)を変更し、JPEGに変換してサイズを見て、期待する値になるまで圧縮率を上げたり、Width,Heightを小さくしたりするしかありません。
BMPの場合、圧縮されたBMPを取り扱うクラスがあれば、同じ要領でできます。
未圧縮BMPの場合は、Width,Heightから逆算できます。1/3に死体のであれば、Width*Heightを1/3にすればよいので、Width,Height双方に3の平方根をかけてやれば近い数値になります。
# 正確には、ヘッダ分があるので1/3にはなりません。
にしの様ありがとうございます。
実際に行いたいのは、縦横の比率はそのままで、画像圧縮を行いたい
のですが、圧縮率を変更するにはどうしたらよいのでしょうか?
素人発言で申し訳ありません。
それは、Width,Heightを小さくしたいと言うことでしょうか。
サイズが、ファイルサイズなのか、画像の幅・高さなのか曖昧です。
> 縦横の比率はそのままで
ということなので、幅・高さの変更と仮定します。
BMPの場合です。JPEGも大差ありません。
縦横1/2にしています。
procedure TForm1.Button1Click(Sender: TObject);
var
bmp, bmp2: TBitmap;
dW,dH: double;
begin
bmp := nil;
bmp2 := nil;
try
bmp := TBitmap.Create;
bmp.LoadFromFile('C:\tmp.bmp');
dW := bmp.Width;
dH := bmp.Height;
bmp2 := TBitmap.Create;
bmp2.Width :=Ceil(dW / 2);
bmp2.Height :=Ceil(dH / 2);
bmp2.Canvas.StretchDraw(RECT(0,0,bmp2.Width-1,bmp2.Height-1), bmp);
bmp2.SaveToFile('C:\tmp2.bmp');
finally
if Assigned(bmp) then bmp.Free;
if Assigned(bmp2) then bmp2.Free;
end;
end;
表現が曖昧になっててすみません。
高さ、幅はそのままで、ファイルサイズのみ小さくするということです。
幅・高さがそのままだとすると、あと犠牲に出来るのは色深度です。JPEGの場合は、圧縮率を高くするという手もあります。
JPEGImageの場合の色深度を下げる方法は、
http://forum.nifty.com/fdelphi/samples/00346.html
こちらを参考にしてください。
JPEGで圧縮率を変える場合は、CompressionQualityを小さい値に変更します。
BMPで、色深度を下げる場合の処理です。
var
bmp: TBitmap;
dW,dH: double;
begin
bmp := nil;
try
bmp := TBitmap.Create;
bmp.LoadFromFile('C:\tmp.bmp');
bmp.PixelFormat := pf8bit;//24bitだった場合、約1/3になる
bmp.SaveToFile('C:\tmp2.bmp');
finally
if Assigned(bmp) then bmp.Free;
end;
end;
CompressionQualityを使用して圧縮はできましたが、
グレースケール化したファイルが、24bitカラーに変更されてしまいました。
グレースケールのまま、圧縮はできないのでしょうか?
Grayscaleプロパティは設定してありますか?
すみません。
設定し忘れてました。
ちなみにロジックは、
// JPEGオープン
objJPEG.LoadFromFile(szPath);
// グレースケール設定
objJPEG.Grayscale := True;
// 描画(ビットマップ)
objBMP.Width := objJPEG.Width;
objBMP.Height := objJPEG.Height;
objBMP.Canvas.Draw(0, 0, objJPEG);
Image1.Picture.Assign(objBMP);
// グレースケール設定
objJPEG2.Grayscale := True;
// 品質重視
objJPEG2.Performance := jpBestQuality;
// 圧縮率%指定
objJPEG2.CompressionQuality := 50;
// 表示方法
objJPEG2.ProgressiveEncoding := False;
// BMPをアサイン
objJPEG2.Assign(Image1.Picture.Bitmap);
です。
ありがとうございました。
ツイート | ![]() |