![]() |
DNG- und Tiff-Bilder in Bitmaps umwandeln
Nachdem ich die verschiedenste Bildformate anzeigen lassen kann (Danke für die Hilfe aus dem Forum), möchte ich nun daraus Bitmaps machen, die ich weiter bearbeiten kann. Das gelingt mir für einige Formate nicht aber für DNG, (evtl. CR2) und TIFF. Hier mein Programm:
Delphi-Quellcode:
Danke für hilfreiche Tipps, Theseus
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtDlgs, ExtCtrls, pngimage, jpeg, gifimg; type TForm1 = class(TForm) Image1: TImage; Button1: TButton; OpenDialog1: TOpenDialog; procedure Button1Click(Sender: TObject); procedure FormCreate(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; mybitmap : TBitmap; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); begin // Image1.Picture.RegisterFileFormat('CR2','CR2 Format',TWICImage); Image1.Picture.RegisterFileFormat('DNG','DNG Format',TWICImage); mybitmap := TBitmap.Create; mybitmap.PixelFormat := PF24bit; end; procedure TForm1.Button1Click(Sender: TObject); begin if OpenDialog1.execute then begin Image1.Picture.LoadFromFile(openDialog1.FileName); //das folgende funktioniert mit den verschiedensten Bildformaten: bmp, jpg, gif, tif, png, dng // Bilder werden angezeigt und im alten Format gespeichert Image1.Picture.SaveToFile(ExtractFilePath(openDialog1.FileName) + 'test1' + ExtractFileExt(openDialog1.FileName) ); // das nun folgende funktioniert nur mit bmp-Bildern, ansonsten hat test2.bmp 0 Byte // außerdem verschwindet das Bild von Form1 - alles ohne Fehlermeldung :-( mybitmap.assign(Image1.picture.bitmap); mybitmap.PixelFormat := PF24bit; mybitmap.SaveToFile(ExtractFilePath(openDialog1.FileName) + 'test2.bmp'); end; end; end. { Das folgende funktioniert für bmp, jpg, png, gif Ich weiß aber nicht nicht wie man tif- und dng- Bilder behandeln kann var jpg : TJPEGImage; gif : TGifImage; png : TPngImage; // ?? tiff : // ?? dng : s : string; begin s := directory+ExtractFilename(currentfile); if (pos('.gif', lowercase(s)) = length(s)-3) then begin GIF := TGIFImage.Create; try GIF.LoadFromFile(s); mybitmap.Assign(GIF); mybitmap.pixelformat := pf24bit; finally GIF.free; end; end else if (pos('.png', lowercase(s)) = length(s)-3) then begin png := TPNGimage.Create; try png.LoadFromFile(s); mybitmap.assign(png); mybitmap.pixelformat := pf24bit; finally png.free; end; end else if (pos('.jpg', lowercase(s)) = length(s)-3) then begin jpg:=TJPEGImage.Create; jpg.Performance :=jpBestQuality; jpg.ProgressiveDisplay := false; try jpg.LoadFromFile(s); mybitmap.Assign(jpg); mybitmap.PixelFormat:= pf24Bit; finally jpg.free; end; end; } |
AW: DNG- und Tiff-Bilder in Bitmaps umwandeln
Wenn du auf Image1.Picture.Bitmap zugreifst und Picture.Graphic keine TBitmap-Instantz ist, dann wird dort ein TBitmap erstellt und das "alte" Bild (die alte TGrafic-Instanz) gelöscht.
Dabei wird aber der Bildinhalt nicht kopiert (leider). *1 Nimm also Image1.Picture.Graphic zum Auslesen. Falls das nicht geht, dann eben manuell:
Delphi-Quellcode:
mybitmap.Width := Image1.Picture.Width;
mybitmap.Height := Image1.Picture.Height; mybitmap.Canvas.Draw(0, 0, Image1.Picture.Graphic); [add] *1) Wobei du dieses hättest auch selber rausbekommen können. :warn: Du hast ja schließlich nicht umsonst die VCL-Quellcodes mitgeliefert bekommen ... da kann man also auch mal nachsehn, was wo passiert und warum es nicht funktionieren mag.
Delphi-Quellcode:
procedure TPicture.ForceType(GraphicType: TGraphicClass);
begin if not (Graphic is GraphicType) then begin FGraphic.Free; // warum die aber kein FreeAndNil verwenden, ist mir unklar FGraphic := nil; FGraphic := GraphicType.Create; ... end; end; function TPicture.GetBitmap: TBitmap; begin ForceType(TBitmap); Result := TBitmap(Graphic); end; property Bitmap: TBitmap read GetBitmap write SetBitmap; |
AW: DNG- und Tiff-Bilder in Bitmaps umwandeln
Herzlichen Dank für die Hilfe!
Zitat:
Lieben Gruß, Theseus |
AW: DNG- und Tiff-Bilder in Bitmaps umwandeln
Ach, das wäre schon gegangen ... hier isses auch noch recht einfach :D
- Strg+Linksklick auf .Bitmap (ich glaub im Kontextmenü gibt's auch irgendwo einen Eintrag) - dort dann wieder Strg+Linksklick auf GetBitmap (eventuell nochmal Strg+Pfeilrunter aka zur Implementation springen) - hier gibt's nicht viel zu sehn, außer ForceType, also dort drauf wieder ein Strg+Linksklick - und hier sticht das
Delphi-Quellcode:
eigentlich sofort ins Auge
FGraphic.Free;
Manchmal muß man sich auch noch in der Vererbungshierarchie hoch-/runterkämpfen, aber je öfters man es macht, um so leichter wird es und man lernt die VCL besser kennen/verstehen. |
AW: DNG- und Tiff-Bilder in Bitmaps umwandeln
ich habe ähnlich Funktion wie oben um *.jpg, png, emf, ... in eine TBitMap zuladen, als Ergänzung das Laden *.tif ....
unit Unit_TTifImage; /// ************************************************** ************************ /// /// TTifImage, pretty similar to pngimage, jpgimage .... /// /// /// /// ************************************************** ************************ interface uses Windows, { Windows API Funktionen } Graphics, { pf1bit, pf... } types, { Rect } Classes, ExtCtrls, Dialogs; type TTifImage = Class(TBitMap) procedure LoadFromFile (const Filename: String); override; procedure SaveToFile (const Filename: String); override; end; implementation { TTifImage } /// /// see eg. ![]() /// procedure TTifImage.LoadFromFile(const Filename: String); var aImage : TImage; begin try aImage :=TImage.Create(nil); aImage.Picture.LoadFromFile(Filename); self.Width := aImage.Picture.Width; self.Height := aImage.Picture.Height; self.Canvas.Draw(0, 0, aImage.Picture.Graphic); finally aImage.Free; end; end; /// /// not yet tested ... /// procedure TTifImage.SaveToFile(const Filename: String); var aImage : TImage; begin try aImage :=TImage.Create(nil); aImage.Picture.Bitmap.Assign(self); aImage.Picture.SaveToFile(Filename); finally aImage.Free; end; end; end. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:16 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