AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Hintergrundfarbe bei StretchBlt
Thema durchsuchen
Ansicht
Themen-Optionen

Hintergrundfarbe bei StretchBlt

Ein Thema von Andifeatable · begonnen am 7. Jul 2010 · letzter Beitrag vom 7. Jul 2010
Antwort Antwort
Andifeatable

Registriert seit: 22. Aug 2006
Ort: Wien
10 Beiträge
 
#1

Hintergrundfarbe bei StretchBlt

  Alt 7. Jul 2010, 11:08
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:
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;
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
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: http://mxs.info/andi/diverse/Foto%20zuschneiden.jpg
Also der schwarze Streifen rechts (=Vorschau ) sollte grau sein...

Hat jemand Ideen oder so?
Bitte, Danke, lg Andi
Oh nein! Hoffentlich hat mein Schaden kein Hirn genommen! (C) Homer Simpson
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.033 Beiträge
 
Delphi 12 Athens
 
#2

AW: Hintergrundfarbe bei StretchBlt

  Alt 7. Jul 2010, 11:20
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;
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu ( 7. Jul 2010 um 11:23 Uhr)
  Mit Zitat antworten Zitat
Andifeatable

Registriert seit: 22. Aug 2006
Ort: Wien
10 Beiträge
 
#3

AW: Hintergrundfarbe bei StretchBlt

  Alt 7. Jul 2010, 11:35
Du meinst direkt vor StretchBlt ein
Delphi-Quellcode:
      Img.Picture.Bitmap.Canvas.Brush.Color := clGray;
      Img.Picture.Bitmap.Canvas.FillRect(img.Picture.Bitmap.Canvas.ClipRect);
Funktioniert leider nicht...offensichtlich übermalt StretchBlt immer das komplette Bild (also die vollen 176x176)...auch wenn das Ursprungsbild kleiner ist
Oh nein! Hoffentlich hat mein Schaden kein Hirn genommen! (C) Homer Simpson
  Mit Zitat antworten Zitat
Andifeatable

Registriert seit: 22. Aug 2006
Ort: Wien
10 Beiträge
 
#4

AW: Hintergrundfarbe bei StretchBlt

  Alt 7. Jul 2010, 12:05

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:
[...]
    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);
[...]
Oh nein! Hoffentlich hat mein Schaden kein Hirn genommen! (C) Homer Simpson
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:08 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz