Convert tiff to jpg in php?

后端 未结 3 641
梦如初夏
梦如初夏 2020-11-30 08:10

I have a server which holds TIFF images. Most clients can read and display TIFF images, so there\'s no problem. However, some clients can\'t handle this format but can handl

相关标签:
3条回答
  • 2020-11-30 08:21

    In the forum at http://www.php.net/gd the following comment is written:

    IE doesn't show TIFF files and standard PHP distribution doesn't support converting to/from TIFF.

    ImageMagick (http://www.imagemagick.org/script/index.php) is a free software that can read, convert and write images in a large variety of formats. For Windows users it includes a PHP extension php_magickwand_st.dll (and yes, it runs under PHP 5.0.4).

    When converting from TIFF to JPEG, you must also convert from CMYK color space to RGB color space as IE can't show CMYK JPGs either. Please note: -TIFF files may have RGB or CMYK color space -JPEG files may have RGB or CMYK color space

    Here are example functions using ImageMagick extension: - convert TIFF to JPEG file formats - convert CMIK to RGB color space - set image resolution to 300 DPIs (doesn't change image size in pixels)

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

    Note - Although ImageMagick correctly sets JPEG files resolution to 300 DPIs, some programs might not notice it.

    ELSE

    Use the "imagick" PECL extension

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

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

    Depending on sources and destinations (files? urls? http response?) you'll do something like:

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

    OR

    $image->writeImage('something.png');
    
    0 讨论(0)
  • 2020-11-30 08:22

    I solved this using "convert" and ImageMagick, rather than having to install it as a DLL. Which was actually the best decision ever, because it solved the problem for PDFs as well. So I simply use:

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

    The [0] is there for PDFs, so it will always take the first page, but it works as is for TIFF too.

    All you need now is to have 'convert' on your Windows Machine and the above PHP will work for both. So simply install this.

    0 讨论(0)
  • 2020-11-30 08:29

    Tifs can have more than one page so a more comprehensive approach is needed. Here is an example:

        //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);
            }
        }
    
    0 讨论(0)
提交回复
热议问题