![]() |
einzel bmps aus einer tif Datei auslesen
Hallo ,
habe gerade ein vergleichbares Problem wie unter ![]() muss auf einer vielzahl von Tif immer ein Bild mit dem einembestimmten Index auslesen Kann jemand mit einem funktionieren Code weiterhelfen ? Danke |
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 ![]() ![]() |
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"
|
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 |
AW: einzel bmps aus einer tif Datei auslesen
|
AW: einzel bmps aus einer tif Datei auslesen
|
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 |
AW: einzel bmps aus einer tif Datei auslesen
Fehler gefunden --- encoder tiff nicht tif :-)
|
AW: einzel bmps aus einer tif Datei auslesen
So wird das aber wohl nix.
Anstatt:
Code:
muss es vielmehr korrekt heißen:
MulitFrameImage.SelectActiveFrame(encoderClsid, PageIndex);
Code:
und die pageGUID muus zuvor ermittelt werdem als:
MulitFrameImage.SelectActiveFrame(pageGuid, PageIndex);
Code:
Die encoderClsid komt erst zum Einsatz beim beim abschließenden encoding zur BMP-Bitmap.
pageGuid := FrameDimensionPage;
--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:
Kommentar:
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; 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. |
AW: einzel bmps aus einer tif Datei auslesen
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:37 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