2017-10-11 3 views
0

Bild ist BMP mit olivgrüner transparenter Farbe.Wie kann man das transparente Bild in graphisc32 richtig skalieren?

type 
    TForm1 = class(TForm) 
    ImageList: TImageList; // 
    MainMenu: TMainMenu; //Standart parameters 
    MenuItem: TMenuItem; // 
    procedure FormCreate(Sender: TObject); 
... 
function ScaleImage(aImage: TBitmap): TBitmap; 
var 
    Src, Dst: TBitmap32; 
    R: TKernelResampler;  
begin 
    Src := TBitmap32.Create; 
    Src.SetSize(16, 16); 
    Src.DrawMode := dmTransparent; 
    Src.OuterColor := clOlive; 
    Src.Assign(aImage); 
    Dst := TBitmap32.Create; 
    Dst.SetSize(24,24); 
    R := TKernelResampler.Create(Src); 
    R.Kernel := TLanczosKernel.Create; 
    Dst.DrawMode := dmTransparent; 
    Dst.OuterColor := clOlive; 
    Dst.Draw(Dst.BoundsRect, Src.BoundsRect, Src); 
    Result.Assign(Dst); 
end; 

procedure AddImage; 
var 
    Image: TBitmap; 
begin 
    Image := TBitmap.Create; 
    Image.LoadFromResourceName(hInstance, 'BMPNOFILTER'); 
    ImageList.AddMasked(ScaleImage(Image), clOlive);  
end; 

procedure TForm1.FormCreate(Sender: TObject); 
begin 
    AddImage; 
    MainMenu.Images := ImageList; 
    MenuItem.ImageIndex := 0; 
end; 

Nach diesem Ergebnis TBitmap zu Abbildungsliste TImageList mit Imagelist.AddMasked(Result, clOlive); aber Bild ist mit Oliven Farbe gezeichnet. Versuchen, Größe des Bildes ohne Olive Farbe (aImage.transparent := True;), nach Zuordnung Src Hintergrund werden schwarz und verwenden Sie es als transparente Farbe, OuterColor Wert zu ignorieren.

Tryed ClOlive32 als OuterColor. Ergebnis:

-Code i verwendet:

var 
R: TKernelResampler; 
Src, Dst: TBitmap32; 
fImage: TBitmap; 
OriginalImage, TranOriginalImage: TImage //16x16 
SrcImage, DstImage, ResultImage: TImage //24x24 
... 
fImage := TBitmap.Create; 
fImage.LoadFromResourceName(hInstance, 'BMPNOFILTER'); 
OriginalImage.Picture.Bitmap := fImage; 
fImage.Transparent := True; 
fImage.TransparentColor := clOlive; 
TranOriginalImage.Picture.Bitmap := fImage; 
TranOriginalImage.Transparent := True; 
Src := TBitmap32.Create; 
Src.SetSize(16, 16); 
Src.OuterColor := clOlive32; 
Src.Assign(fImage); 
Src.DrawMode := dmTransparent; 
Src.OuterColor := clOlive32; 
SrcImage.Picture.Bitmap.Assign(Src); 
Dst := TBitmap32.Create; 
Dst.SetSize(24, 24); 
Dst.DrawMode := dmTransparent; 
Dst.OuterColor := clOlive32; 
R := TKernelResampler.Create(Src); 
R.Kernel := TLanczosKernel.Create; 
Dst.Draw(Dst.BoundsRect, Src.BoundsRect, Src); 
DstImage.Picture.Bitmap.Assign(Dst); 
ResultImage.Picture.Bitmap.Assign(Dst); 
ResultImage.Transparent := True; 
+0

Können Sie bitte echten Code zeigen? Wir können zum Beispiel nicht sagen, ob Src, Dst, aImage Parameter, Globals, Locals oder Objektmitglieder sind. Bitte geben Sie uns ein kleines, kompilierbares Programm, das Ihr Problem zeigt. – Dsm

+0

Ich habe den Code aktualisiert. – Andrey

+0

Kann [diese Frage] (https://stackoverflow.com/a/32269633/5043424) Ihnen helfen? –

Antwort

0

Sie sollten die Graphics32 Pendant zum Olivfarbe verwenden. Dies ist clOlive32 anstelle von clOlive. Zusammen mit dem Hinzufügen

aImage.transparent := True; 

sollte dies mehr oder weniger tun.

Schließlich werden Sie ein paar Glitches sehen, da der Resampler Rot möglicherweise nicht rot erhält, sondern ein tatsächliches Resampling verwendet, um Farben zwischen den Kanten zu erhalten.

+0

Setzen Sie clOlive32 auf 'Src.OuterColor' und' Dst.OuterColor', setzen Sie 'Image.Transparent: = True' vor' Src.Assign (aImage) '. Ich werde neues Ergebnis im Hauptpost hinzufügen. – Andrey

+0

Bild mit Ergebnis zum Hauptpost hinzugefügt. Ich denke, das Problem liegt im Pixelformat des Originalbildes. Nach dem Laden seines Wertes pf4bit. Versucht, Originalbild in pf32bit zu speichern und alle Bilder hatten olivenfarbenen Hintergrund. – Andrey

Verwandte Themen