AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi JPEG "on the Fly" Größe ändern
Thema durchsuchen
Ansicht
Themen-Optionen

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

Ein Thema von delphipitti · begonnen am 16. Okt 2006 · letzter Beitrag vom 15. Nov 2008
Antwort Antwort
delphipitti

Registriert seit: 19. Jan 2005
27 Beiträge
 
Delphi 7 Professional
 
#1

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

  Alt 16. Okt 2006, 17:56
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

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 ...

Viele Grüße, delphipitti
  Mit Zitat antworten Zitat
Benutzerbild von timog
timog

Registriert seit: 26. Sep 2006
Ort: Landkreis Oldenburg (Oldb)
117 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#2

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

  Alt 17. Okt 2006, 09:51
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
Timo
Real Programmers are surprised when the odometers in their cars don't turn from 99999 to 9999A.
  Mit Zitat antworten Zitat
Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#3

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

  Alt 17. Okt 2006, 10:52
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
  Mit Zitat antworten Zitat
delphipitti

Registriert seit: 19. Jan 2005
27 Beiträge
 
Delphi 7 Professional
 
#4

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

  Alt 26. Okt 2006, 10:35
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 ...
  Mit Zitat antworten Zitat
Benutzerbild von Sko
Sko

Registriert seit: 11. Sep 2005
327 Beiträge
 
Turbo Delphi für Win32
 
#5

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

  Alt 26. Okt 2006, 11:31
Tempo.Assign(Preview.Picture.Bitmap); Das Stück Code ist schon die Antwort: Bilder werden (glaub ich) in TImage immer als Bitmap angezeigt.
MfG Sko
Zitat von Phoenix:
[OT]Phoenix guckt in die Glaskugel, zuckt mit den Flügelspitzen, krächzt etwas von wegen 'Boden' und 'Scherben' und schubbst die Kugel in Richtung Tischkante.[/OT]
Rockbox
  Mit Zitat antworten Zitat
Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#6

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

  Alt 26. Okt 2006, 12:00
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
  Mit Zitat antworten Zitat
naridian

Registriert seit: 12. Jan 2007
56 Beiträge
 
Delphi 2007 Professional
 
#7

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

  Alt 3. Mär 2007, 12:23
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?
  Mit Zitat antworten Zitat
Pfoto

Registriert seit: 26. Aug 2005
Ort: Daun
541 Beiträge
 
Turbo Delphi für Win32
 
#8

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

  Alt 3. Mär 2007, 12:36
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
Jürgen Höfs
Jürgen Höfs / picoly.de
  Mit Zitat antworten Zitat
The Riddler
(Gast)

n/a Beiträge
 
#9

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

  Alt 15. Nov 2008, 13:30
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
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#10

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

  Alt 15. Nov 2008, 13:38
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]
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  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 19:41 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