画像を左右反転して表示させるには


たつめ  2005-05-05 09:59:38  No: 14633

ゲームキャラを表示させたいのですが
imageListやimageコンポーネントなどにDrawメソッドで画像を描画してますが、左右逆向きに表示させる方法がわかりません。


通りすがり  2005-05-05 10:34:45  No: 14634

例えば、Image1, Image2 : TImage;  だとして、Image1に反転させたい画像があったとすると、、、
 var
   dest,src : TRect;
begin
  src := Rect(0,0,Image1.Width,Image1.Height);
  dest := Rect(Image1.Width,0,0,Image1.Height);

  Image1.Picture.Bitmap.Canvas.CopyRect(dest,Image1.Picture.Bitmap.Canvas,src);
end;

てすれば左右反転が出来ます。同じ原理で上下反転とかも、、、


補足&訂正  2005-05-05 10:37:14  No: 14635

var
   dest,src : TRect;
begin
  src := Rect(0,0,Image1.Width,Image1.Height);
  dest := Rect(Image1.Width,0,0,Image1.Height);

  Image2.Picture.Bitmap.Canvas.CopyRect(dest,Image1.Picture.Bitmap.Canvas,src);
end;

最後の行です。描画先はIamge2です。別にIamge1に上書きしても構いませんが、、
それと、Imageにはビットマップオブジェクトとかが読み込まれていないと、Bitmap.Canvasには書き込めません。


たつめ  2005-05-06 08:01:48  No: 14636

ありがとうございます。たつめです
imageListにキャラの一連の絵が入ってるのですが
ImageList1.GetBitmap(0,Image1) ;として取り出してから反転して表示させるのがいいですか?
それと、取り出して表示させると
ImageList1のDrawingStyleをTransparentにして回りを透明にしてたのですが、その効果がなくなってしまうので、
ImageList2を作って格納するやり方で大丈夫でしょうか?


通りすがり  2005-05-06 08:58:30  No: 14637

>IamgeList1.GetBitmap(0,Image1);
このImage1ってTImageですか?もしTImageであるなら、Image1.Picture.Bitmapとかでは?
TBitmapなら、これで構いません。

>取り出してから反転して...
どうするにも、一旦は、Bitmapオブジェクトに取り出さなきゃ反転できないと思います。表示してから反転させるくらいなら、TBitmapに取り出して、そこで反転した後、表示させた方がいいとは思います。

>ImageList1のDrawingStyleをTransparent...
私、ImageListのDrawingStyleってあんまよく分からないのですが、周りを透明にしたければ、、、、
例えば、Bitmapに一旦取り出す場合、
 var
   bmp : TBitmap;
begin
  bmp := TBitmap.Create;
  try
    ImageList1.GetBitmap(0,bmp);
    bmp.Transparent := true;
    〜〜〜
  finally
    bmp.Free;
  end;
end;

で、透過させられると思いますが、、、ただ、左下の部分を色を透過させるとかなんとかっていいますから、反転させてから透過するか、反転前に透過させるかでもしかすると違う部分が透過するかもしれません。


たつめ  2005-05-06 23:02:16  No: 14638

ありがとうございます。たつめです
>IamgeList1.GetBitmap(0,Image1);
IamgeList1.GetBitmap(0,Bitmap1);の間違いでしたすみません

http://www.geocities.co.jp/SiliconValley/1367/drawspeed.html
↑のページみてTimageコンポーネントよりTPaintBoxコンポーネントに描画させるようにしてるのですが、
>bmp.Transparent := true;
としてもいろいろやってみたのですが、透過されません。

今までは次のようにしてキャラのまわりの画像を透過させてました

ImageList1.DrawingStyle:=dsTransparent;
ImageList1.Draw(Bitmap1.Canvas,0,0,0);
注)Bitmap1は裏画面
PaintBox1.Canvas.CopyRect(Rect(0,0,640,480),Bitmap1.Canvas ,Bitmap1.Canvas.ClipRect);
注)PaintBox1が表画面


通りすがり  2005-05-07 06:09:02  No: 14639

ImageList1.DrawingStyle = dsTransparent;
になってる状態のでも、透過できましたが、、、
どこで、bmp.Transparent := true;
を発行したんでしょうか?

多分、bmp.Transparent := true; を発行した時点で、ビットマップキャンバスの左下の部分にあたる色が透過色に設定されるんだと思います。

私にはどのような画像を扱っているのか分からないので何ともいえないのですが、もし透過させたい色が既に分かっているのであれば、 TransparentColorを設定すると言う手もあるのではないでしょうか?

とりあえずは、Transparent := true;を発行するタイミングの問題だと思います


たつめ  2005-05-07 07:11:34  No: 14640

ありがとうございます。たつめです。

TImageList,TButton,TPaintBoxコンポーネントを貼り付けて
a.bmp,c.bmp使用して

次のようにしましたが、ImageList.Add(u_bitmap2,u_bitmap2)の第2パラメーターに反転したマスクをしてするとなぜか有色の部分が黒色で塗りつぶされてしまいます。マスクに反転した画像を指定しなかった場合は大丈夫でした。どうしてでしょうか?

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls, ImgList;

type
  TForm1 = class(TForm)
    PaintBox1: TPaintBox;
    Button1: TButton;
    ImageList1: TImageList;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private 宣言 }
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;
  Bitmap1,u_Bitmap2,Bitmap2:TBitmap;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);

begin
Bitmap1:=TBitmap.Create;
Bitmap1.PixelFormat:=pf32bit;
Bitmap1.LoadFromFile('../a.bmp');

Bitmap2:=TBitmap.Create;
Bitmap2.Transparent:=true;
Bitmap2.PixelFormat:=pf32bit;
Bitmap2.LoadFromFile('../c.bmp');
ImageList1.GetBitmap(0,Bitmap2);

u_Bitmap2:=TBitmap.Create;
u_Bitmap2.Transparent:=true;
u_BItmap2.Width:=100;
u_Bitmap2.Height:=100;
u_Bitmap2.Canvas.CopyRect(RECT(100,0,0,100),Bitmap2.Canvas,RECT(0,0,100,100));

ImageList1.Add(u_bitmap2,u_bitmap2);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
//PaintBox1.Canvas.Draw(0,0,Bitmap2);
ImageList1.Draw(PaintBox1.Canvas,0,0,1);
end;

end.


たつめ  2005-05-07 07:15:17  No: 14641

追加です。
新しくソースを作って書いたら
bmp.Transparent:=true;のほうはうまくいきました;。すみません。


たつめ  2005-05-07 07:17:24  No: 14642

追加です。
環境はdelphi6personal,7professionalでwindowsXPHomeEditionで試しました


通りすがり  2005-05-09 07:32:14  No: 14643

>マスクに反転した画像を指定しなかった場合は大丈夫でした。どうしてでしょうか?
どうしてかは知りません。そもそも、Mask画像って何に使うの?って突っ込み入れたいくらいにMask画像なんて使ったこともないし、プロパティをイヂったこともありません。
そもそもMask画像を使う必要があるのですか?と問いたい。反転,透過ときたらMaskかって、、、、
Mask画像を使う必要がないなら、第2引数を指定しなければいいわけだし、、、ImageListのImageTypeをitImageにしておけば黒くはなりませんね。。。
別に質問たてた方がいいのでは?


Tomonori  URL  2005-05-16 04:41:18  No: 14644

私はレタッチソフトを作ってみてるのですが
普段はTImageしか使わず、TImageListの方はよく知りません。
ただマスク関係の構造が同じならMaskを使うならTBitmap.Maskメソッドを使うなどして
2bitに変換しておかないといけないのではないでしょうか?

あと上のソースですが、画像をLoadFromFileで読み込んだあとに
TBitmapのPixelFormatを変更しないとpf32Bitは反映されません。
マスク画像の方は変換すれば必要ないでしょうが。

>そもそもMask画像を使う必要があるのですか?と問いたい。

レタッチソフトだとフルカラーで不定形に切り抜いた場合など、
透過色指定で抜くと必要なピクセルまで抜けてしまう可能性もあるので
マスクは不可欠なのですが、ゲームキャラの表示のように
使用色が限られていればマスク指定の必要はないと思います。


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

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






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