掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
画像を変形する方法とかありますか? (ID:12737)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
数学はサッパリですが、アフィン変換で台形変形はできるみたいです。 iamge1、image2、buttonn1を貼り付けて、以下のコードで確認しました。 上記のような台形にするにはパラメータを適宜いじらないと駄目ですねぇ useseとtype節に下記 //---------------------------------------------------------- uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, Math; type TRGBTripleArray = array[0 .. High(Integer) div 3 - 1] of RGBTRIPLE; PRGBTripleArray = ^TRGBTripleArray; //配列型のポインタ //------------------------------------------------------------ procedure TForm1.Button1Click(Sender: TObject); var Ps,Pd: PRGBTripleArray; x,y :Integer; R0,G0,B0 :Short; xd,yd,xd2,yd2 : Integer; a,b,c,d,e,f :double; begin a := 0.1; b := 0.7; c := 0.001; d := 0.7; e := 0.1; f := 0.001; //image1にbitmapロード Form1.Image1.Picture.LoadFromFile('花4.bmp'); //image2のプロパティを適当に・・・ Form1.Image2.Picture.Bitmap.PixelFormat := pf24bit; Form1.Image2.Picture.Bitmap.Width := Form1.Image2.Width ; Form1.Image2.Picture.Bitmap.Height := Form1.Image2.Height; for y := 0 to Form1.Image1.Picture.Bitmap.Height-1 do begin //元絵のピクセルRGBを取得 Ps := Form1.Image1.Picture.Bitmap.ScanLine[y]; for x := 0 to Form1.Image1.Picture.Bitmap.Width -1 do begin //元絵のピクセルRGBを取得 R0 := Ps[x].rgbtRed; G0 := Ps[x].rgbtGreen; B0 := Ps[x].rgbtBlue; //アフィン変換(の筈?) xd := round(x*a + y*b + c*x*y); yd := round(x*d + y*e + f*x*y); //添え字の溢れチェック yd := Max(Min(Form1.Image2.Picture.Bitmap.Height-1, yd ), 0); yd2 := Max(Min(Form1.Image2.Picture.Bitmap.Height-1, yd+1), 0); xd := Max(Min(Form1.Image2.Picture.Bitmap.Width -1, xd ), 0); xd2 := Max(Min(Form1.Image2.Picture.Bitmap.Width -1, xd+1), 0); //ちょっと大きめ(合計4ピクセル)に描画。 Pd := Form1.Image2.Picture.Bitmap.ScanLine[yd]; Pd[xd] .rgbtRed := R0; Pd[xd] .rgbtGreen:= G0; Pd[xd] .rgbtBlue := B0; Pd[xd2].rgbtRed := R0; Pd[xd2].rgbtGreen:= G0; Pd[xd2].rgbtBlue := B0; Pd := Form1.Image2.Picture.Bitmap.ScanLine[yd2]; Pd[xd] .rgbtRed := R0; Pd[xd] .rgbtGreen:= G0; Pd[xd] .rgbtBlue := B0; Pd[xd2].rgbtRed := R0; Pd[xd2].rgbtGreen:= G0; Pd[xd2].rgbtBlue := B0; end; end; end;
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.