2013-01-15 28 views
10

Tôi có một máy chủ chứa hình ảnh TIFF. Hầu hết khách hàng có thể đọc và hiển thị hình ảnh TIFF, do đó, không có vấn đề gì. Tuy nhiên, một số khách hàng không thể xử lý định dạng này nhưng có thể xử lý JPG. Tôi đã nghĩ đến việc sử dụng thư viện GD của PHP để thực hiện chuyển đổi phía máy chủ cho các khách hàng không có khả năng đọc TIFF. Nhưng tôi nhận thấy GD không thể đọc tệp TIFF.Chuyển đổi tiff sang jpg trong php?

Hình ảnh không hoạt động trong cửa sổ, Ý tưởng của tôi là tạo một imageFetcher.php lấy làm tham số hình ảnh thực tế mà khách hàng muốn. Nó kiểm tra loại của khách hàng và nếu cần thiết chuyển đổi hình ảnh và xuất ra một JPG, nếu không nó chỉ đơn giản là kết quả đầu ra TIFF.

có ai có ý tưởng nào về cách tôi có thể làm một việc như vậy không?

Xin cảm ơn trước.

+1

Hãy xem hình ảnh Magick –

+0

Bạn không nên sử dụng các tệp TIFF để hiển thị trên web mà chúng không có bất kỳ loại nén nào khiến người dùng của bạn phải tải xuống thêm byte (và rõ ràng là gây ra sự cố cho bạn) với một số trình duyệt của khách hàng). –

+0

@MikeBrant Ai nói rằng họ đang sử dụng chúng trong ngữ cảnh web? Chỉ vì một máy chủ http đang được sử dụng không có nghĩa là chúng đang ở trên một trang web. Điều gì sẽ xảy ra nếu họ đang làm việc với các nhà cung cấp cần tệp TIFF và họ chỉ tình cờ chuyển chúng qua http? –

Trả lời

10

Trong diễn đàn tại http://www.php.net/gd những nhận xét sau đây được viết:

IE không hiển thị các tập tin TIFF và phân phối PHP chuẩn không hỗ trợ chuyển đổi sang/từ TIFF.

ImageMagick (http://www.imagemagick.org/script/index.php) là phần mềm miễn phí có thể đọc, chuyển đổi và ghi hình ảnh ở nhiều định dạng khác nhau. Đối với người dùng Windows, nó bao gồm một phần mở rộng PHP php_magickwand_st.dll (và có, nó chạy dưới PHP 5.0.4).

Khi chuyển đổi từ TIFF sang JPEG, bạn cũng phải chuyển đổi từ không gian màu CMYK sang không gian màu RGB vì IE không thể hiển thị JPG của CMYK. Xin lưu ý: file -TIFF có RGB hoặc màu CMYK không gian file -JPEG có RGB hoặc CMYK không gian màu

Dưới đây là chức năng ví dụ sử dụng ImageMagick mở rộng: - chuyển đổi TIFF sang các định dạng tập tin JPEG - chuyển đổi CMIK để RGB màu không gian - set độ phân giải hình ảnh 300 DPIs (không thay đổi kích thước hình ảnh bằng pixel)

<?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 />"; 

?> 

Lưu ý - Mặc dù ImageMagick đặt một cách chính xác JPEG độ phân giải file đến 300 Sở KHĐT, một số chương trình có thể không nhận thấy nó.

ELSE

Sử dụng "imagick" mở rộng PECL

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

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

Tùy thuộc vào nguồn và điểm đến (file? Url? Http phản ứng?), Bạn sẽ làm một cái gì đó như:

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

HOẶC

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

Nhìn vào phần ELSE. Ngoài ra tôi đã đề cập ở trên cùng, nơi nó đã được thực hiện "Trong diễn đàn tại http://www.php.net/gd bình luận sau đây được viết:" – Techie

2

tôi giải quyết này sử dụng "chuyển đổi" và ImageMagick, thay vì phải cài đặt nó như là một DLL. Đó thực sự là quyết định tốt nhất từ ​​trước tới giờ, bởi vì nó cũng giải quyết được vấn đề cho các tệp PDF. Vì vậy, tôi chỉ cần sử dụng:

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

[0] có sẵn cho tệp PDF, vì vậy nó luôn có trang đầu tiên, nhưng nó cũng hoạt động như đối với TIFF.

Tất cả những gì bạn cần bây giờ là phải 'chuyển đổi' trên Máy Windows của bạn và PHP ở trên sẽ hoạt động cho cả hai. Vì vậy, chỉ cần cài đặt this.