Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   DNG- und Tiff-Bilder in Bitmaps umwandeln (https://www.delphipraxis.net/163577-dng-und-tiff-bilder-bitmaps-umwandeln.html)

Theseus 5. Okt 2011 10:13

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:
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;
}
Danke für hilfreiche Tipps, Theseus

himitsu 5. Okt 2011 10:27

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;

Theseus 5. Okt 2011 13:06

AW: DNG- und Tiff-Bilder in Bitmaps umwandeln
 
Herzlichen Dank für die Hilfe!

Zitat:

Wobei du dieses hättest auch selber rausbekommen können.
Danke, dass du es mir zugetraut hättest, aber allein wäre ich ehrlich überfordert gewesen...

Lieben Gruß, Theseus

himitsu 5. Okt 2011 13:14

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:
FGraphic.Free;
eigentlich sofort ins Auge

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.

bernhard_LA 3. Nov 2011 12:12

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. http://www.delphipraxis.net/.....
///
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 15:35 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