Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Multipage bei Tiff-Dateien (https://www.delphipraxis.net/116159-multipage-bei-tiff-dateien.html)

michi101200 24. Jun 2008 13:28


Multipage bei Tiff-Dateien
 
Hallo,

ich komme mal wieder nicht weiter :-(

Ich schreib gerade ein Scann Programm mit der Komponenten DelphiTwain.
Das klappt auch wunderbar und wird auch in einer Tiff-Datei gespeichert.

Aber wenn man mehrere Dokumente scannt dann soll das in einer Tiff-Datei mit mehreren Seiten gespeichert werden.
Dazu benutze ich die Klasse LibTiffDelphi
http://www.awaresystems.be/imaging/tiff/delphi.html

Zur Testzwecken lasse ich den Scannvorgang erstmal aussenvor und versuche 2 Tiff-Dateien in einer zu speichern:

Delphi-Quellcode:
procedure TForm_Scan.Button1Click(Sender: TObject);
var i : integer;
    mFileName,mFileName2 : string;
    OpenTiff,OpenTiff2: PTIFF;
    buf : pointer;
    row,R1,R2 : integer;
begin
  mFileName := 'F:\temp\gescannteBilder\BMPTiff1.tiff';
  mFileName2 := 'F:\temp\gescannteBilder\BMPTiff2.tiff';

  OpenTiff := TIFFOpen(mFileName,'a');
  OpenTiff2 := TIFFOpen(mFileName2,'r');
  buf := _TIFFmalloc(TIFFScanlineSize(OpenTiff));

  For i := 0 To row - 1 do begin
    R1 := LibTiffDelphi.TIFFReadScanline(OpenTiff2,Buf,i,0);
    R2 := LibTiffDelphi.TIFFWriteScanline(OpenTiff,Buf,i,0);
    //ShowMessage(IntToStr(R1) + '  ' + IntToStr(R2));
  end;

  TIFFWriteDirectory(OpenTiff);
  _TIFFfree(buf);
  TIFFClose(OpenTiff);
  TIFFClose(OpenTiff2);

end;
Kennt ihr eine Lösung?

Vielen Dank schon mal für eure Bemühungen

Angel4585 24. Jun 2008 13:31

Re: Multipage bei Tiff-Dateien
 
Das gehört hier glaub nich hin ;)

michi101200 24. Jun 2008 13:35

Re: Multipage bei Tiff-Dateien
 
:wall:

Eine ganz dumme Frage nebenbei:
Wie kann ich das Thema verschieben?

Larsi 24. Jun 2008 13:41

Re: Multipage bei Tiff-Dateien
 
Gar nicht. Musst du die Melde Funktion benutzen. (kleines Ausrufezeichen bei deinem ersten Beitrag). Nur Mods und der Admin können Beiträgs verschieben.

soulies 24. Jun 2008 13:43

Re: Multipage bei Tiff-Dateien
 
Zitat:

Delphi-Quellcode:
  For i := 0 To row - 1 do begin
    R1 := LibTiffDelphi.TIFFReadScanline(OpenTiff2,Buf,i,0);
    R2 := LibTiffDelphi.TIFFWriteScanline(OpenTiff,Buf,i,0);
    //ShowMessage(IntToStr(R1) + '  ' + IntToStr(R2));
  end;

welchen wert hat 'row' bei dir ?
für mich siehts so aus das die schleife nicht durchlaufen wird

cya

michi101200 24. Jun 2008 13:46

Re: Multipage bei Tiff-Dateien
 
Die Schleife läuft durch aber bei
Delphi-Quellcode:
R2 := LibTiffDelphi.TIFFWriteScanline(OpenTiff,Buf,i,0);
ist der Rückgabewert -1. Das deutet auf einen Fehler hin.

Aber ich weiß nicht warum.

soulies 24. Jun 2008 13:51

Re: Multipage bei Tiff-Dateien
 
öffnet

Delphi-Quellcode:
TIFFOpen(...);
die datei vllt. nur lesend ?

cya

michi101200 24. Jun 2008 13:55

Re: Multipage bei Tiff-Dateien
 
Ich geben als Paramter 'w' für Write. So steht dass wohl in der Dokumentation.

Ich hab dass grad mit 'r' probiert aber das klappt auch nicht was auch logisch ist.

DP-Maintenance 24. Jun 2008 14:09

DP-Maintenance
 
Dieses Thema wurde von "MrSpock" von "Neuen Beitrag zur Code-Library hinzufügen" nach "Multimedia" verschoben.
Ist ein Multimedia Thema.

soulies 24. Jun 2008 14:26

Re: Multipage bei Tiff-Dateien
 
ich hab ein verständnisproblem mit deiner variablen 'row':
Delphi-Quellcode:
var i : integer;
    mFileName,mFileName2 : string;
    OpenTiff,OpenTiff2: PTIFF;
    buf : pointer;
    row,R1,R2 : integer;
begin
die variable ist als int angegeben, aber es wird nie ein wert zugewiesen - oder ?

und, hier
Delphi-Quellcode:
For i := 0 To row - 1 do begin
    R1 := LibTiffDelphi.TIFFReadScanline(OpenTiff2,Buf,i,0);
    R2 := LibTiffDelphi.TIFFWriteScanline(OpenTiff,Buf,i,0);
    //ShowMessage(IntToStr(R1) + '  ' + IntToStr(R2));
  end;
vermute ich das row irgendeinen wert hat, zB 10.000 - wenn aber nur 1.000 zeilen wirklich da sind
dann versucht doch TIFFWriteLine zu schreiben obwohls es nicht geht und liefert -1 zurück.

also ich hab erklärungsbedarf (auch für mich selbst wenn alles richtig ist ...)

cya

michi101200 24. Jun 2008 14:33

Re: Multipage bei Tiff-Dateien
 
Kein Problem.

Also die Variable row bekommt bei
Delphi-Quellcode:
LibTiffDelphi.TIFFGetField(OpenTiff2,TIFFTAG_IMAGELENGTH,row);
den Wert.

Es wird auch etwas gespeichert aber das wird so durcheinander gespeichert dass da kein Bild rauskommt. Bei
Delphi-Quellcode:
R2 := LibTiffDelphi.TIFFWriteScanline(OpenTiff,Buf,i,1);
kommt schon ein Fehler, also der Rückgabewert ist -1 was ein Fehler ist denn es soll 1 rauskommen.

michi101200 24. Jun 2008 14:38

Re: Multipage bei Tiff-Dateien
 
Hier ist wohl mein Problem (in englisch) beschrieben aber trotzdem läuft das nicht. :-(

soulies 24. Jun 2008 14:40

Re: Multipage bei Tiff-Dateien
 
also, wo kommt denn das her ?
Delphi-Quellcode:
LibTiffDelphi.TIFFGetField(OpenTiff2,TIFFTAG_IMAGELENGTH,row);
denn in deinem geposteten quellcode stehts ja nicht drin, oder ist dieser nur ein ausschnitt ?

michi101200 24. Jun 2008 14:44

Re: Multipage bei Tiff-Dateien
 
OpenTiff2 ist ja die Quelldatei.

Mit dem Befehl LibTiffDelphi.TIFFGetField(OpenTiff2,TIFFTAG_PHOTO METRIC,Row); wird die Anzahl der Reihen von der Quelldatei geladen und in der Variable Row übergeben.

So bekommt die Varable die Anzahl der Reihen von der Quelldatei damit man weiß wieviele Reihen "kopiert" werden soll.

soulies 24. Jun 2008 14:51

Re: Multipage bei Tiff-Dateien
 
Zitat:

Mit dem Befehl LibTiffDelphi.TIFFGetField(OpenTiff2,TIFFTAG_PHOTO METRIC,Row); wird die Anzahl der Reihen von der Quelldatei geladen und in der Variable Row übergeben.
alles ok ... aber

in deiner geposteten btn methode

Delphi-Quellcode:
procedure TForm_Scan.Button1Click(Sender: TObject);
var i : integer;
    mFileName,mFileName2 : string;
    OpenTiff,OpenTiff2: PTIFF;
    buf : pointer;
    row,R1,R2 : integer;
begin
  mFileName := 'F:\temp\gescannteBilder\BMPTiff1.tiff';
  mFileName2 := 'F:\temp\gescannteBilder\BMPTiff2.tiff';

  OpenTiff := TIFFOpen(mFileName,'a');
  OpenTiff2 := TIFFOpen(mFileName2,'r');
  buf := _TIFFmalloc(TIFFScanlineSize(OpenTiff));

  For i := 0 To row - 1 do begin
    R1 := LibTiffDelphi.TIFFReadScanline(OpenTiff2,Buf,i,0);
    R2 := LibTiffDelphi.TIFFWriteScanline(OpenTiff,Buf,i,0);
    //ShowMessage(IntToStr(R1) + '  ' + IntToStr(R2));
  end;

  TIFFWriteDirectory(OpenTiff);
  _TIFFfree(buf);
  TIFFClose(OpenTiff);
  TIFFClose(OpenTiff2);

end;
taucht doch der befehl gar nicht auf ...also wird er an anderer stelle verwendet ...
ich wollt nur wissen wo ?

michi101200 24. Jun 2008 14:54

Re: Multipage bei Tiff-Dateien
 
oh sorry :oops:

Beim ganzen Testen habe ich dass einmal entfernt aber ich habe den Befehl drin

Delphi-Quellcode:
 
  LibTiffDelphi.TIFFGetField(OpenTiff2,TIFFTAG_IMAGELENGTH,row);

  buf := _TIFFmalloc(TIFFScanlineSize(OpenTiff2));

  For i := 0 To row - 1 do begin
    R1 := LibTiffDelphi.TIFFReadScanline(OpenTiff2,Buf,i,0);
    R2 := LibTiffDelphi.TIFFWriteScanline(OpenTiff,Buf,i,0);

michi101200 24. Jun 2008 15:09

Re: Multipage bei Tiff-Dateien
 
Ich muss leider jetzt weg.

Wenn ihr eine Idee habt, also kann natürlich auch ohne diese Komponente sein, dann schreibt sie bitte.

michi101200 26. Jun 2008 07:44

Re: Multipage bei Tiff-Dateien
 
Also ich bin zwar schon weitergekommen aber da ist noch ein Fehler.

Aber erstmal erwähne ich was der vorherige Fehler war:
Man muss nämlich erst sogenannte Tags bzw. Fields definieren.
Das hab ich jetzt gemacht.

Hier erstmal der "neue" Code.
Delphi-Quellcode:
procedure TForm_Scan.Button1Click(Sender: TObject);
var i,R1,R2 : integer;
    mFileName,mFileName2,mtest : string;
    OpenTiff,OpenTiff2: PTIFF;
    buf : pointer;
    row, AddRow : integer;
    width, height,rows,cols,channels, Photo, BitsPerSam : ^integer;
    TileLen, TileWid, rowstrip : ^integer;
begin
  mFileName := 'F:\temp\gescannteBilder\BMPTiff1.tiff';
  mFileName2 := 'F:\temp\gescannteBilder\BMPTiff2.tiff';

  New(rows);
  New(cols);
  New(channels);
  New(Photo);
  New(BitsPerSam);
  New(TileLen);
  New(TileWid);
  New(rowstrip);

  OpenTiff2 := TIFFOpen(mFileName2,'r');
  TIFFGetField(OpenTiff2,TIFFTAG_IMAGELENGTH,rows);
  TIFFGetField(OpenTiff2,TIFFTAG_IMAGEWIDTH,cols);
  TIFFGetField(OpenTiff2,TIFFTAG_SAMPLESPERPIXEL,channels);
  TIFFGetField(OpenTiff2,TIFFTAG_PHOTOMETRIC,Photo);
  TIFFGetField(OpenTiff2,TIFFTAG_BITSPERSAMPLE,BitsPerSam);
  TIFFGetField(OpenTiff2,TIFFTAG_BITSPERSAMPLE,BitsPerSam);
  TIFFGetField(OpenTiff2,TIFFTAG_BITSPERSAMPLE,BitsPerSam);

  TIFFGetField(OpenTiff2,TIFFTAG_TILELENGTH,TileLen);
  TIFFGetField(OpenTiff2,TIFFTAG_TILEWIDTH,TileWid);
  TIFFGetField(OpenTiff2,TIFFTAG_ROWSPERSTRIP,rowstrip);

  buf := _TIFFmalloc(TIFFScanlineSize(OpenTiff2));

  OpenTiff := TIFFOpen(mFileName,'a');
  TIFFSetField(OpenTiff,TIFFTAG_IMAGEWIDTH,cols);
  TIFFSetField(OpenTiff,TIFFTAG_IMAGELENGTH,rows);
  TIFFSetField(OpenTiff,TIFFTAG_SAMPLESPERPIXEL,channels);
  TIFFSetField(OpenTiff,TIFFTAG_PHOTOMETRIC,Photo);
  TIFFSetField(OpenTiff,TIFFTAG_BITSPERSAMPLE,BitsPerSam);

  TIFFSetField(OpenTiff,TIFFTAG_TILELENGTH,TileLen);
  TIFFSetField(OpenTiff,TIFFTAG_TILEWIDTH,TileWid);
  TIFFSetField(OpenTiff,TIFFTAG_ROWSPERSTRIP,rowstrip);

  TIFFSetField(OpenTiff,TIFFTAG_PLANARCONFIG,PLANARCONFIG_CONTIG);

  row := TIFFScanlineSize(OpenTiff2);
  For i := 0 To row - 1 do begin
    R1 := LibTiffDelphi.TIFFReadScanline(OpenTiff2,Buf,i,1);
    R2 := LibTiffDelphi.TIFFWriteScanline(OpenTiff,Buf,i,1);
  end;


  TIFFWriteDirectory(OpenTiff);
  _TIFFfree(buf);
  TIFFClose(OpenTiff);
  TIFFClose(OpenTiff2);
  Dispose(rows);
  Dispose(cols);
  Dispose(channels);
  Dispose(Photo);
  Dispose(BitsPerSam);
  Dispose(TileLen);
  Dispose(TileWid);
  Dispose(rowstrip);

end;


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