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.