Преобразование tiff в jpg в php?

У меня есть сервер, на котором хранятся TIFF-изображения. Большинство клиентов могут читать и отображать TIFF-изображения, поэтому проблем нет. Однако некоторые клиенты не могут обрабатывать этот формат, но могут обрабатывать JPG. Я думал об использовании библиотеки PHP GD для преобразования на стороне сервера для клиентов без возможностей чтения TIFF. Но я заметил, что GD также не может читать файлы TIFF.

Imagick не работает в Windows, моя идея состояла в создании imageFetcher.php, который получает в качестве параметра фактическое изображение, которое хочет клиент. Он проверяет тип клиента и при необходимости преобразует изображение и выводит JPG, иначе он просто выводит TIFF.

Кто-нибудь знает, как я могу это сделать?

Спасибо заранее.

Ответ 1

В форуме на http://www.php.net/gd написан следующий комментарий:

IE не отображает файлы TIFF, а стандартный дистрибутив PHP не поддерживает преобразование в/из TIFF.

ImageMagick (http://www.imagemagick.org/script/index.php) - бесплатное программное обеспечение, которое может читать, конвертировать и писать изображения в большом разнообразии форматов. Для пользователей Windows он включает расширение PHP php_magickwand_st.dll(и да, он работает под PHP 5.0.4).

При преобразовании из TIFF в JPEG вы также должны преобразовать из цветового пространства CMYK в цветовое пространство RGB, так как IE не может показывать CMYK JPG. Пожалуйста, обратите внимание: Файлы -TIFF могут иметь цветовое пространство RGB или CMYK -JPEG могут иметь цветовое пространство RGB или CMYK

Вот пример функций с использованием расширения ImageMagick: - конвертировать TIFF в форматы файлов JPEG - конвертировать CMIK в цветовое пространство RGB - установить разрешение изображения до 300 DPI (не изменяет размер изображения в пикселях)

<?php

function cmyk2rgb($file) {
    $mgck_wnd = NewMagickWand();
    MagickReadImage($mgck_wnd, $file);

    $img_colspc = MagickGetImageColorspace($mgck_wnd);
    if ($img_colspc == MW_CMYKColorspace) {
        echo "$file was in CMYK format<br />";
        MagickSetImageColorspace($mgck_wnd, MW_RGBColorspace);
    }
    MagickWriteImage($mgck_wnd, str_replace('.', '-rgb.', $file));
}

function tiff2jpg($file) {
    $mgck_wnd = NewMagickWand();
    MagickReadImage($mgck_wnd, $file);

    $img_colspc = MagickGetImageColorspace($mgck_wnd);
    if ($img_colspc == MW_CMYKColorspace) {
        echo "$file was in CMYK format<br />";
        MagickSetImageColorspace($mgck_wnd, MW_RGBColorspace);
    }
    MagickSetImageFormat($mgck_wnd, 'JPG' );
    MagickWriteImage($mgck_wnd, str_replace('.tif', '.jpg', $file));
}

function to300dpi($file) {
    $mgck_wnd = NewMagickWand();
    MagickReadImage($mgck_wnd, $file);
    $img_units = MagickGetImageUnits($mgck_wnd);
    switch ($img_units) {
        case MW_UndefinedResolution: $units= 'undefined'; break;
        case MW_PixelsPerInchResolution: $units= 'PPI'; break;
        case MW_PixelsPerCentimeterResolution: $units= 'PPcm'; break;
    }
    list($x_res, $y_res) = MagickGetImageResolution($mgck_wnd);
    echo "$file<br /> x_res=$x_res $units - y_res=$y_res $units<br />";
    if($x_res == 300 && $y_res == 300 && $img_units == MW_PixelsPerInchResolution) {return; }
    MagickSetImageResolution($mgck_wnd, 300 , 300);
    MagickSetImageUnits($mgck_wnd, MW_PixelsPerInchResolution);
    MagickWriteImage($mgck_wnd, str_replace('.', '-300.', $file));
}

$file='photos/test-cmyk.tif';
//this is a TIFF file in CMYK format with a 96 DPI resolution

cmyk2rgb($file);
$file = str_replace('.', '-rgb.', $file);

to300dpi($file);
$file = str_replace('.', '-300.', $file);

tiff2jpg($file);
$file = str_replace('.tif', '.jpg', $file);

to300dpi($file);
/* no file name changes as ImageMagick reports 300 DPIs
$file = str_replace('.', '-300.', $file);
*/

list($width, $height, $type, $attr) = getimagesize($file);
$width = $width/3;
$height = $height/3;
echo "<img src=\"http://localhost/$file\" width=\"$width\" height=\"$height\" alt=\"getimagesize() example\" />";
echo "<br />$file => width=$width - height=$height - type=$type - attr=$attr<br /><br />";

$file='photos/test-rgb.tif';
//this is a TIFF file in RGB format with a 96 DPI resolution

cmyk2rgb($file);
$file = str_replace('.', '-rgb.', $file);

to300dpi($file);
$file = str_replace('.', '-300.', $file);

tiff2jpg($file);
$file = str_replace('.tif', '.jpg', $file);

to300dpi($file);
/* no file name changes as ImageMagick reports 300 DPIs
$file = str_replace('.', '-300.', $file);
*/

list($width, $height, $type, $attr) = getimagesize($file);
$width = $width/3;
$height = $height/3;
echo "<img src=\"http://localhost/$file\" width=\"$width\" height=\"$height\" alt=\"getimagesize() example\" />";
echo "<br />$file => width=$width - height=$height - type=$type - attr=$attr<br /><br />";

?>

Примечание. Хотя ImageMagick правильно устанавливает разрешение файлов JPEG на 300 DPI, некоторые программы могут его не заметить.

ELSE

Используйте расширение "imagick" PECL

http://pecl.php.net/package/imagick

http://php.net/manual/en/book.imagick.php

В зависимости от источников и адресатов (файлы? urls? http-ответ?) вы сделаете что-то вроде:

 $image = new Imagick('something.tiff');
    $image->setImageFormat('png');
    echo $image;

ИЛИ

$image->writeImage('something.png');

Ответ 2

Я решил это с помощью "convert" и ImageMagick, вместо того, чтобы устанавливать его как DLL. На самом деле это было лучшее решение, потому что оно решило проблему для PDF файлов. Поэтому я просто использую:

$command = "convert ".$filename."[0] ".$destination;
exec($command);

[0] существует для PDF файлов, поэтому он всегда будет на первой странице, но он работает так же, как и для TIFF.

Теперь вам нужно иметь "конвертировать" на вашу Windows-машину, и вышеприведенный PHP будет работать для обоих. Поэтому просто установите this.