Autor Beitrag
Fraengie
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Di 26.09.06 09:10 
Hallo Leute,

muß mich derzeit mit der libtiffdelphi auseinandersetzen und habe mich dazu mal mit dem unter www.asmail.be/msg0054866090.html veröffentlichten Beispiel-Code zum Speichern eines Tif-Files beschäftigt:

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
procedure WriteBitmapToTiff(Bitmap: TBitmap; Filename: String);
var
  OpenTiff: PTIFF;
  RowSize: Longword;
  RowsPerStrip: Longword;
  StripMemory: Pointer;
  StripIndex: Longword;
  StripRowOffset: Longword;
  StripRowCount: Longword;
  mb: PByte;
  ny: Longword;
begin
  if (Bitmap.PixelFormat<>pf1bit) then
    raise Exception.Create('WriteBitmapToTiff is designed for singlebit
                    bitmaps only'
);
  RowSize:=((Bitmap.Width+7) div 8 );
  RowsPerStrip:=((256*1024) div RowSize);
  if RowsPerStrip>Bitmap.Height then
    RowsPerStrip:=Bitmap.Height
  else if RowsPerStrip=0 then
    RowsPerStrip:=1;
  StripMemory:=GetMemory(RowsPerStrip*RowSize);
  OpenTiff:=TIFFOpen(PAnsiChar(Filename),'w');
  if OpenTiff=nil then
  begin
    FreeMemory(StripMemory);
    raise Exception.Create('Unable to create file '''+Filename+'''');
  end;
  TIFFSetField(OpenTiff,TIFFTAG_IMAGEWIDTH,Bitmap.Width);
  TIFFSetField(OpenTiff,TIFFTAG_IMAGELENGTH,Bitmap.Height);
  TIFFSetField(OpenTiff,TIFFTAG_PHOTOMETRIC,PHOTOMETRIC_MINISWHITE);
  TIFFSetField(OpenTiff,TIFFTAG_SAMPLESPERPIXEL,1);
  TIFFSetField(OpenTiff,TIFFTAG_BITSPERSAMPLE,1);
  TIFFSetField(OpenTiff,TIFFTAG_PLANARCONFIG,PLANARCONFIG_CONTIG);
  TIFFSetField(OpenTiff,TIFFTAG_COMPRESSION,COMPRESSION_CCITTFAX4);
  TIFFSetField(OpenTiff,TIFFTAG_ROWSPERSTRIP,RowsPerStrip);
  StripIndex:=0;
  StripRowOffset:=0;
  while StripRowOffset<Bitmap.Height do
  begin
    StripRowCount:=RowsPerStrip;
    if StripRowCount>Bitmap.Height-StripRowOffset then
      StripRowCount:=Bitmap.Height-StripRowOffset;
    mb:=StripMemory;
    for ny:=StripRowOffset to StripRowOffset+StripRowCount-1 do
    begin
      CopyMemory(mb,Bitmap.ScanLine[ny],RowSize);
      Inc(mb,RowSize);
    end;
    if TIFFWriteEncodedStrip(OpenTiff,StripIndex,
        StripMemory,StripRowCount*RowSize)=-1 then
    begin
      TIFFClose(OpenTiff);
      FreeMemory(StripMemory);
      raise Exception.Create('Failed to write '''+Filename+'''');
    end;
    Inc(StripIndex);
    Inc(StripRowOffset,StripRowCount);
  end;
  TIFFClose(OpenTiff);
  FreeMem(StripMemory);
end;


Als Input habe ich ein Timage mit einem 1-Bit-Bitmap verwendet. Das funktioniert soweit ganz gut - bis auf die Tatsache, daß das Output-File ein Fotonegativ (Schwarz & Weiss vertauscht) des Inputs ist.... kann mir jemand erklären, wieso? Habe bereits die verschiedenen Komprimierungs-Formate durchprobiert, ebenso auf Komprimierung gänzlich verzichtet, das Ergebnis bleibt jedoch stets das gleiche...

Please help me!!!!

LG
Frank

Moderiert von user profile iconUGrohne: Delphi-Tags hinzugefügt.
wulfskin
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1349
Erhaltene Danke: 1

Win XP
D5 Pers (SSL), D2005 Pro, C, C#
BeitragVerfasst: Di 26.09.06 10:30 
Da hier so viele Probleme mit dem Umwandeln haben: Wo finde ich diese Komponente samt Header?

Edit: Wurde wohl schon gelöst: www.delphi-forum.de/...58ba262dd580700c6f64.

Gruß Hape!

_________________
Manche antworten um ihren Beitragszähler zu erhöhen, andere um zu Helfen.
Fraengie Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Di 26.09.06 15:44 
Gelöst wurde das Problem bisher nicht... der angegebene Thread behandelt eine andere, ähnliche Thematik. Jedoch besteht mein Problem nicht darin, ein Tif zu lesen, sondern es korrekt zu schreiben.
F34r0fTh3D4rk
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 5285
Erhaltene Danke: 29

Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
BeitragVerfasst: Di 26.09.06 15:46 
scheinbar dürfen nur 1bit bitmaps verwendet werden:
ausblenden Delphi-Quelltext
1:
2:
3:
  if (Bitmap.PixelFormat<>pf1bit) then
    raise Exception.Create('WriteBitmapToTiff is designed for singlebit
                    bitmaps only'
);

also nur S/W

oder sehe ich was falsch ?

EDIT: ah habs gelesen, ja ist gut ;)

naja kopiert wird soweit ich das sehe in der zeile hier:
ausblenden Delphi-Quelltext
1:
      CopyMemory(mb,Bitmap.ScanLine[ny],RowSize);					


vielleicht schaffst du es, dass irgendwie zu negieren. ich vermute mal, dass hier mit bytes gearbeitet werden, obwohl es ja 1 bit pro pixel sind, deshalb kann man net einfach aus schwarz weiß machen und umgekehrt. du kannst mal not oder so probieren, aber ich weiß net, ob das bei bytes was bringt.

mfg