2013-01-15 25 views
10

Mam serwer, który przechowuje obrazy TIFF. Większość klientów może czytać i wyświetlać obrazy TIFF, więc nie ma problemu. Jednak niektórzy klienci nie mogą obsłużyć tego formatu, ale mogą obsługiwać JPG. Pomyślałem o użyciu biblioteki GD PHP do konwersji po stronie serwera dla klientów bez umiejętności czytania TIFF. Ale zauważyłem, że GD nie może również czytać plików TIFF.Konwertuj tiff na jpg w php?

Imagick nie działa w systemie Windows, moim pomysłem było stworzenie imageFetcher.php, który dostaje jako parametr rzeczywisty obraz, jakiego chce klient. Sprawdza typ klienta iw razie potrzeby konwertuje obraz i wyprowadza JPG, w przeciwnym razie po prostu wypuszcza TIFF.

czy ktoś ma jakiś pomysł na to, jak mógłbym zrobić coś takiego?

Z góry dziękuję.

+1

Spójrz na Image Magick –

+0

W żadnym wypadku nie powinieneś używać plików TIFF do wyświetlania stron internetowych, które nie mają kompresji, więc powodują, że użytkownicy muszą pobierać dodatkowe bajty (i oczywiście powodują problemy) w niektórych przeglądarkach klienckich). –

+0

@MikeBrant Kto powiedział, że używa ich w kontekście sieciowym? To, że serwer HTTP jest używany, nie oznacza, że ​​znajduje się on na stronie internetowej. Co zrobić, jeśli współpracują z dostawcami, którzy potrzebują plików TIFF, a oni po prostu przenoszą je przez http? –

Odpowiedz

10

Na forum na http://www.php.net/gd następujący komentarz jest napisane:

IE nie pokazuje plików TIFF i standardowy rozkład PHP nie obsługuje konwersji do/z TIFF.

ImageMagick (http://www.imagemagick.org/script/index.php) to darmowe oprogramowanie do odczytu, konwersji i zapisu obrazów w wielu różnych formatach. Dla użytkowników Windows zawiera rozszerzenie PHP php_magickwand_st.dll (i tak, działa pod PHP 5.0.4).

Podczas konwersji z TIFF na JPEG, należy również przekonwertować przestrzeń kolorów CMYK na przestrzeń barw RGB, ponieważ IE nie może wyświetlać również CMYK JPG. Uwaga: -TIFF pliki mogą mieć RGB lub CMYK przestrzeń -JPEG pliki mogą mieć RGB lub CMYK przestrzeń kolorów

Oto przykładowe funkcje wykorzystujące ImageMagick rozszerzenia: - Konwersja TIFF do formatów JPEG - konwersja do CMIK przestrzeń kolorów RGB - zestaw rozdzielczości obrazu do 300 DPI (nie zmienia rozmiar obrazu w pikselach)

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

?> 

Uwaga - Chociaż ImageMagick poprawnie ustawia JPEG rozdzielczość 300 DPI, niektóre programy mogą nie zauważyć.

ELSE

Użyj "Imagick" rozszerzenie PECL

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

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

zależności od źródeł i miejsc docelowych (pliki? Adresy URL? Http odpowiedzi?) Zrobisz coś takiego:

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

LUB

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

Spójrz na część ELSE. Wspomniałem też na górze, gdzie zostało zrobione "Na forum pod adresem http://www.php.net/gd napisano następujący komentarz:" – Techie

2

I rozwiązać to za pomocą "Convert" i ImageMagick, zamiast konieczności instalowania go jako DLL. To była najlepsza decyzja, ponieważ rozwiązała problem również w przypadku plików PDF. Więc po prostu użyć:

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

[0] jest tam dla plików PDF, tak będzie zawsze na pierwszej stronie, ale działa jak jest zbyt TIFF.

Wszystko czego potrzebujesz teraz to "konwertować" na komputerze z systemem Windows, a powyższy PHP będzie działał dla obu. Po prostu zainstaluj this.