画像サイズの変更

解決


ほとちゃん  2004-02-13 20:28:55  No: 7101

画像のサイズを300KBから100KBに変更したいのですが、
どうすればいいのでしょうか?
ちなみに、画像の種類は、JPEGもしくはBITMAPです。


にしの  2004-02-13 20:40:06  No: 7102

サイズは、いろいろな条件で変わります。
JPEGでは無理でしょう。圧縮率と、画像サイズ(Width,Height)を変更し、JPEGに変換してサイズを見て、期待する値になるまで圧縮率を上げたり、Width,Heightを小さくしたりするしかありません。
BMPの場合、圧縮されたBMPを取り扱うクラスがあれば、同じ要領でできます。

未圧縮BMPの場合は、Width,Heightから逆算できます。1/3に死体のであれば、Width*Heightを1/3にすればよいので、Width,Height双方に3の平方根をかけてやれば近い数値になります。
# 正確には、ヘッダ分があるので1/3にはなりません。


ほとちゃん  2004-02-13 21:54:44  No: 7103

にしの様ありがとうございます。

実際に行いたいのは、縦横の比率はそのままで、画像圧縮を行いたい
のですが、圧縮率を変更するにはどうしたらよいのでしょうか?

素人発言で申し訳ありません。


にしの  2004-02-13 22:49:08  No: 7104

それは、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;


ほとちゃん  2004-02-13 23:21:04  No: 7105

表現が曖昧になっててすみません。

高さ、幅はそのままで、ファイルサイズのみ小さくするということです。


にしの  2004-02-13 23:50:32  No: 7106

幅・高さがそのままだとすると、あと犠牲に出来るのは色深度です。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;


ほとちゃん  2004-02-17 00:29:28  No: 7107

CompressionQualityを使用して圧縮はできましたが、
グレースケール化したファイルが、24bitカラーに変更されてしまいました。
グレースケールのまま、圧縮はできないのでしょうか?


にしの  2004-02-17 00:59:14  No: 7108

Grayscaleプロパティは設定してありますか?


ほとちゃん  2004-02-17 02:00:17  No: 7109

すみません。
設定し忘れてました。

ちなみにロジックは、

    //  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);

です。

ありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加