21

私はちょっとした問題に遭遇しました、それは私だけですか、それとも以下に示すような恐ろしい黒い輪郭なしでリソースからTSpeedButtonのグリフに画像を割り当てることはできませんか?

TImageコンポーネントにもまったく同じ方法で割り当てましたが、必要な結果が得られています。

私はかなり長い間探していましたが、誰もこの奇妙で厄介な問題を抱えているようには見えません。

以下のフォームのソースコードは次のとおりです。

procedure TForm3.Button1Click(Sender: TObject);
var r : tresourcestream; png : tpngimage;
begin
  r := tresourcestream.CreateFromID(hinstance,34,'cardimage');
  png := tpngimage.Create;  
  png.LoadFromStream(r);  
  png.AssignTo(image1.Picture.bitmap);  
  png.AssignTo(speedbutton1.glyph);  
  png.Free;  
  r.Free;  
end;

34は、まだ推測していない場合に画像に表示されている画像に関連するタイプ「cardimage」の画像です。

ここに画像の説明を入力してください

4

1 に答える 1

33

問題は明らかに、左の写真でアルファチャネルが無視されていることです。現在、TSpeedButton.GlyphプロパティはであるTBitmapため、PNGアルファチャネルを保持するのは問題がある可能性があります。例えば、

var
  png: TPNGImage;
begin
  png := TPngImage.Create;
  png.LoadFromFile('C:\Users\Andreas Rejbrand\Pictures\alpha.png');
  SpeedButton1.Glyph.Assign(png); // or png.AssignTo(SpeedButton1.Glyph);

を生成します

部分的な解決策の1つは、PNG画像を事前にブレンドすることです。

var
  png: TPNGImage;
  bm: TBitmap;
begin
  png := TPngImage.Create;
  png.LoadFromFile('C:\Users\Andreas Rejbrand\Pictures\alpha.png');
  bm := TBitmap.Create;
  bm.SetSize(png.Width, png.Height);
  bm.Canvas.Brush.Color := Self.Color;
  bm.Canvas.FillRect(Rect(0, 0, bm.Width, bm.Height));
  bm.Canvas.Draw(0, 0, png);
  SpeedButton1.Glyph.Assign(bm);

于 2011-03-14T23:00:56.567 に答える