Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi JPEG resizen und nur Probleme (https://www.delphipraxis.net/49748-jpeg-resizen-und-nur-probleme.html)

alcaeus 15. Jul 2005 10:58


JPEG resizen und nur Probleme
 
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

Flocke 15. Jul 2005 11:38

Re: JPEG resizen und nur Probleme
 
Ist es Absicht, dass du mal PaintBoxList[0][iIndex] und mal PaintBoxList[1][iIndex] benutzt, oder sind die immer gleich groß?

Wie klappt das StretchBlt bei Jpegs denn nicht?

Ansonsten, wenn TmpJPG und TmpBMP globale Variablen sind, vielleicht mal als lokale ausprobieren.

Sonst seh' ich in den Zeilen nichts auffälliges...

alcaeus 15. Jul 2005 11:42

Re: JPEG resizen und nur Probleme
 
Zitat:

Zitat von Flocke
Ist es Absicht, dass du mal PaintBoxList[0][iIndex] und mal PaintBoxList[1][iIndex] benutzt, oder sind die immer gleich groß?

Jup, ist Absicht. Sie sind eigentlich gleich gross, wobei PaintBoxList[1] z.Zt. noch als Offscreen-Bitmap dient. Dies werd ich aber umbauen und mit Visible arbeiten.

Zitat:

Zitat von Flocke
Wie klappt das StretchBlt bei Jpegs denn nicht?

Die groesse passt, aber die Farben usw. passen ueberhaupt nicht. Es sieht so aus als waere ein Raster druebergezogen worden. Mit StretchDraw klappt es hingegen.

Zitat:

Zitat von Flocke
Ansonsten, wenn TmpJPG und TmpBMP globale Variablen sind, vielleicht mal als lokale ausprobieren.

Ich bin dem Problem vorerst aus dem Weg gegangen, indem ich ein Array gemacht habe, allerdings bin ich mir nicht so sicher dass wirklich fuer jeden Monitor 2 Paintboxen, ein Bitmap und ein JPG hier sein sollte :wall:
Schonmal vielen Dank fuer die Hilfe.

Greetz
alcaeus

Flocke 15. Jul 2005 11:52

Re: JPEG resizen und nur Probleme
 
Zitat:

Zitat von alcaeus
Die groesse passt, aber die Farben usw. passen ueberhaupt nicht. Es sieht so aus als waere ein Raster druebergezogen worden. Mit StretchDraw klappt es hingegen.

Hast du mal das ausprobiert für StretchBlt:
Delphi-Quellcode:
with PaintBoxList[1][iIndex].Canvas do
begin
  GetBrushOrgEx(Handle, pt);
  SetStretchBltMode(Handle, HALFTONE);
  SetBrushOrgEx(Handle, pt.x, pt.y, @pt);
  StretchBlt(Handle, PicLeft, PicTop, NewWidth, NewHeight,
             TempBMP.Canvas.Handle, 0, 0, OldWidth, OldHeight, SRCCOPY);
end;

alcaeus 15. Jul 2005 12:00

Re: JPEG resizen und nur Probleme
 
:firejump: Das funktioniert perfekt, danke :)

Greetz
alcaeus


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:04 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