掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
Imageに読み込んだ画像の透明度を変化させるには? (ID:44881)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
私もdeldelさんと同じく「透明とは?」と思ったので、まずはツッコミから。 >ボタンを押すたびに透明度が減って半透明のようになっていき、 これ、「透明度が高くなって」ですよね。 >最終的には完全に透明になって見えなくなる 言葉のアヤもあると思うんですが、「完全に透過して背景色/背景画像だけが見えるようになる」とか、 「背景に溶け込んでいき、ついには背景しか見えなくなる」かと。これ結構重要なので…失礼しました。 こういった処理は一般にアルファブレンディング(アルファブレンド)と呼ばれています。 今回作ったサンプルでは、その名もAlphaBlendという、古くWindows98時代から存在する標準的なAPIを 使いましたが、この他にも様々なライブラリ等でアルファブレンドが利用できます。 例:GDI+、buinGL(TABitmap)、OpenCV、DelphiX(DirectX)など …らしい。 ※ちょうどdeldelさんが挙げてくれたAsuyuさんのHP、私も以前にそこを見てAlphaBlendを習いました。 下記サンプルは背景色を指定した上で透明度を上げ下げ出来るようにしたので、色々試してみてください。 type TForm1 = class(TForm) Button1: TButton; Button2: TButton; OpenPictureDialog1: TOpenPictureDialog; ColorDialog1: TColorDialog; Button3: TButton; Button4: TButton; Image1: TImage; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Button4Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); private { Private 宣言 } FBmp: TBitmap; FAlpha: Integer; procedure AlphaBlendDraw(); public { Public 宣言 } end; var Form1: TForm1; implementation {$R *.dfm} uses Jpeg; // ・GIFImg の追加でGIFファイルが読める(Delphi2007から標準で搭載) // ・PNGImage の追加でPNGファイルが読める(Delphi2009から標準で搭載) // ・何も追加せずともTIFFファイルが読める(Delphi2010から) // 参考: TImage にイロイロな画像を読み込む - DEKOのアヤシいお部屋。 // http://ht-deko.minim.ne.jp/tech054.html procedure TForm1.FormCreate(Sender: TObject); begin FBmp:=TBitmap.Create; end; procedure TForm1.FormDestroy(Sender: TObject); begin FBmp.Free; end; // 参考: AlphaBlend解説 - Delphi de Win32API - Asuyu Homepage // http://www.geocities.jp/asumaroyuumaro/program/winapi/bitmap/alphablend.html procedure TForm1.AlphaBlendDraw(); var BF: TBlendFunction; begin if FAlpha<0 then FAlpha:=0; // 透明度を 0〜255 の範囲におさめる if FAlpha>255 then FAlpha:=255; // Image1.Canvas.Brush.Color:=ColorDialog1.Color; // 書き込み先であるImage1を、 Image1.Canvas.FillRect(Image1.Canvas.ClipRect); // 背景色で塗りつぶしておく BF.BlendOp:= AC_SRC_OVER; BF.BlendFlags:= 0; BF.SourceConstantAlpha:= FAlpha; //透過度 (255→0 透明度大) BF.AlphaFormat:= 0; // 背景色が塗ってあるImage1に、透明度を変化させた画像をかぶせる、というイメージ? Windows.AlphaBlend(Image1.Canvas.Handle, 0, 0, FBmp.Width, FBmp.Height, FBmp.Canvas.Handle, 0, 0, FBmp.Width, FBmp.Height, BF); Self.Caption:=Format('透明度: %d', [FAlpha]); end; procedure TForm1.Button1Click(Sender: TObject); begin if OpenPictureDialog1.Execute then begin // 画像ファイルを指定 Image1.Picture.LoadFromFile(OpenPictureDialog1.FileName); FBmp.Assign(Image1.Picture.Graphic); // 読み込んだ画像をTBitmapにコピー、保持しておく Image1.Picture.Assign(nil); // Image1.Pictureが保持した画像形式をリセット(BMP以外はCanvasをいじれない) FAlpha:=255; // 透明度を255にリセット AlphaBlendDraw(); // とりあえず普通に描画 end; end; procedure TForm1.Button2Click(Sender: TObject); begin if ColorDialog1.Execute then AlphaBlendDraw(); // 背景色を指定、それで再描画 end; procedure TForm1.Button3Click(Sender: TObject); begin Dec(FAlpha, 25); // 透明度を上げる AlphaBlendDraw(); end; procedure TForm1.Button4Click(Sender: TObject); begin Inc(FAlpha, 25); // 透明度を下げる AlphaBlendDraw(); end;
←解決時は質問者本人がここをチェックしてください。
更新する
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.