Združevanje TIFF datotek

Odpiranje, tiskanje, pisanje v datoteke in drugo.
Parodius
Prispevkov: 64
Pridružen: 02.09.2002 10:52:24

Združevanje TIFF datotek

OdgovorNapisal/-a Parodius » 11.09.2008 15:54:40

Pozdrav

Problem je tak ... imam več eno stranskih TIFF datotek, zdaj pa bi to rad združil v enega več stranskega. Uporabljam ImageEn komponente.

Koda zgleda nekak tak

Stream: TMemoryStream;
ieViewTemp: TImageEnDBView

ieViewTemp.SaveSelectionToStream(Stream); // to mi vredu povečuje stream
(tabPredogled.FieldByName('Vsebina') as TBlobField).LoadFromStream(Stream); //tukaj shranim v bazo

ko preberem iz baze je vsebina prazna.

prosim za pomoč

Hvala

Uporabniški avatar
Runner
Prispevkov: 1079
Pridružen: 03.02.2005 12:05:25

Združevanje TIFF datotek

OdgovorNapisal/-a Runner » 11.09.2008 20:22:36

ieViewTemp.SaveSelectionToStream(Stream); // to mi vredu povečuje stream
Stream.Position := 0;
(tabPredogled.FieldByName('Vsebina') as TBlobField).LoadFromStream(Stream); //tukaj shranim v bazo

Manjka ti to da pozicijo v streamu postaviš na začetek. Vsaj na prvo oko se mi zdi da bo tole narobe.
Zadnjič spremenil Runner, dne 11.09.2008 20:22:50, skupaj popravljeno 1 krat.

Parodius
Prispevkov: 64
Pridružen: 02.09.2002 10:52:24

Združevanje TIFF datotek

OdgovorNapisal/-a Parodius » 12.09.2008 09:41:18

Ja ne bo to ... ker ce postavim Stream.Position := 0; potem lahko v stream shranim samo eno sliko oz. drugace povedano z vsako novo prepise prejsno.

Uporabniški avatar
Runner
Prispevkov: 1079
Pridružen: 03.02.2005 12:05:25

Združevanje TIFF datotek

OdgovorNapisal/-a Runner » 12.09.2008 09:52:12

Glej, nekako takole bi ti moral tole narediti. Pseudo Koda:

Koda: Izberi vse

 
  Image1.SaveToStream(MemoryStream);
  Image2.SaveToStream(MemoryStream);
  Image3.SaveToStream(MemoryStream);
  Image4.SaveToStream(MemoryStream);
  Image5.SaveToStream(MemoryStream);
  MemoryStream.Position := 0;
  (tabPredogled.FieldByName('Vsebina') as TBlobField).LoadFromStream(MemoryStream); //tukaj shranim v bazo


Zdaj je seveda odvisno kako so implementirane procedure ki sem jih napisal. Itak lahko v nasprotnem primeru kombiniraš z dvemi Stream-i. Ampak še vedno mislim da je to problem. V nasprotnem primeru pokaži več kode. Iz dveh vrstic lahko sklepam samo to.
Zadnjič spremenil Runner, dne 12.09.2008 09:52:37, skupaj popravljeno 1 krat.

Uporabniški avatar
Lee_Nover
Prispevkov: 3653
Pridružen: 20.05.2001 14:31:55

Združevanje TIFF datotek

OdgovorNapisal/-a Lee_Nover » 16.09.2008 22:41:19

vecstranski tiff se pa ne dela tako ... za vsako stran moras narest nov directory, potem pa v njega pises vrstice.
jaz uporabljam LibTiff + TiffImage helper za shranjevanje vecstranskih tiffov.

pa se koda (samo multipage, da je krajse):

Koda: Izberi vse

unit TiffImage;

interface

uses Windows, Sysutils, Classes, LibTiffDelphi, Graphics;

type
  TBitmapArray = array of TBitmap;

procedure WriteBitmapsToTiffStream(const Bitmaps: TBitmapArray; const Stream: TStream);

implementation

{

  Original by Joris Van Damme
  http://www.asmail.be/msg0055033258.html
  +
  http://www.asmail.be/msg0054866090.html

  Modified by Lee_Nover

}

procedure WriteBitmapsToTiffStream(const Bitmaps: TBitmapArray; const Stream: TStream);
var
  OpenTiff: PTIFF;
  RowsPerStrip: Integer;
  StripMemory: Pointer;
  StripIndex: Integer;
  StripRowOffset: Integer;
  StripRowCount: Integer;
  ma, mb: PByte;
  nx, ny: Integer;
  SamplesPP: Integer;
  RowSize: Integer;
  PhotoMetric: Integer;
  BPP: Integer;
  Compression: Integer;
  IncAmount: Integer;
  Bitmap: TBitmap;
  I: Integer;
begin
  OpenTiff := TIFFOpenStream(Stream, 'w');
  if OpenTiff = nil then
  begin
//    FreeMemory(StripMemory);
    raise Exception.Create('Unable to open stream');
  end;

  StripMemory := nil;

  for I := 0 to High(Bitmaps) do
  begin
    Bitmap := Bitmaps[I];
    if Bitmap.Empty or (Bitmap.Width < 2) then
      Continue;

    if not (Bitmap.PixelFormat in [pf1bit, pf24bit, pf32bit]) then
      Bitmap.PixelFormat := pf24bit;
      //raise Exception.Create('WriteBitmapToTiff is designed for 1bit, 24bit and 32bit bitmaps only');

    case Bitmap.PixelFormat of
      pf1bit:
        begin
          SamplesPP := 1;
          RowSize := (Bitmap.Width + 7) div 8;
          PhotoMetric := PHOTOMETRIC_MINISWHITE;
          BPP := 1;
          Compression := COMPRESSION_CCITTFAX4;
          IncAmount := RowSize;
        end;

      {pf24bit,
      pf32bit:}
    else
      begin
        SamplesPP := 3;
        RowSize := Bitmap.Width * 3;
        PhotoMetric := PHOTOMETRIC_RGB;
        BPP := 8;
        Compression := COMPRESSION_LZW;
        if Bitmap.PixelFormat = pf24bit then
          IncAmount := 3
        else
          IncAmount := 4;
      end;
    end;

    if RowSize = 0 then
      raise Exception.Create('Invalid bitmap');

    RowsPerStrip := (256 * 1024) div RowSize;
    if RowsPerStrip > Bitmap.Height then
      RowsPerStrip := Bitmap.Height
    else if RowsPerStrip = 0 then
      RowsPerStrip := 1;
    ReallocMem(StripMemory, RowsPerStrip * RowSize);

    TIFFSetField(OpenTiff, TIFFTAG_SUBFILETYPE, FILETYPE_PAGE);
    TIFFSetField(OpenTiff, TIFFTAG_OSUBFILETYPE, OFILETYPE_PAGE);
    TIFFSetField(OpenTiff, TIFFTAG_PAGENUMBER, I+1);

    TIFFSetField(OpenTiff, TIFFTAG_IMAGEWIDTH, Bitmap.Width);
    TIFFSetField(OpenTiff, TIFFTAG_IMAGELENGTH, Bitmap.Height);
    TIFFSetField(OpenTiff, TIFFTAG_PHOTOMETRIC, PhotoMetric);
    TIFFSetField(OpenTiff, TIFFTAG_SAMPLESPERPIXEL, SamplesPP);
    TIFFSetField(OpenTiff, TIFFTAG_BITSPERSAMPLE, BPP);
    TIFFSetField(OpenTiff, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG);
    TIFFSetField(OpenTiff, TIFFTAG_COMPRESSION, Compression);
    TIFFSetField(OpenTiff, TIFFTAG_PREDICTOR, 2);
    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;
      if Bitmap.PixelFormat = pf1bit then
      begin
        for ny := StripRowOffset to StripRowOffset + StripRowCount - 1 do
        begin
          CopyMemory(mb, Bitmap.ScanLine[ny], RowSize);
          Inc(mb, RowSize);
        end;
      end
      else
      begin
        for ny := StripRowOffset to StripRowOffset + StripRowCount - 1 do
        begin
          ma := Bitmap.ScanLine[ny];
          for nx := 0 to Bitmap.Width-1 do
          begin
            mb^ := PByte(Cardinal(ma) + 2)^;
            Inc(mb);
            mb^ := PByte(Cardinal(ma) + 1)^;
            Inc(mb);
            mb^ := PByte(Cardinal(ma) + 0)^;
            Inc(mb);
            Inc(ma, IncAmount);
          end;
        end;
      end;

      if TIFFWriteEncodedStrip(OpenTiff, StripIndex,
        StripMemory, StripRowCount * RowSize) = -1 then
      begin
        TIFFClose(OpenTiff);
        FreeMemory(StripMemory);
        raise Exception.Create('Failed to write to stream');
      end;
      Inc(StripIndex);
      Inc(StripRowOffset, StripRowCount);
    end;
    TIFFWriteDirectory(OpenTiff);
  end;

  TIFFClose(OpenTiff);
  FreeMem(StripMemory);
end;

end.
.. my 2 c ..
- I hate noobs -

Uporabniški avatar
Runner
Prispevkov: 1079
Pridružen: 03.02.2005 12:05:25

Združevanje TIFF datotek

OdgovorNapisal/-a Runner » 17.09.2008 07:26:25

No super, evo rešitev. Jaz nikoli nisem delal s tiff formatom (programabilno). Samo videl sem da stream positiona ni postavil na začetek :D

Parodius
Prispevkov: 64
Pridružen: 02.09.2002 10:52:24

Združevanje TIFF datotek

OdgovorNapisal/-a Parodius » 19.09.2008 10:38:34

hvala za pomoc.


Vrni se na

Kdo je na strani

Po forumu brska: 0 registriranih uporabnikov in 3 gostov