画像を切り取るには


ななしー  2004-04-02 04:02:18  No: 8146

JPEGで作成された画像を、ある座標(Y座標)で切り取りたい
のですが、どうすればよろしいでしょうか?

たとえば、800 X 600の画像があって、Y座標点500の位置で
切り取り、800 X 500にしたいということです。


jok  2004-04-02 04:27:59  No: 8147

TJpegImage にロードする
同サイズの TBitmap に転写
ほしいサイズの TBitmap にほしい部分を転写 (Canvas.CopyRect) 
TJegImage に戻して表示するなりセーブする

例  高さを半分にする

uses
  Jpeg;

procedure TForm1.Button1Click(Sender: TObject);
var
  jpg:TJpegImage;
  bmp1,bmp2:TBitmap;
  srcRect,dstRect:TRect;
begin
  jpg := TJpegImage.Create;
  bmp1 := TBitmap.Create;
  bmp2 := TBitmap.Create;
  try
    jpg.LoadFromFile('C:\Documents and Settings\My Pictures\サンプル.jpg');
    bmp1.Assign(jpg);
    bmp2.Width := bmp1.Width;
    bmp2.Height := bmp1.Height div 2;
    srcRect := Rect(0,0,bmp2.Width,bmp2.Height);
    dstRect := srcRect;
    bmp2.Canvas.CopyRect(dstRect,bmp1.Canvas,srcRect);
    jpg.Assign(bmp2);
    Image1.Picture.Assign(jpg);  // 確認表示
  finally
    jpg.free;
    bmp1.free;
    bmp2.free;
  end;
end;


るるとん@K  2004-04-03 01:34:41  No: 8148

canvasからはみ出させる?わけですね


るるとん@K  2004-04-03 01:36:37  No: 8149

>canvasからはみ出させる?わけですね
canvasじゃなくてビットマップ


jok  2004-04-03 01:52:22  No: 8150

>canvasからはみ出させる?わけですね

いや、コードでは Rect で示しているとおり、はじめから上半分のサイズにして
ソースの上半分をコピーしています。ですからはみ出ていません。

今回の質問の重要な点は、TJpegImage は Canvas プロパティーを持っていない、
ということです。切り取るだけでなく、拡大・縮小などの加工をする時は、
一度 TBitmap のインスタンスに写し取ってから、その Canvas を使って加工する
ということです。他のグラフィックソフトでも同じですが、Jpeg 画像は、加工を
繰り返すと、非可逆圧縮のためだんだんと画質が劣化します。


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

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






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