Helligkeit von Bitmaps ändern

Für Probleme bezüglich Grafik, Audio, GL, ACS, ...
Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: Helligkeit von Bitmaps ändern

Beitrag von Michl »

@Theo: Da dies wieder ein gutes Bsp. ist und ich immer nicht verstehe, warum ich immer wieder Probleme mit dem "Canvas" habe, kannst du mir das evtl. einmal erklären oder mir einen guten Link mit einer entsprechenden Erklärung geben?!

also:

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
begin
  Brightness(Image2.Picture.Bitmap, Image1.Picture.Bitmap, 50)//dein Aufruf deiner Procedure
end;
das funktioniert!

das:

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
var
  Bitmap:TBitmap;
begin
  Bitmap:=TBitmap.Create;
  try
    Brightness(Image2.Picture.Bitmap, Bitmap, 50);
    Image1.Canvas.StretchDraw(rect(0,0,Image1.Width,Image1.Height), Bitmap);
  finally
    Bitmap.Free;
  end;
end;
geht nicht!

Zwischenspeichern im Stream (Rastern des Bitmaps):

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
var
  Bitmap:TBitmap;
  Stream:TMemoryStream;
begin
  Bitmap:=TBitmap.Create;
  Stream:=TMemorystream.Create;
  try
    Brightness(Image2.Picture.Bitmap, Bitmap, 50);
    Bitmap.SaveToStream(Stream);
    Stream.Position:=0;
    Bitmap.LoadFromStream(Stream);
    Image1.Canvas.StretchDraw(rect(0,0,Image1.Width,Image1.Height), Bitmap);
  finally
    Stream.Free;
    Bitmap.Free;
  end;
end;
das geht auch wieder!

Warum das erste Vorgehen funktioniert, stelle ich mir so vor: Das alte Bitmap wird durch das neue Bitmap direkt (Zuweisung der Pointer) ersetzt. Die Dimensionen von Image1 werden dadurch vom neuen Bitmap übernommen! Die Speicherstelle vom Canvas vom Image1 bleibt erhalten (habe ich getestet, in dem ich auf das Canvas zeichnen lassen habe, die Dimensionen des Canvas entsprechen noch dem vom vorherigen Bitmap).

Evtl. gibt es beim zweiten Bsp. Probleme, da das Canvas vom Bitmap nicht mehr zu den Bilddaten des Bitmaps passt??? "Image1.Picture.Bitmap.Assign(Bitmap);" funktioniert wieder (logisch, da wieder direkte Zuweisung des Bitmappointers)!

Das dritte Bsp. funktioniert deswegen wieder, da bei "SaveToStream" das Bitmap gerastert wird und das Canvas wieder neu instanziiert wird?!

Mir geht es nicht darum, einen Workaround zu bekommen bzw. deine Procedure so umzuändern, dass es auch mit dem "Bitmap" funktioniert, das bekomme ich hin. Ich verstehe hauptsächlich nicht, warum das Canvas dann stehenbleibt bzw. wie man das Canvas dann entsprechend mit anpasst (Canvas.clear hatte nur marginale Erfolge, Neusetzen der Bitmap-Dimensionen ebenso...)!

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: Helligkeit von Bitmaps ändern

Beitrag von theo »

Weiss ich auch nicht. LCL Graphics ist manchmal etwas undurchsichtig. :roll:

EDIT: Ersetze mal in procedure Brightness

Code: Alles auswählen

//  TempIntfImg.DataDescription := GetDescriptionFromDevice(0);
//  TempIntfImg.SetSize(SrcIntfImg.Width,SrcIntfImg.Height);
TempIntfImg.LoadFromBitmap(SourceBitmap.Handle, SourceBitmap.MaskHandle);


Aber frag mich nicht warum...

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: Helligkeit von Bitmaps ändern

Beitrag von Michl »

theo hat geschrieben:Aber frag mich nicht warum...
Schade :( !

Habe auch noch

Code: Alles auswählen

TempIntfImg:=SourceBitmap.CreateIntfImage;
probiert, das geht auch ohne Probleme...

Trotzdem Danke fürs antesten! Wollt halt noch etwas dazu lernen, naja das nächste Mal?!

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

Antworten