web-dev-qa-db-ja.com

phpでtiffをjpgに変換しますか?

TIFF画像を保持するサーバーがあります。ほとんどのクライアントはTIFF画像を読み取って表示できるため、問題はありません。ただし、一部のクライアントはこの形式を処理できませんが、JPGは処理できます。 PHPのGdライブラリを使用して、TIFF読み取り機能のないクライアントのサーバー側変換を行うことを考えました。しかし、GdはTIFFファイルも読み取れないことに気づきました。

ImagickがWindowsで機能していません。私のアイデアは、クライアントが必要とする実際の画像をパラメーターとして取得するimageFetcher.phpを作成することでした。クライアントのタイプをチェックし、必要に応じて画像を変換してJPGを出力します。それ以外の場合は、単にTIFFを出力します。

誰かが私がそのようなことをどのように行うことができるかについて何か考えを持っていますか?

前もって感謝します。

13
Ramesh

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で実行されます)。

IEもCMYKJPGを表示できないため、TIFFからJPEGに変換する場合は、CMYK色空間からRGB色空間にも変換する必要があります。注意:-TIFFファイルにはRGBまたはCMYKカラースペースがある場合があります-JPEGファイルにはRGBまたはCMYKカラースペースがある場合があります

ImageMagick拡張機能を使用した関数の例を次に示します。-TIFFをJPEGファイル形式に変換します-CMIKをRGB色空間に変換します-画像の解像度を300DPIに設定します(画像サイズをピクセル単位で変更しません)

<?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ファイルの解像度を300DPIに正しく設定しますが、一部のプログラムはそれに気付かない場合があります。

[〜#〜] else [〜#〜]

「imagick」PECL拡張機能を使用する

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

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

ソースと宛先(ファイル?URL?http応答?)に応じて、次のようなことを行います。

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

OR

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

DLLとしてインストールするのではなく、「convert」とImageMagickを使用してこれを解決しました。 PDFの問題も解決したので、これは実際にはこれまでで最高の決定でした。だから私は単に使用します:

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

[0]はPDFの場合に存在するため、常に最初のページになりますが、TIFFの場合も同様に機能します。

今必要なのは、Windowsマシンで「変換」することだけです。上記のPHPは両方で機能します。したがって、単にインストール this

3
coderama

チフスは複数のページを持つことができるため、より包括的なアプローチが必要です。次に例を示します。

    //given uploaded file $filename    
    $ext = strtolower(substr($filename, strrpos($filename, '.') + 1));

    if ($ext == 'tif' || $ext == 'tiff') {
        $images = new Imagick($upload_path . $filename);

        //if you want to delete the original tif
        unlink($upload_path . $filename);

        $name = strtolower(substr($filename, 0, strrpos($filename, '.')));
        $filename = $name . '.png';
        foreach ($images as $i => $image) {
            $image->setImageFormat("png");
            $image->writeImage($upload_path . $i . $filename);
        }
    }