php生成圖像縮略圖(支持:JPEG,GIT,PNG,BMP)

phpde 9年前發布 | 4K 次閱讀 PHP

<?php
class Thumb
{

public function create($srcPath, $dstPath, $dstWidth, $dstHeight)
{
    if (!file_exists($srcPath)) {
        return false;
    }

    @$srcSize = getimagesize($srcPath);
    if (empty($srcSize)) {
        return false;
    }

    $srcWith = intval($srcSize[0]);
    $srcHeight = intval($srcSize[1]);

    //如果原始圖片的尺寸大于指定縮略圖的尺寸,則生成縮略圖,否則拷貝原始文件
    if ($srcWith <= $dstWidth && $srcHeight <= $dstHeight) {
        return copy($srcPath, $dstPath);
    }

    //讀取原始圖片資源
    @$srcImage = imagecreatefromjpeg($srcPath);
    if (empty($srcImage)) {
        @$srcImage = imagecreatefromgif($srcPath);
    }
    if (empty($srcImage)) {
        @$srcImage = imagecreatefrompng($srcPath);
    }
    if (empty($srcImage)) {
        @$srcImage = $this->_imageCreateFromBMP($srcPath);
    }

    if (empty($srcImage)) {
        return false;
    }

    //獲取縮略圖的尺寸,并據此生成新的圖像
    $dstSize = $this->_getDstSize(
        $srcWith, $srcHeight, $dstWidth, $dstHeight
    );

    @$dstImage = imagecreatetruecolor(
        $dstSize['width'], $dstSize['height']
    );

    @imagecopyresampled(
        $dstImage, $srcImage , 0, 0, 0, 0,
        $dstSize['width'], $dstSize['height'],
        $srcWith, $srcHeight
    );

    return @imagepng($srcPath, $dstPath);
}

private function _imageCreateFromBMP($filePath)
{
    $fileHandle = fopen($filePath, 'rb');
    if (empty($fileHandle)) {
        return false;
    }

    $file = unpack(
        'vfile_type/Vfile_size/Vreserved/Vbitmap_offset',
        fread($fileHandle, 14)
    );

    if ($file['file_type'] != 19778) {
        return false;
    }

    $bmp = unpack(
        'Vheader_size/Vwidth/Vheight/vplanes/'.
        'vbits_per_pixel/Vcompression/Vsize_bitmap/'.
        'Vhoriz_resolution/Vvert_resolution/Vcolors_used/Vcolors_important',
        fread($fileHandle, 40)
    );
    $bmp['colors'] = pow(2, $bmp['bits_per_pixel']);
    if ($bmp['size_bitmap'] == 0) {
        $bmp['size_bitmap'] = $file['file_size'] - $file['bitmap_offset'];
    }
    $bmp['bytes_per_pixel'] = $bmp['bits_per_pixel'] / 8;
    $bmp['bytes_per_pixel2'] = ceil($bmp['bytes_per_pixel']);
    $bmp['decal'] =  $bmp['width'] * $bmp['bytes_per_pixel'] / 4;
    $bmp['decal'] -= floor($bmp['width'] * $bmp['bytes_per_pixel'] / 4);
    $bmp['decal'] = 4 - (4 * $bmp['decal']);
    if ($bmp['decal'] == 4) {
        $bmp['decal'] = 0;
    }

    $palette = array();
    if ($bmp['colors'] < 16777216) {
        $palette = unpack(
            'V' . $bmp['colors'],
            fread($fileHandle, $bmp['colors'] * 4)
        );
    }
    $image = fread($fileHandle, $bmp['size_bitmap']);
    $vide = chr(0);
    $res = imagecreatetruecolor($bmp['width'], $bmp['height']);
    $p = 0;

    $y = $bmp['height'] - 1;
    while ($y >= 0) {
        $x = 0;
        while ($x < $bmp['width']) {
            if ($bmp['bits_per_pixel'] == 24) {
                $color = unpack('V', substr($image, $p, 3) . $vide);
            } else if ($bmp['bits_per_pixel'] == 16) {
                $color = unpack('n', substr($image, $p, 2));
                $color[1] = $palette[$color[1]+1];
            } else if ($bmp['bits_per_pixel'] == 8) {
                $color = unpack('n', $vide . substr ($image, $p, 1));
                $color[1] = $palette[$color[1]+1];
            } else if ($bmp['bits_per_pixel'] ==4) {
                $color = unpack('n', $vide . substr($image, floor($p), 1));
                if (($p * 2) % 2 == 0) {
                    $color[1] = ($color[1] >> 4);
                } else {
                    $color[1] = ($color[1] & 0x0F);
                }
                $color[1] = $palette[$color[1] + 1];
            } else if ($bmp['bits_per_pixel'] == 1) {
                $color = unpack('n', $vide . substr($image, floor($p), 1));
                switch (($p * 8) % 8) {
                    case  0:
                        $color[1] = ($color[1] >> 7);
                        break;
                    case  1:
                        $color[1] = ($color[1] & 0x40) >> 6;
                        break;
                    case  2:
                        $color[1] = ($color[1] & 0x20) >> 5;
                        break;
                    case  3:
                        $color[1] = ($color[1] & 0x10) >> 4;
                        break;
                    case  4:
                        $color[1] = ($color[1] & 0x8) >> 3;
                        break;
                    case  5:
                        $color[1] = ($color[1] & 0x4) >> 2;
                        break;
                    case  6:
                        $color[1] = ($color[1] & 0x2) >> 1;
                        break;
                    case  7:
                        $color[1] = ($color[1] & 0x1);
                        break;
                 }
                 $color[1] = $palette[$color[1] + 1];
            } else {
                return false;
            }
            imagesetpixel($res, $x, $y, $color[1]);
            $x++;
            $p += $bmp['bytes_per_pixel'];
        }
        $y--;
        $p += $bmp['decal'];
    }
    fclose($fileHandle);
    return $res;
}

private function _getDstSize($srcWith, $srcHeight, $dstWidth, $dstHeight)
{
    $size = array('width' => $srcWith, 'height' => $srcHeight);
    if ($dstWidth > 0 && $dstHeight > 0) {
        if ($srcWith > 0 && $srcHeight > 0) {
            if ($srcWith / $srcHeight >= $dstWidth / $dstHeight) {
                if ($srcWith > $dstWidth) {
                    $size['width']  = $dstWidth;
                    $size['height'] = $srcHeight * $dstWidth / $srcWith;
                }
            } else {
                if ($srcHeight > $dstHeight) {
                    $size['width']  = $srcWith * $dstHeight / $srcHeight;
                    $size['height'] = $dstHeight;
                }
            }
        }
    }
    return $size;
}

}</pre>

 本文由用戶 phpde 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!