AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia einzel bmps aus einer tif Datei auslesen
Thema durchsuchen
Ansicht
Themen-Optionen

einzel bmps aus einer tif Datei auslesen

Ein Thema von bernhard_LA · begonnen am 6. Jul 2012 · letzter Beitrag vom 11. Jul 2012
Antwort Antwort
bernhard_LA

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

einzel bmps aus einer tif Datei auslesen

  Alt 6. Jul 2012, 10:40
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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: einzel bmps aus einer tif Datei auslesen

  Alt 6. Jul 2012, 10:51
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 ?
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#3

AW: einzel bmps aus einer tif Datei auslesen

  Alt 6. Jul 2012, 11:05
in der von mir schon häufiger erwähnten (Installations)+freien GDI+ API mit Beispielen unter "GDIPlus\demos\Using Image Encoders and Decoders"
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
bernhard_LA

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

AW: einzel bmps aus einer tif Datei auslesen

  Alt 6. Jul 2012, 11:17
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

Geändert von bernhard_LA ( 6. Jul 2012 um 11:22 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.622 Beiträge
 
Delphi 12 Athens
 
#5

AW: einzel bmps aus einer tif Datei auslesen

  Alt 6. Jul 2012, 11:19
Using Image Encoders and Decoders
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#6

AW: einzel bmps aus einer tif Datei auslesen

  Alt 6. Jul 2012, 12:09
Alles im API-Paket von GDI+ unter

http://www.progdigy.com/
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
bernhard_LA

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

AW: einzel bmps aus einer tif Datei auslesen

  Alt 6. Jul 2012, 12:26
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
  Mit Zitat antworten Zitat
bernhard_LA

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

AW: einzel bmps aus einer tif Datei auslesen

  Alt 6. Jul 2012, 12:31
Fehler gefunden --- encoder tiff nicht tif
  Mit Zitat antworten Zitat
ASM

Registriert seit: 16. Aug 2004
165 Beiträge
 
Delphi 7 Enterprise
 
#9

AW: einzel bmps aus einer tif Datei auslesen

  Alt 9. Jul 2012, 00:20
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.

Geändert von ASM ( 9. Jul 2012 um 11:20 Uhr) Grund: Kleiner Fehler in der Schleife korrigiert ("for j := 1 to i do" war zuviel des Guten; muss richtig lauten: "if i>0 then")
  Mit Zitat antworten Zitat
bernhard_LA

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

AW: einzel bmps aus einer tif Datei auslesen

  Alt 11. Jul 2012, 18:52
nur zur info : Download link http://www.remotesensing.org/libtiff/

version 4.02 , Datum
  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 21:53 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