AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia DNG- und Tiff-Bilder in Bitmaps umwandeln
Thema durchsuchen
Ansicht
Themen-Optionen

DNG- und Tiff-Bilder in Bitmaps umwandeln

Ein Thema von Theseus · begonnen am 5. Okt 2011 · letzter Beitrag vom 3. Nov 2011
Antwort Antwort
Theseus

Registriert seit: 21. Jun 2011
20 Beiträge
 
Delphi 10.2 Tokyo Architect
 
#1

DNG- und Tiff-Bilder in Bitmaps umwandeln

  Alt 5. Okt 2011, 11:13
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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.071 Beiträge
 
Delphi 12 Athens
 
#2

AW: DNG- und Tiff-Bilder in Bitmaps umwandeln

  Alt 5. Okt 2011, 11:27
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.
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;
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu ( 5. Okt 2011 um 11:46 Uhr)
  Mit Zitat antworten Zitat
Theseus

Registriert seit: 21. Jun 2011
20 Beiträge
 
Delphi 10.2 Tokyo Architect
 
#3

AW: DNG- und Tiff-Bilder in Bitmaps umwandeln

  Alt 5. Okt 2011, 14:06
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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.071 Beiträge
 
Delphi 12 Athens
 
#4

AW: DNG- und Tiff-Bilder in Bitmaps umwandeln

  Alt 5. Okt 2011, 14:14
Ach, das wäre schon gegangen ... hier isses auch noch recht einfach

- 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 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.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
bernhard_LA

Registriert seit: 8. Jun 2009
Ort: Bayern
1.138 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: DNG- und Tiff-Bilder in Bitmaps umwandeln

  Alt 3. Nov 2011, 13:12
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.
  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 07:31 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