2013-01-15 187 views
10

我有一臺保存TIFF圖像的服務器。大多數客戶可以閱讀和顯示TIFF圖像,所以沒有問題。但是,有些客戶端無法處理這種格式,但可以處理JPG。 我想過使用PHP的GD庫爲沒有TIFF閱讀能力的客戶端進行服務器端轉換。但我注意到GD也無法讀取TIFF文件。在tiff中將tiff轉換爲jpg?

Imagick不工作在Windows中,我的想法是創建一個imageFetcher.php作爲參數客戶端需要的實際圖像。它檢查客戶端的類型,如果需要轉換圖像並輸出JPG,否則它只輸出TIFF。

沒有人對我如何做這樣的事情有任何想法嗎?

在此先感謝。

+1

看看Image Magick –

+0

你不應該使用TIFF文件進行網頁顯示,他們不會使用任何形式的壓縮,所以只會導致你的用戶不得不下載額外的字節(並且顯然會導致你的問題與一些客戶端瀏覽器)。 –

+0

@MikeBrant誰說他們在web上下文中使用它們?僅僅因爲正在使用http服務器並不意味着他們在網站上。如果他們正在與需要TIFF文件的供應商合作,而他們恰好正在通過http傳輸它們呢? –

回答

10

在論壇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

根據來源和目的地(文件?網址嗎?HTTP響應?),你會做例如:

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

OR

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

看看ELSE部分。另外我在頂部提到了它的地方:「在http://www.php.net/gd的論壇上寫下如下評論:」 – Techie

2

我解決了這個使用 「轉換」 和ImageMagick的,而不是把它安裝一個DLL。這實際上是有史以來最好的決定,因爲它也解決了PDF的問題。於是我簡單地使用:

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

的[0]是有PDF文件,所以它總是會在第一頁,但它可以作爲對TIFF了。

現在您只需要在Windows計算機上進行「轉換」,上面的PHP就可以同時使用。所以只需安裝this即可。