webentwicklung-frage-antwort-db.com.de

Tiff zu jpg in php konvertieren?

Ich habe einen Server, der TIFF-Bilder enthält. Die meisten Clients können TIFF-Bilder lesen und anzeigen, sodass dies kein Problem darstellt. Einige Clients können dieses Format jedoch nicht verarbeiten, jedoch JPG. Ich dachte daran, PHPs Gd-Bibliothek zu verwenden, um eine serverseitige Konvertierung für Clients ohne TIFF-Lesefähigkeit durchzuführen. Aber ich bemerkte, dass Gd auch keine TIFF-Dateien lesen kann.

Imagick funktioniert nicht unter Windows. Meine Idee war es, eine imageFetcher.php zu erstellen, die als Parameter das tatsächliche Bild erhält, das der Client wünscht. Es prüft den Typ des Clients und konvertiert bei Bedarf das Bild und gibt eine JPG aus, ansonsten gibt es einfach das TIFF aus.

hat jemand eine Idee, wie ich so etwas machen könnte?

Danke im Voraus.

11
Ramesh

Im Forum unter http://www.php.net/Gd steht folgender Kommentar:

IE zeigt keine TIFF-Dateien an und die PHP -Standardverteilung unterstützt keine Konvertierung in/aus TIFF.

ImageMagick ( http://www.imagemagick.org/script/index.php ) ist eine kostenlose Software, die Bilder in einer Vielzahl von Formaten lesen, konvertieren und schreiben kann. Für Windows-Benutzer enthält es die Erweiterung PHP php_magickwand_st.dll (und ja, sie wird unter PHP 5.0.4 ausgeführt).

Beim Konvertieren von TIFF nach JPEG müssen Sie auch den CMYK-Farbraum in den RGB-Farbraum konvertieren, da IE auch CMYK-JPGs nicht anzeigen kann. Hinweis: -TIFF-Dateien können einen RGB- oder CMYK-Farbraum haben. -JPEG-Dateien können einen RGB- oder CMYK-Farbraum haben

Hier sind Beispielfunktionen, die die ImageMagick-Erweiterung verwenden: - Konvertieren von TIFF in JPEG-Dateiformate - Konvertieren von CMIK in RGB-Farbraum - Festlegen der Bildauflösung auf 300 DPIs (Ändern der Bildgröße in Pixel nicht)

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

?>

Hinweis - Obwohl ImageMagick die Auflösung von JPEG-Dateien korrekt auf 300 DPIs einstellt, bemerken dies einige Programme möglicherweise nicht.

ELSE

Verwenden Sie die PECL-Erweiterung "imagick"

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

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

Abhängig von den Quellen und Zielen (Dateien? URLs? HTTP-Antwort?) Werden Sie Folgendes tun:

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

OR

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

Ich habe dies mit "convert" und ImageMagick gelöst, anstatt es als DLL installieren zu müssen. Welches war eigentlich die beste Entscheidung aller Zeiten, da es das Problem auch für PDFs löste. Also benutze ich einfach:

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

Die [0] ist für PDF-Dateien vorhanden, nimmt also immer die erste Seite auf, funktioniert aber auch für TIFF.

Alles, was Sie jetzt brauchen, ist, "convert" auf Ihrem Windows-Rechner zu haben, und das obige PHP funktioniert für beide. Also einfach this installieren.

3
coderama

Tifs können mehr als eine Seite haben, daher ist ein umfassenderer Ansatz erforderlich. Hier ist ein Beispiel:

    //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);
        }
    }
1
ykay