Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   einzel bmps aus einer tif Datei auslesen (https://www.delphipraxis.net/169243-einzel-bmps-aus-einer-tif-datei-auslesen.html)

bernhard_LA 6. Jul 2012 09:40

einzel bmps aus einer tif Datei auslesen
 
Hallo ,


habe gerade ein vergleichbares Problem wie unter http://www.delphipraxis.net/165181-t...-zerlegen.html beschrieben,

muss auf einer vielzahl von Tif immer ein Bild mit dem einembestimmten Index auslesen

Kann jemand mit einem funktionieren Code weiterhelfen ?

Danke

himitsu 6. Jul 2012 09:51

AW: einzel bmps aus einer tif Datei auslesen
 
Ich weiß jetzt nicht, was Delphi schon an Board hat, aber TPicture nutzt aktuell TWICImage mit wifTiff (TWICImageFormat), wo ich nichts erkennen konnte, mit dem man eine Seite auswählen kann. (das nutzt wohl einfach immer nur die erste Seite)

Wir nutzen Bei Google suchenImageEn und dort kann man mit dem TIETIFFHandler recht einfach auf alles Mögliche des TIFFs zugreifen.


Bei Google suchenTTiffImage ?

Bummi 6. Jul 2012 10:05

AW: einzel bmps aus einer tif Datei auslesen
 
in der von mir schon häufiger erwähnten (Installations)+freien GDI+ API mit Beispielen unter "GDIPlus\demos\Using Image Encoders and Decoders"

bernhard_LA 6. Jul 2012 10:17

AW: einzel bmps aus einer tif Datei auslesen
 
bitte den Download Link für

--- > GDIPlus\demos\Using Image Encoders and Decoders


auf der Embaracardero Seite habe ich nir GDI+ für D2009 gefunden

DeddyH 6. Jul 2012 10:19

AW: einzel bmps aus einer tif Datei auslesen
 
Using Image Encoders and Decoders

Bummi 6. Jul 2012 11:09

AW: einzel bmps aus einer tif Datei auslesen
 
Alles im API-Paket von GDI+ unter

http://www.progdigy.com/

bernhard_LA 6. Jul 2012 11:26

AW: einzel bmps aus einer tif Datei auslesen
 
anbei mein DEMO code mit GDI PLus .... leider is jedes einzelnen *.tif Bild nur schwarz




Delphi-Quellcode:

unit Unit_GDIPLUSDEMO;
///
///      extract all pages from an *.tif file using GDI PLus
///
///
///
///

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, GDIPAPI, GDIPOBJ, GDIPUTIL, Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    edt_imagefilename: TEdit;
    btn_loadfilename: TButton;
    dlgOpenimagefile: TOpenDialog;
    btn_splitt_tif_file: TButton;
    procedure btn_loadfilenameClick(Sender: TObject);
    procedure btn_splitt_tif_fileClick(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.btn_loadfilenameClick(Sender: TObject);
begin
     if dlgOpenimagefile.Execute then
     begin

     edt_imagefilename.Text := dlgOpenimagefile.FileName;

     end;

end;

procedure TForm1.btn_splitt_tif_fileClick(Sender: TObject);
var
   encoderClsid: TGUID;
   encoderParameters: TEncoderParameters;
   quality: ULONG;
   stat: TStatus;
   MulitFrameImage: TGPImage;
   PageIndex : Integer;
   NewFilename : String;
begin

      /// Get an tif image from the disk.
      MulitFrameImage := TGPImage.Create(edt_imagefilename.Text);


     /// Get the CLSID of the JPEG, TIFF ... encoder.
     GetEncoderClsid('image/tif', encoderClsid);

    for PageIndex:= 1 to 80 do
    begin

     /// Display and save the first page (index 0).
    MulitFrameImage.SelectActiveFrame(encoderClsid, PageIndex);
    // graphics.DrawImage(&multi, 10, 10);


    NewFilename := 'e:\tiffsplit\' + ExtractFileName(edt_imagefilename.Text) + IntToStr(PageIndex) + '.tif';

    MulitFrameImage.Save( WideString(NewFilename), encoderClsid, nil );  


 end;

end;

end.


ich denke MulitFrameImage.Save( WideString(NewFilename), encoderClsid, nil ); ist falsch , aber mit
der Version MulitFrameImage.Save( WideString(NewFilename), encoderClsid, @encoderParameters ); bekomme ich eine AV

bernhard_LA 6. Jul 2012 11:31

AW: einzel bmps aus einer tif Datei auslesen
 
Fehler gefunden --- encoder tiff nicht tif :-)

ASM 8. Jul 2012 23:20

AW: einzel bmps aus einer tif Datei auslesen
 
So wird das aber wohl nix.
Anstatt:
Code:
MulitFrameImage.SelectActiveFrame(encoderClsid, PageIndex);
muss es vielmehr korrekt heißen:
Code:
MulitFrameImage.SelectActiveFrame(pageGuid, PageIndex);
und die pageGUID muus zuvor ermittelt werdem als:
Code:
pageGuid := FrameDimensionPage;
Die encoderClsid komt erst zum Einsatz beim beim abschließenden encoding zur BMP-Bitmap.

--Absatz--

Im übrigen ist das Zerlegen der Multipage-TIF in deren einzelne Bitmaps aber auch möglich ohne GDIplus, also ohne obligaten Rückgriff auf eine externe DLL (gdiplus.dll), nämlich durchaus problemlos allein mit der LibTiffDelphi (die ja anfangs bereits verwendet worden war):
Code:
Procedure TForm1.TIFZerlegen(const TIFdateiname: TFileName);
var
  objTIFFImage: PTIFF;
  objBMPImage: TBitmap;
  intWidth: Integer;
  intHeight: Integer;
  totalPages: Word;
  currentPage: Word;
  i, j: integer;
begin
  if not FileExists(TIFdateiname) then exit;
  objTIFFImage := TIFFOpen(TIFdateiname, 'r');
  if objTIFFImage=nil then exit;
  try
    totalPages := TIFFNumberOfDirectories(objTIFFImage);
    for i := 0 to totalpages - 1 do
    begin
      if i>0 then TIFFReadDirectory(objTIFFImage);
      currentPage := TIFFCurrentDirectory(objTIFFImage);
      TIFFGetField(objTIFFImage, TIFFTAG_IMAGEWIDTH, @intWidth);
      TIFFGetField(objTIFFImage, TIFFTAG_IMAGELENGTH, @intHeight);
      objBMPImage := TBitmap.Create;
      try
        objBMPImage.Width := intWidth;
        objBMPImage.Height := intHeight;
        TIFFReadRGBAImage(objTIFFImage, intWidth, intHeight, objBMPImage.Scanline[intHeight - 1], 0);
        objBMPImage.SaveToFile(format('%s2BMP%d.bmp', [TIFdateiname, currentpage]));
      finally
        objBMPImage.Free;
      end;
    end;
  finally
    TIFFClose(objTIFFImage);
  end;
end;
Kommentar:
Jeder Aufruf von TIFFReadDirectory() führt zum nächsten IFD. Das erste IFD, also dasjenige für die Page #0, wird bereits implizit mit dem Öffnen der Datei vorgenommen. Der erste explizite Aufruf von TIFFReadDirectory() führt also bereits zur IFD für Page #1.

bernhard_LA 11. Jul 2012 17:52

AW: einzel bmps aus einer tif Datei auslesen
 
nur zur info : Download link http://www.remotesensing.org/libtiff/

version 4.02 , Datum


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