![]() |
Hintergrundfarbe bei StretchBlt
Schönen guten Morgen :)
Folgendes Problem: Ich brauch ein Programm mit dem man Passbilder "zuschneiden" kann...so weit funktioniert auch alles! Einzig der Rand bei Fotos die dünner (bzw. breiter) als die Vorlage sind ist ein schwarzer Rand. Schwarz geht leider nicht sondern der Rand sollte grau sein! Ich benutze StretchBlt für das "Ausschneiden" aus dem Originalbild. Hier mal der entsprechende Code (Ich hoffe der is halbwegs lesbar ^^)
Delphi-Quellcode:
Weiss echt nimma weiter...Canvas bemalen vor StretchBlt funktioniert nicht (StretchBlt macht anscheinend automatisch ein schwarzes Bild und befüllt das dann), Canvas bemalen nach StretchBlt is doof weil dann das Bild flöten geht ;)
function TfrmBildMain.StretchJpeg(Open: AnsiString; Img: Timage): Boolean;
var Jpg : TJpegImage; Bmp: TBitmap; OriUrsprung, Ursprung, StartPortrait, EndPortrait: TPoint; Faktor, FaktorX, FaktorY: Real; RectToFill: TRect; Rectlength: integer; begin Result:= false; if FileExists(Open) then begin Jpg := TJpegImage.Create; Bmp:= TBitmap.Create; try Jpg.LoadFromFile(Open); Bmp.PixelFormat:= pf24bit; Bmp.Assign(Jpg); Img.Picture.Bitmap.Width:= Img.Width; Img.Picture.Bitmap.Height:= Img.Height; SetStretchBltMode(Img.Picture.Bitmap.Canvas.Handle, STRETCH_HALFTONE); SetBrushOrgEx(Img.Picture.Bitmap.Canvas.Handle, 0, 0, nil); OriUrsprung.X := imgGesicht.Picture.Width div 2; OriUrsprung.Y := imgGesicht.Picture.Height div 2; Ursprung.X := imgGesicht.Width div 2; Ursprung.Y := imgGesicht.Height div 2; StartPortrait.X := (imgGesicht.ClientOrigin.X + Ursprung.X) - imgSchablone.ClientOrigin.X; StartPortrait.Y := (imgGesicht.ClientOrigin.Y + Ursprung.Y) - imgSchablone.ClientOrigin.Y; EndPortrait.X := (imgSchablone.ClientOrigin.X + imgSchablone.Width) - (imgGesicht.ClientOrigin.X + imgGesicht.Width div 2); EndPortrait.Y := (imgSchablone.ClientOrigin.Y + imgSchablone.Height) - (imgGesicht.ClientOrigin.Y + imgGesicht.Height div 2); FaktorX := imgGesicht.Picture.Width / imgGesicht.Width; FaktorY := imgGesicht.Picture.Height / imgGesicht.Height; if FaktorX > FaktorY then Faktor := FaktorX else Faktor := FaktorY; StretchBlt(Img.Picture.Bitmap.Canvas.Handle, 0, 0, Img.Width, Img.Height, Bmp.Canvas.Handle, // Nicht 0, 0 sondern angaben lt. imgSchablone/imgVorschau (OriUrsprung.X - Round(StartPortrait.X * Faktor)), (OriUrsprung.Y - Round(StartPortrait.Y * Faktor)), // Nicht komplette BMP Höhe/Breite sondern nur Teil! // Immer ein Quadrat 176 x 176... Round(Faktor * 176), Round(Faktor * 176), srccopy); Jpg.Assign(Img.Picture.Bitmap); Jpg.CompressionQuality:= 95; Jpg.Compress; Result:= true; finally Bmp.Free; Jpg.Free; end; end; end; Vor StretchBlt aus "img" ein 177x177 großes graues Bild zu machen und dann wieder kleiner machen funktioniert auch nicht wirklich (qualität ist seltsamerweise dann nicht tragbar), etc. :( Ich hoffe ich hab das Problem halbwegs verständlich erklärt... Hier noch ein Screenshot von dem Programm: ![]() Also der schwarze Streifen rechts (=Vorschau ;) ) sollte grau sein... Hat jemand Ideen oder so? Bitte, Danke, lg Andi :) |
AW: Hintergrundfarbe bei StretchBlt
Male einfach vorher überall in das Zielbild deinen grauen Hintergrund und dann darüber das gestretchte Foto.
PS: am Ende dieses ist eigentlich vollkommen "nutzlos", da du das JPeg ja nicht mehr verwendest und danach sogar gleich löschst/freigibst.
Delphi-Quellcode:
Jpg.CompressionQuality:= 95;
Jpg.Compress; |
AW: Hintergrundfarbe bei StretchBlt
Du meinst direkt vor StretchBlt ein
Delphi-Quellcode:
Funktioniert leider nicht...offensichtlich übermalt StretchBlt immer das komplette Bild (also die vollen 176x176)...auch wenn das Ursprungsbild kleiner ist ;)
Img.Picture.Bitmap.Canvas.Brush.Color := clGray;
Img.Picture.Bitmap.Canvas.FillRect(img.Picture.Bitmap.Canvas.ClipRect); |
AW: Hintergrundfarbe bei StretchBlt
:cheer:
doch geschafft :) Nach dem Zuweisen des Bitmaps wird mal das Img grau ausgemalt und statt STRETCH_HALFTONE wird STRETCH_DELETESCANS verwendet :) Hier der neue Code:
Delphi-Quellcode:
:cheer:
[...]
try Jpg.LoadFromFile(Open); Bmp.PixelFormat:= pf24bit; Bmp.Assign(Jpg); Img.Picture.Bitmap.Width:= Img.Width; Img.Picture.Bitmap.Height:= Img.Height; Img.Picture.Bitmap.Canvas.Brush.Color := clGray; Img.Picture.Bitmap.Canvas.FillRect(img.Picture.Bitmap.Canvas.ClipRect); SetStretchBltMode(Img.Picture.Bitmap.Canvas.Handle, STRETCH_DELETESCANS); // STRETCH_HALFTONE); SetBrushOrgEx(Img.Picture.Bitmap.Canvas.Handle, 0, 0, nil); [...] |
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:09 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz