PHP Imagick - 显示多图像 TIFF 的第一片

PHP Imagick - display first slice of mutli image TIFF

我正在尝试在我的 HTML 页面中显示多图像 TIFF 的第一个切片。因此,我尝试使用 Imagemagick 以某种方式将 TIFF 转换为广泛支持的格式,如 JPG 或 PNG。我正在使用以下代码:

<?php 
$im = new imagick('my_image.tif');
$im->setImageFormat('jpeg');

header("Content-Type: image/jpeg");
ob_start();
$thumbnail = $im->getImageBlob();
$contents =  ob_get_contents();
ob_end_clean();

echo "<img src='data:image/jpg;base64,".base64_encode($thumbnail)."' />";

 ?>

此代码在读取 JPG 文件时工作正常 - 但对于 TIFF 文件,它会显示一些内容 - 但不是我的 TIFF 文件的内容。我想我必须提交 TIFF 文件属性,就像我创建它们时一样? TIFF 文件是在这样的 C 程序中创建的:

 TIFF* tif;
 tif = TIFFOpen(filename, "w");
 TIFFSetField(tif, TIFFTAG_IMAGEWIDTH, columns);
 TIFFSetField(tif, TIFFTAG_IMAGELENGTH, rows);
 TIFFSetField(tif, TIFFTAG_SAMPLESPERPIXEL, 1);
 TIFFSetField(tif, TIFFTAG_BITSPERSAMPLE, 32);
 TIFFSetField(tif, TIFFTAG_SAMPLEFORMAT, SAMPLEFORMAT_IEEEFP);

 for (i = 0; i < rows; i++)
     TIFFWriteScanline(tif, &data[i * columns], i, 0);

 TIFFWriteDirectory(tif);
 TIFFClose(tif);

如何正确转换它以显示在我的网页上?此外,如何选择要显示的图像?理想情况下,网页的用户将能够滚动浏览 TIFF 文件的切片。谢谢!

如果您有多页 TIFF,您可以通过将页码(从零开始索引)放在文件名后的方括号中来提取特定页面,因此对于前两页:

convert multipage.tif[0] page1.jpg
convert multipage.tif[1] page2.jpg

我不记得获取页数的简单方法,但你可以运行这个并计算行数,直到我记住:-)

identify multipage.tif
multipage.tif[0] TIFF 1x1 1x1+0+0 16-bit sRGB 830B 0.000u 0:00.000
multipage.tif[1] TIFF 1x1 1x1+0+0 16-bit sRGB 830B 0.000u 0:00.000
multipage.tif[2] TIFF 1x1 1x1+0+0 16-bit sRGB 830B 0.000u 0:00.000

那个有 3 页,编号为 0-2。

如果您从 C 创建 TIFF 图像,请确保定义了以下标签,或者至少设置为默认值。

  • TIFFTAG_IMAGEWIDTH
  • TIFFTAG_IMAGELENGTH
  • TIFFTAG_COMPRESSION
  • TIFFTAG_FILLORDER
  • TIFFTAG_PLANARCONFIG
  • TIFFTAG_SAMPLESPERPIXEL
  • TIFFTAG_BITSPERSAMPLE
  • TIFFTAG_SAMPLEFORMAT
  • TIFFTAG_MINSAMPLEVALUE
  • TIFFTAG_MAXSAMPLEVALUE
  • TIFFTAG_PHOTOMETRIC

请参阅 coders/tiff.c 中的 header 检查以确保 tiff-file 生成对 ImageMagick 使用有效。

我只能建议在 C 中创建一个快速 header 验证/转储程序,以发现哪个 header 没有正确默认,并调整 TIFF 生成程序。