Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Image-Resize und abspeichern mit Qualität (https://www.delphipraxis.net/68775-image-resize-und-abspeichern-mit-qualitaet.html)

TriphunEM 5. Mai 2006 10:14


Image-Resize und abspeichern mit Qualität
 
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;

Der_Unwissende 5. Mai 2006 10:39

Re: Image-Resize und abspeichern mit Qualität
 
Hi,
dein Fehler liegt hier

Zitat:

Zitat von TriphunEM
Delphi-Quellcode:
      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

TriphunEM 5. Mai 2006 11:46

Re: Image-Resize und abspeichern mit Qualität
 
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?

Der_Unwissende 5. Mai 2006 14:54

Re: Image-Resize und abspeichern mit Qualität
 
Zitat:

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

Mackhack 5. Mai 2006 15:30

Re: Image-Resize und abspeichern mit Qualität
 
@TriphunEM

Wenn du OOP anwendest brauchst das MainForm nicht mitschreiben in deinem Code!

shibumi 23. Mai 2006 10:54

Re: Image-Resize und abspeichern mit Qualität
 
so ich hänge mich mal hier ran, da mein Problem weiterführend ist.
Wenn ich das Bild abspeichere mit
Delphi-Quellcode:
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


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