![]() |
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 |
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 |
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 |
Re: JPEG "on the Fly" Größe ändern
Hallo,
erstmal vielen Dank - jetzt hab ich es hinbekommen:
Delphi-Quellcode:
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...
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; Warum passiert dies !? Irgendein JPEG-Fehler ... |
Re: JPEG "on the Fly" Größe ändern
Delphi-Quellcode:
Das Stück Code ist schon die Antwort: Bilder werden (glaub ich) in TImage immer als Bitmap angezeigt.
Tempo.Assign(Preview.Picture.Bitmap);
|
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:
Hier würdest du jetzt das resizedImage zurück bekommen. Das kannst du dann wie jede JPEG speichern oder anzeigen oder was auch immer.
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; Gruß Der Unwissende |
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? |
Re: JPEG "on the Fly" Größe ändern
Hi!
schau dir mal das an (in einem Beitrag von User Hador gefunden):
Delphi-Quellcode:
Bei Width und Height halt noch die richtige Proportion berechnen...
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; Wenn du bessere Verkleinerungs-Ergebnisse wünscht, musst du nach einem anderen Algorhythmus schauen, z.B.: ![]() Dann Komponente 'Interpolating Bitmap Resampler v.1.2' wählen. Gruß Pfoto |
Re: JPEG "on the Fly" Größe ändern
Delphi-Quellcode:
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.
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; Jemand ne Idee? Thx |
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:
[/edit2]
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; |
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