Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi JPEG "on the Fly" Größe ändern (https://www.delphipraxis.net/79115-jpeg-fly-groesse-aendern.html)

delphipitti 16. Okt 2006 16:56


JPEG "on the Fly" Größe ändern
 
Hallo,

also ich stehe vollkommen auf dem Schlauch. Heute schon den ganzen Vormittag verbracht - aber ich komme zu keinem Ergebnis ...

Ich mach es kurz:

jpeg-Datei liegt vor im Maß 150x300
ich brauche sie aber kurzeitig mit eine Höhe von 130
die Breite soll automatisch angepasst werden

also

Bild in ein Image laden, das proportional=true ist und die Höhe von 130 hat
ist auch ordnungsgemäß sichtbar

jetzt weiß ich nicht mehr weiter :wall:

wen ich es speichere dann ist es wieder in der Normalgröße
wenn ich es in ein anderes Image kopiere auch

Ich hab wie gesagt ne vollkommene Denkblockade - nehmt ruhig ein Stück Holz, schlagt zu und helft mir wieder normal denken zu können ... :spin2:

Viele Grüße, delphipitti

timog 17. Okt 2006 08:51

Re: JPEG "on the Fly" Größe ändern
 
Hi,

such mal im Forum, ist bestimmt schon mal behandelt worden. In kurz: Du musst das Bild kleiner rechnen, z.B. mit der resample.pas. Goggle ist Dein Freund.

Viele Grüße

Timo

Der_Unwissende 17. Okt 2006 09:52

Re: JPEG "on the Fly" Größe ändern
 
Hi,
das Image ist eine Komponente, die sich nur um die Anzeige kümmert. Das was du dort siehst ist nur eine graphische Repräsentation, das eigentliche Bild dahinter (in deinem Fall das JPEG) bekommt nichts davon mit, wie es dargestellt wird (das ist auch gut so!).

Was du ganz einfach machen kannst, umrechnen. Proportional macht intern nichts anders. Du hast ein festes Seitenverhältnis (Höhe / Breite), dass du einfach bei behalten musst. Du musst einfach nur dafür sorgen, dass dieses Verhältnis gleich bleibt, also
OriginalHöhe / OriginalBreite = NeueHöhe / NeueBreite. Davon hast du schon 3 Werte gegeben, die Größe des Originals und deine Zielhöhe, stell es einfach um und du kennst die Breite.

Der Rest ist nur noch setzen von Höhe und Breite auf die neuen Werte (im JPEGImage) und speichern.

Gruß Der Unwissende

delphipitti 26. Okt 2006 09:35

Re: JPEG "on the Fly" Größe ändern
 
Hallo,

erstmal vielen Dank - jetzt hab ich es hinbekommen:

Delphi-Quellcode:
        img1 := TImage.Create(nil);
        Preview := TImage.Create(nil);
        Tempo := TJpegImage.Create;
        Preview.Height := 115;
        try
        img1.Picture.LoadFromFile(ExtractFilePath(Application.ExeName)+'/data/logo.jpg');
        hoehealt:= img1.Picture.Height;
        weitealt:= img1.Picture.Width;
        wneu:=round( (weitealt / hoehealt ) * 115);

        Preview.Width:=wneu;
        Preview.Canvas.StretchDraw(Rect(0,0,Preview.Width, Preview.Height), img1.Picture.Graphic);

        Tempo.Assign(Preview.Picture.Bitmap);
        Tempo.SaveToFile(ExtractFilePath(Application.ExeName)+'/tmp.jpg'); //Muss ich so machen ...
         
        finally
           img1.Free;
           Preview.Free;
           Tempo.Free;
          end;
        except
         Application.MessageBox(PChar('Fehler!'), 'Error', MB_OK or MB_ICONSTOP);
        end;
Nun - jetzt muss ich den JPEG-Export über das Assign in das TJPEG machen, da ich sonst beim direkten speichern aus dem Preview in eine Jpeg-Datei diese später nicht mehr einlesen kann...

Warum passiert dies !? Irgendein JPEG-Fehler ...

Sko 26. Okt 2006 10:31

Re: JPEG "on the Fly" Größe ändern
 
Delphi-Quellcode:
Tempo.Assign(Preview.Picture.Bitmap);
Das Stück Code ist schon die Antwort: Bilder werden (glaub ich) in TImage immer als Bitmap angezeigt.

Der_Unwissende 26. Okt 2006 11:00

Re: JPEG "on the Fly" Größe ändern
 
Nochmal, ein TImage ist eine Komponente, die nur für die Anzeige gedacht ist. Worauf du zugreifst ist ein TPicture, da gibt es dann schon andere Eigenschaften. Da kannst du ja einfach mal in die Hilfe schauen.
An sich solltest du (imho) lieber eine andere Komponente nehmen. TJPEGImage bietet sich eigentlich direkt an. Du kannst dir einfach eine Kopie erzeugen, hier die Größe ändern und die Kopie speichern:

Delphi-Quellcode:
procedure changeSize(const image : TJPEGImage; out resizedImage : TJPEGImage; const newHeight : Integer);
begin
  if assigned(resizedImage) then
  begin
    FreeAndNil(resizedImage);
  end;  

  if assigned(image) then
  begin
    resizedImage := TJPEGImage.Create;
    resizedImage.assign(image);
   
    resizedImage.Height := newHeight;
    resizedImage.Width := round(image.Width * newHeight / image.Height);
  end;
end;
Hier würdest du jetzt das resizedImage zurück bekommen. Das kannst du dann wie jede JPEG speichern oder anzeigen oder was auch immer.

Gruß Der Unwissende

naridian 3. Mär 2007 11:23

Re: JPEG "on the Fly" Größe ändern
 
Bei mir kommt da ne Exception: EInvalidGraficOperation 'Die Größe einer JPEG Grafik kann nicht verändert werden'.

Ich steh total auf dem Schlauch. Was mach ich falsch?

Pfoto 3. Mär 2007 11:36

Re: JPEG "on the Fly" Größe ändern
 
Hi!

schau dir mal das an (in einem Beitrag von User Hador gefunden):

Delphi-Quellcode:
var
  jpg: TJPEGImage;
  bmp: TBitmap;
begin
  jpg := TJPEGImage.Create;
  bmp := TBitmap.Create;
  jpg.LoadFromFile('...');
  bmp.Width := 100; //neue Breite
  bmp.Height := 100; //neue Höhe
  bmp.Canvas.StretchDraw(Rect(0, 0, 100, 100), jpg);
  jpg.Assign(bmp);
  bmp.Free;
  jpg.SaveToFile('...');
  jpg.Free;
end;
Bei Width und Height halt noch die richtige Proportion berechnen...

Wenn du bessere Verkleinerungs-Ergebnisse wünscht, musst
du nach einem anderen Algorhythmus schauen, z.B.:

Komponenten von Anders Melander auf Torry.net
Dann Komponente 'Interpolating Bitmap Resampler v.1.2' wählen.



Gruß
Pfoto

The Riddler 15. Nov 2008 12:30

Re: JPEG "on the Fly" Größe ändern
 
Delphi-Quellcode:
var
  jpg: TJPEGImage;
  bmp: TBitmap;
begin
  jpg := TJPEGImage.Create;
  bmp := TBitmap.Create;
  jpg.LoadFromFile('...');
  bmp.Width := 100; //neue Breite
  bmp.Height := 100; //neue Höhe
  bmp.Canvas.StretchDraw(Rect(0, 0, 100, 100), jpg);
  jpg.Assign(bmp);
  bmp.Free;
  jpg.SaveToFile('...');
  jpg.Free;
end;
Super das klappt, allerdings wird das Bild skaliert (also verkleinert). Ich versuche das Bild zu beschneiden, also sagen wir ich habe ein 600x600 Bild (JPG) und möchte dieses auf 300x300 beschneiden und als JPG wieder abspeichern. Also nicht verkleinern / skalieren, sondern abschneiden. Alle bisherigen Versuche sind gescheitert, da ich immer den Fehler erhalte (JPG-Größe kann nicht geändert werden), selbst beim Code vom Unwissenden.

Jemand ne Idee? Thx

DeddyH 15. Nov 2008 12:38

Re: JPEG "on the Fly" Größe ändern
 
Versuch es mal mit BitBlt statt StretchDraw.

[edit] Oder der Canvas-Methode CopyRect() [/edit]

[edit2] Also in etwa so:
Delphi-Quellcode:
procedure Ausschnitt(const src: TGraphic;     // Quellgrafik
                     const dest: TBitmap;     // Zielbitmap
                     aWidth, aHeight: Integer; // Breite und Höhe des Ausschnitts
                     X: Integer = 0;          // X-Position
                     Y: Integer = 0);         // Y-Position
var tempBMP: TBitmap;
begin
  tempBMP := TBitmap.Create;
  try
    tempBMP.Assign(src);
    dest.Width := aWidth;
    dest.Height := aHeight;
    BitBlt(dest.Canvas.Handle,0,0,aWidth,aHeight,tempBMP.Canvas.Handle,X,Y,SRCCOPY);
  finally
    tempBMP.Free;
  end;
end;
[/edit2]


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