AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi JPEG resizen und nur Probleme
Thema durchsuchen
Ansicht
Themen-Optionen

JPEG resizen und nur Probleme

Ein Thema von alcaeus · begonnen am 15. Jul 2005 · letzter Beitrag vom 15. Jul 2005
Antwort Antwort
Benutzerbild von alcaeus
alcaeus

Registriert seit: 11. Aug 2003
Ort: München
6.537 Beiträge
 
#1

JPEG resizen und nur Probleme

  Alt 15. Jul 2005, 11:58
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]) = '.jpgthen
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]) = '.bmpthen
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
Andreas B.
Die Mutter der Dummen ist immer schwanger.
Ein Portal für Informatik-Studenten: www.infler.de
  Mit Zitat antworten Zitat
Benutzerbild von Flocke
Flocke

Registriert seit: 9. Jun 2005
Ort: Unna
1.172 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#2

Re: JPEG resizen und nur Probleme

  Alt 15. Jul 2005, 12:38
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...
Volker
  Mit Zitat antworten Zitat
Benutzerbild von alcaeus
alcaeus

Registriert seit: 11. Aug 2003
Ort: München
6.537 Beiträge
 
#3

Re: JPEG resizen und nur Probleme

  Alt 15. Jul 2005, 12:42
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 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 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
Schonmal vielen Dank fuer die Hilfe.

Greetz
alcaeus
Andreas B.
Die Mutter der Dummen ist immer schwanger.
Ein Portal für Informatik-Studenten: www.infler.de
  Mit Zitat antworten Zitat
Benutzerbild von Flocke
Flocke

Registriert seit: 9. Jun 2005
Ort: Unna
1.172 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#4

Re: JPEG resizen und nur Probleme

  Alt 15. Jul 2005, 12:52
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;
Volker
  Mit Zitat antworten Zitat
Benutzerbild von alcaeus
alcaeus

Registriert seit: 11. Aug 2003
Ort: München
6.537 Beiträge
 
#5

Re: JPEG resizen und nur Probleme

  Alt 15. Jul 2005, 13:00
Das funktioniert perfekt, danke

Greetz
alcaeus
Andreas B.
Die Mutter der Dummen ist immer schwanger.
Ein Portal für Informatik-Studenten: www.infler.de
  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 23:31 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