JPEGで作成された画像を、ある座標(Y座標)で切り取りたい
のですが、どうすればよろしいでしょうか?
たとえば、800 X 600の画像があって、Y座標点500の位置で
切り取り、800 X 500にしたいということです。
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;
canvasからはみ出させる?わけですね
>canvasからはみ出させる?わけですね
canvasじゃなくてビットマップ
>canvasからはみ出させる?わけですね
いや、コードでは Rect で示しているとおり、はじめから上半分のサイズにして
ソースの上半分をコピーしています。ですからはみ出ていません。
今回の質問の重要な点は、TJpegImage は Canvas プロパティーを持っていない、
ということです。切り取るだけでなく、拡大・縮小などの加工をする時は、
一度 TBitmap のインスタンスに写し取ってから、その Canvas を使って加工する
ということです。他のグラフィックソフトでも同じですが、Jpeg 画像は、加工を
繰り返すと、非可逆圧縮のためだんだんと画質が劣化します。
ツイート | ![]() |