AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Image-Resize und abspeichern mit Qualität
Thema durchsuchen
Ansicht
Themen-Optionen

Image-Resize und abspeichern mit Qualität

Offene Frage von "shibumi"
Ein Thema von TriphunEM · begonnen am 5. Mai 2006 · letzter Beitrag vom 23. Mai 2006
Antwort Antwort
TriphunEM

Registriert seit: 8. Jan 2004
147 Beiträge
 
#1

Image-Resize und abspeichern mit Qualität

  Alt 5. Mai 2006, 11:14
Hallo,

hab schon viel gesucht, aber keine Hilfe gefunden.

Ich mache eine Screenshot und lad den in die Image32-Kompo der GL32.
Der Screenshot soll auf 160x120 verkleinert werden.

Allerdings bekomm ich das nicht hin, das er das in der Image32-Kompo verkleinerte Bild auch so abspeichert.
Er speichert es immer wieder 1:1 ab.

Was mache ich falsch???

Delphi-Quellcode:
begin
  sourceBitmap := TBitmap.Create;
  targetBitmap := TBitmap.Create;
  bmp := TBitmap.Create;
  jpeg := TJPEGImage.Create;
  try
    try
      {**********
        In sourceBitmap befindet sich der Screenshot
      ***********}


      // Resize the src bitmap
      Mainform.jpgImage.Bitmap.Assign(sourceBitmap);
      Mainform.jpgImage.width := 160;
      Mainform.jpgImage.Height := 120;
      Mainform.jpgImage.ScaleMode := smResize ;

      // Create a JPEG from the Bitmap and save it
      bmp.Assign(Mainform.jpgImage.Bitmap);

      jpeg.Assign(bmp);
      JPeg.CompressionQuality := 75;
      jpeg.SaveToFile('thumpnail.jpg');
     
    finally
      jpeg.Free;
      sourceBitmap.Free;
      targetBitmap.Free;
      bmp.Free;
    end;
  except
    // Error Code
  end;
end;
  Mit Zitat antworten Zitat
Der_Unwissende

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

Re: Image-Resize und abspeichern mit Qualität

  Alt 5. Mai 2006, 11:39
Hi,
dein Fehler liegt hier

Zitat von TriphunEM:
      jpeg.Assign(bmp);
Mit Assign weißt du alle Eigenschaften von bmp einfach dem JPEG zu. Dazu gehören natürlich auch die Größe des Bildes (und dessen Information). Versuch es ein wenig mehr per Hand zu machen. Leg dir einfach einen Puffer an (eine Bitmap), die die größe deines JPEGs hat (oder verwende direkt dass JPEG, wenn das einen Canvas hat, müsste es ja eigentlich, bin mir nur gerade nicht 100% sicher).
Dann kopierst du einfach mittels StretchBlt die Informatioen und dann klappts auch mit der Größe

Gruß Der Unwissende
  Mit Zitat antworten Zitat
TriphunEM

Registriert seit: 8. Jan 2004
147 Beiträge
 
#3

Re: Image-Resize und abspeichern mit Qualität

  Alt 5. Mai 2006, 12:46
mh, versteh ich ne ganz, denn mit

bmp.Assign(Mainform.jpgImage.Bitmap);

weiße ich doch dem bitmap eigentlich die größe des Image32 zu!
dann sollte das bitmap auch die geändert eigenschaften haben.

die verkleinerung will ich ja aber über die kompo Image32, wegen der interpolation.
also da brauch ich doch kein StretchBlt, oder?
  Mit Zitat antworten Zitat
Der_Unwissende

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

Re: Image-Resize und abspeichern mit Qualität

  Alt 5. Mai 2006, 15:54
Zitat von TriphunEM:
mh, versteh ich ne ganz, denn mit

bmp.Assign(Mainform.jpgImage.Bitmap);

weiße ich doch dem bitmap eigentlich die größe des Image32 zu!
Nein, du weißt dem Bitmap die größe der geladenen Bitmap zu. Dass die kleiner angezeigt wird interessiert die (im Speicher liegende) Bitmap gar nicht. Damit bekommst du immer die Originalgröße. Du könntest natürlich versuchen den Canvas deines Images in eine bitmap zu kopieren (StretchBlt ohne Streckung oder eben BitBlt).
  Mit Zitat antworten Zitat
Benutzerbild von Mackhack
Mackhack

Registriert seit: 29. Nov 2003
Ort: San Diego, CA/USA
1.446 Beiträge
 
Delphi 2006 Architect
 
#5

Re: Image-Resize und abspeichern mit Qualität

  Alt 5. Mai 2006, 16:30
@TriphunEM

Wenn du OOP anwendest brauchst das MainForm nicht mitschreiben in deinem Code!
Um etwas Neues zu schaffen muss man seine Ohren vor den Nein-sagern verschliessen um seinen Geist öffnen zu können.
(George Lukas)
  Mit Zitat antworten Zitat
shibumi

Registriert seit: 23. Mai 2006
1 Beiträge
 
#6

Re: Image-Resize und abspeichern mit Qualität

  Alt 23. Mai 2006, 11:54
so ich hänge mich mal hier ran, da mein Problem weiterführend ist.
Wenn ich das Bild abspeichere mit
image32.bitmap.savetofile('c:\test2.bmp'); Wird nicht das interpolierte Bild gespeichert, sondern das original, welches mir ja nix nutzt.

Also habe ich als workaround das vorgeschlagene BitBlt genutzt.

Delphi-Quellcode:
function TImageFrame.SetResolution(iResX : integer; iResY : integer) : Boolean;
var my1bmp :Tbitmap;
  begin
  try
    my1bmp := TBitmap.create;
      image32.Bitmap.LoadFromFile(EmpfangsTelegramm.sDateiname);
    image32.width := iResX;
    image32.Height := iResY;
    image32.ScaleMode := smResize ;
    image32.Resize;
    //image32.bitmap.savetofile('c:\test2.bmp'); // Funzt net da Bild aus dem Speicher und nicht aus der Komponente entnommen wird.
    BitBlt(image32.Bitmap.Handle,0,0,image32.width,Image32.height,my1bmp.Handle,0,0,srcCopy);
    my1bmp.SaveToFile('C:\test_bmp.bmp');
  finally
     my1bmp.free;
  end;
end;
Aber das gespeicherte Bild ('test_bmp.bmp') enthält keinen Header, sodass das IrfanView es nicht öffnen kann.
Möchte aber nach Möglichkeit die Datei nicht öffnen mich durchparsen und den Header "manuell" einfügen

Hat jemand ne Lösung oder nen Denkanstoss.

danke
  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:13 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