Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi JPEG/GIF vergrößern oder verkleinern (https://www.delphipraxis.net/70176-jpeg-gif-vergroessern-oder-verkleinern.html)

CalganX 26. Mai 2006 11:05


JPEG/GIF vergrößern oder verkleinern
 
Hi,
ich habe mir diesen Code aus der Code-Library genommen und versucht bei mir in ein Programm einzubauen. Hab es nur ein wenig verändert, so dass es jetzt so aussieht:
Delphi-Quellcode:
procedure ResizeImage(newWidth, newHeight: integer; Image: TImage; var DestBitmap: TBitmap);
begin
  SetStretchBltMode(DestBitmap.Canvas.Handle, Halftone);
  StretchBlt(DestBitmap.Canvas.Handle, 0, 0, newWidth, newHeight, Image.Canvas.Handle,
    0, 0, Image.Width, Image.Height, SRCCOPY);
  DestBitmap.Width := newWidth;
  DestBitmap.Height := newHeight;
end;
Wenn ich Bitmaps in meinem TImage habe, ist das auch kein Problem und es funktioniert alles tadellos. Wenn ich aber nun JPEGs oder GIFs (entsprechende Units sind überall entsprechend eingebunden), bekomme ich folgende Fehlermeldung:
Code:
---------------------------
BitmapTester
---------------------------
Bild kann nur geändert werden, wenn es ein Bitmap enthält.
---------------------------
OK  
---------------------------
In einem anderen Thread habe ich schon gelesen, dass es daran liegt, dass das Image keine Canvas-Zeichenfläche mehr hat, wenn ich keine Bitmaps geladen habe. Aber wie kann ich dann ein korrektes HDC an die StretchBlt-Methode weitergeben?

Hat das jemand schon probiert oder auch so spontan einen Vorschlag?

Chris

turboPASCAL 27. Mai 2006 11:17

Re: JPEG/GIF vergrößern oder verkleinern
 
Zitat:

Zitat von Chakotay1308
Hat das jemand schon probiert oder auch so spontan einen Vorschlag?

Ja.

:mrgreen:



Delphi-Quellcode:
procedure ResizeImage(newWidth, newHeight: integer; Image: TImage);
begin
  Image.Canvas.StretchDraw(Rect(0,0,newWidth,newHeight), Image.Picture.Graphic);
  Image.Picture.Graphic.Width := newWidth;
  Image.Picture.Graphic.Height := newHeight;
end;
Delphi-Quellcode:
// The Test Sample
procedure TForm1.Button1Click(Sender: TObject);
begin
  ResizeImage(image1.picture.Width div 2 , image1.picture.Height div 2, image1);
end;
Halt! Stopp, das geht so nicht. (nur mit Bitmaps zum verkleinern)

himitsu 27. Mai 2006 11:27

Re: JPEG/GIF vergrößern oder verkleinern
 
Zitat:

Zitat von turboPASCAL
Ja. :mrgreen:

Delphi-Quellcode:
procedure ResizeImage(newWidth, newHeight: integer; Image: TImage);
begin
  Image.Canvas.StretchDraw(Rect(0,0,newWidth,newHeight), Image.Picture.Graphic);
  Image.Picture.Graphic.Width := newWidth;
  Image.Picture.Graphic.Height := newHeight;
end;

nein, denn das stimmt nur für's Verkleinern :warn:

Das wäre dann nur für's Vergrößern:
Delphi-Quellcode:
procedure ResizeImage(newWidth, newHeight: integer; Image: TImage);
begin
  Image.Picture.Graphic.Width := newWidth;
  Image.Picture.Graphic.Height := newHeight;
  Image.Canvas.StretchDraw(Rect(0,0,newWidth,newHeight), Image.Picture.Graphic);
end;
Es muß im Bild halt immer das größte Maß eingestllt werden:
Delphi-Quellcode:
procedure ResizeImage(newWidth, newHeight: integer; Image: TImage);
begin
  If Image.Picture.Graphic.Width < newWidth Then
    Image.Picture.Graphic.Width := newWidth;
  If Image.Picture.Graphic.Height < newHeight Then
    Image.Picture.Graphic.Height := newHeight;
  Image.Canvas.StretchDraw(Rect(0,0,newWidth,newHeight), Image.Picture.Graphic);
  If Image.Picture.Graphic.Width > newWidth Then
    Image.Picture.Graphic.Width := newWidth;
  If Image.Picture.Graphic.Height > newHeight Then
    Image.Picture.Graphic.Height := newHeight;
end;
Das geht och, da .Width/.Height intern och nochma abfragen (sollten) ob wirklich geändert wird:
Delphi-Quellcode:
procedure ResizeImage(newWidth, newHeight: integer; Image: TImage);
begin
  If Image.Picture.Graphic.Width < newWidth Then
    Image.Picture.Graphic.Width := newWidth;
  If Image.Picture.Graphic.Height < newHeight Then
    Image.Picture.Graphic.Height := newHeight;
  Image.Canvas.StretchDraw(Rect(0,0,newWidth,newHeight), Image.Picture.Graphic);
  Image.Picture.Graphic.Width := newWidth;
  Image.Picture.Graphic.Height := newHeight;
end;
Oder halt so:
Delphi-Quellcode:
procedure ResizeImage(newWidth, newHeight: integer; Image: TImage);
begin
  Image.Picture.Graphic.Width := Max(Image.Picture.Graphic.Width, newWidth);
  Image.Picture.Graphic.Height := Max(Image.Picture.Graphic.Height, newHeight);
  Image.Canvas.StretchDraw(Rect(0,0,newWidth,newHeight), Image.Picture.Graphic);
  Image.Picture.Graphic.Width := newWidth;
  Image.Picture.Graphic.Height := newHeight;
end;

CalganX 27. Mai 2006 11:37

Re: JPEG/GIF vergrößern oder verkleinern
 
Hi,
danke euch beiden. Ich probiere das mal aus.
@himitsu: Allerdings frage ich mich jetzt, ob ich überhaupt nocht vergrößeren kann... :gruebel:

Chris

himitsu 27. Mai 2006 12:01

Re: JPEG/GIF vergrößern oder verkleinern
 
Ja, kannst du ... beim Vergößern muß halt nur vorher das Bild größer gemacht werden, denn irgendwo muß es ja hingemalt werden ... die letzten Beispiele stimmen schon in beiden Richtungen :zwinker:

CalganX 27. Mai 2006 13:13

Re: JPEG/GIF vergrößern oder verkleinern
 
Hi,
stimmt. Funktioniert auch soweit. Danke. :)

Kann man irgendwas an der Qualität machen? Die ist nämlich ein wenig grausam... also zumindest was die Kantenglättung angeht. :?

Chris

himitsu 29. Mai 2006 11:50

Re: JPEG/GIF vergrößern oder verkleinern
 
Irgendwie ist das möglich (hab mir nur nicht gemerkt wir ._.) ... versuchmal bei SetStretchBltMode etwas zu machen, eventuell gibt's ja 'nen anderen(besseren) Mode :gruebel:

Ansonsten mal im Forum suchen, ich glaub hier wurd bestimmt schon ein-/zweimal danach gefragt. :stupid:

CalganX 29. Mai 2006 14:29

Re: JPEG/GIF vergrößern oder verkleinern
 
Hi,
ich habe das Ganze jetzt anders gemacht. turboPASCAL hat mich auf diesen Source aufmerksam gemacht. Der ist schön und taugt was (scheinbar). :)

Trotzdem danke für deine Hilfe. ;)
Chris

DGL-luke 29. Mai 2006 14:56

Re: JPEG/GIF vergrößern oder verkleinern
 
Standardantwort: GR32

Die Stretchfilter sind edelst, sag ich bloß.


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