Hallo ihr,
ich arbeite zur Zeit an einer Slideshow fuer Bilder, und muss dabei ein Paar Bilder resizen. Zuerst habe ich mit StretchBlt gearbeitet, allerdings zeigt dies beim Resizen von JPEGs gewaltige Probleme. Mit TCanvas.StretchDraw funktioniert es hingegen einwandfrei.
Doch das naechste Problem kommt: Das Programm ladet fuer jeden Monitor ein Bild in den Speicher, und zeichnet es dann auf die Paintbox fuer den jeweiligen Bildschirm. Mit StretchBlt ist dies wiederum kein Problem, mit StretchDraw ist auf beiden Bildschirmen das gleiche zu sehn. Hier mal ein bisschen Code:
Delphi-Quellcode:
if ExtractFileExt(Self.FileList[NewImage]) = '.jpg' then
begin
Loaded := True;
TempJPG.LoadFromFile(Self.FileList[NewImage]);
TempBMP.Assign(TempJPG);
end //if ExtractFileExt(Self.FileList[NewImage]) = '.jpg' then
else if ExtractFileExt(Self.FileList[NewImage]) = '.bmp' then
begin
Loaded := True;
TempBMP.LoadFromFile(Self.FileList[NewImage]);
end; //else if ExtractFileExt(Self.FileList[NewImage]) = '.bmp' then
PaintBoxList[1][iIndex].Tag := NewImage;
OldWidth := TempBMP.Width;
OldHeight := TempBMP.Height;
ScaleFactor := PaintBoxList[0][iIndex].Width / OldWidth;
if OldHeight * ScaleFactor > PaintBoxList[0][iIndex].Height then
begin
ScaleFactor := PaintBoxList[0][iIndex].Height / OldHeight;
end; //if OldHeight * ScaleFactor > PaintBoxList[0][i].Height then
//Prevent pictures from being "blown up"
if ScaleFactor > 1 then
ScaleFactor := 1;
NewWidth := Round(ScaleFactor * OldWidth);
NewHeight := Round(ScaleFactor * OldHeight);
PicLeft := (PaintBoxList[0][iIndex].Width - NewWidth) div 2;
PicTop := (PaintBoxList[0][iIndex].Height - NewHeight) div 2;
//Image is now loaded, let's stretchdraw it onto the paintbox
PaintBoxList[1][iIndex].Canvas.Brush.Color := clBlack;
PaintBoxList[1][iIndex].Canvas.FillRect(PaintBoxList[1][iIndex].ClientRect);
//PaintBoxList[1][iIndex].Canvas.StretchDraw(Rect(PicLeft, PicTop, PicLeft+NewWidth, PicTop+NewHeight), TempBMP);
StretchBlt(PaintBoxList[1][iIndex].Canvas.Handle, PicLeft, PicTop, NewWidth, NewHeight, TempBMP.Canvas.Handle, 0, 0, OldWidth, OldHeight, SRCCOPY);
PaintBoxList[1][iIndex].Canvas.Font.Color := clRed;
PaintBoxList[1][iIndex].Canvas.Font.Name := 'Tahoma';
PaintBoxList[1][iIndex].Canvas.Font.Size := 24;
PaintBoxList[1][iIndex].Canvas.TextOut(10, 10, IntToStr(PaintBoxList[1][iIndex].Tag)+'; '+ExtractFileName(Self.FileList[NewImage]));
Zur Erklaerung: NewImage ist der Index zum Dateinamen, iIndex ist der Index des Monitors auf dem grad gezeichnet wird. Die Ausgabe ist fuer jeden Monitor richtig, wenn ich nun aber StretchDraw anstatt StretchBlt verwende, so sehe ich auf beiden Monitoren das gleiche Bild, allerdings den Index und Pfad zum richtigen Bild. Weiss jemand, wie ich StretchBlt dazu bringen kann, richtig zu arbeiten, bzw. kann mir jemand sagen, wie ich StretchDraw dazu bringe, das Bild das grad in TempBMP liegt zu verwenden, und nicht sonstwas? Ich kann den Fehler beim besten Willen nicht erkennen
Greetz
alcaeus