<?php Error_reporting (E_all); Test Imagezoom (' 1.jpg ', ' 2.jpg ', ', ', ' #FFFFFF '); /* PHP thumbnail function: Equal scale lossless compression, can fill supplementary color author: Andy Hosting Format: BMP, JPG, GIF, png Param @srcimage: Picture to shrink @dstimage: Pictures to save @dst_width: Narrow The width @dst_height: Reduce the height @backgroundcolor: Supplemental color such as: #FFFFFF support 6-bit does not support 3-bit */ function Imagezoom ($srcimage, $dstimage, $dst _width, $dst _height, $backgroundcolor) {
File name garbled in if (Php_os = = ' WINNT ') { $srcimage = Iconv (' UTF-8 ', ' GBK ', $srcimage); $dstimage = Iconv (' UTF-8 ', ' GBK ', $dstimage); }
$dstimg = Imagecreatetruecolor ($dst _width, $dst _height); $color = Imagecolorallocate ($dstimg , Hexdec (substr ($backgroundcolor, 1, 2)) , Hexdec (substr ($backgroundcolor, 3, 2)) , Hexdec (substr ($backgroundcolor, 5, 2)) ); Imagefill ($dstimg, 0, 0, $color);
if (! $arr =getimagesize ($srcimage)) { echo "The file to generate the thumbnail does not exist"; Exit }
$SRC _width = $arr [0]; $SRC _height = $arr [1]; $srcimg = null; $method = Getcreatemethod ($srcimage); if ($method) { Eval (' $srcimg = '. $method. ';' ); } $DST _x = 0; $DST _y = 0; $DST _w = $dst _width; $DST _h = $dst _height; if (($dst _width/$dst _height-$src _width/$src _height) > 0) { $DST _w = $src _width * ($dst _height/$src _height); $DST _x = ($dst _width-$dst _w)/2; } elseif (($dst _width/$dst _height-$src _width/$src _height) < 0) { $DST _h = $src _height * ($dst _width/$src _width); $DST _y = ($dst _height-$dst _h)/2; } Imagecopyresampled ($dstimg, $srcimg, $dst _x , $dst _y, 0, 0, $dst _w, $dst _h, $src _width, $src _height);
Save format $arr = Array ( ' jpg ' => ' imagejpeg ' , ' jpeg ' => ' imagejpeg ' , ' png ' => ' imagepng ' , ' gif ' => ' imagegif ' , ' BMP ' => ' imagebmp ' ); $suffix = Strtolower (Array_pop (Explode ('. ', $dstimage))); if (!in_array ($suffix, Array_keys ($arr)) { echo "Saved filename is wrong"; Exit } else { Eval ($arr [$suffix]. ' ($dstimg, "'. $dstimage; '); }
Imagejpeg ($dstimg, $dstimage);
Imagedestroy ($DSTIMG); Imagedestroy ($SRCIMG);
} function Getcreatemethod ($file) { $arr = Array ( ' 474946 ' => ' imagecreatefromgif (' $file ') , ' ffd8ff ' => ' imagecreatefromjpeg (' $file ') , ' 424D ' => ' imagecreatefrombmp (' $file ') , ' 89504E ' => ' imagecreatefrompng (' $file ') ); $FD = fopen ($file, "RB"); $data = Fread ($FD, 3);
$data = Str2hex ($data);
if (Array_key_exists ($data, $arr)) { return $arr [$data]; } elseif (Array_key_exists (substr ($data, 0, 4), $arr)) { return $arr [substr ($data, 0, 4)]; } else { return false; } } function Str2hex ($STR) { $ret = "";
for ($i = 0; $i < strlen ($STR); $i + +) { $ret. = Ord ($str [$i]) >= 16? Strval (Dechex) (Ord ($str [$i])) : ' 0 '. Strval (Dechex (Ord ($str [$i])); }
Return Strtoupper ($ret); } BMP creation function PHP itself without function Imagecreatefrombmp ($filename) { if (! $f 1 = fopen ($filename, "RB") return FALSE; $FILE = Unpack ("Vfile_type/vfile_size/vreserved/vbitmap_offset", Fread ($f 1,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 ($f 1,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* $BMP [' decal ']); if ($BMP [' decal '] = = 4) $BMP [' decal '] = 0;
$PALETTE = Array (); if ($BMP [' Colors '] < 16777216) { $PALETTE = Unpack (' V '. $BMP [' colors '], fread ($f 1, $BMP [' Colors ']*4)]; }
$IMG = Fread ($f 1, $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 ($IMG, $P, 3). $VIDE); ElseIf ($BMP [' bits_per_pixel '] = = 16) { $COLOR = Unpack ("n", substr ($IMG, $P, 2)); $COLOR [1] = $PALETTE [$COLOR [1]+1]; } ElseIf ($BMP [' bits_per_pixel '] = = 8) { $COLOR = Unpack ("n", $VIDE. substr ($IMG, $P, 1)); $COLOR [1] = $PALETTE [$COLOR [1]+1]; } ElseIf ($BMP [' bits_per_pixel '] = = 4) { $COLOR = Unpack ("n", $VIDE. substr ($IMG, 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]; } ElseIf ($BMP [' bits_per_pixel '] = = 1) { $COLOR = Unpack ("n", $VIDE. substr ($IMG, Floor ($P), 1)); if (($P *8)%8 = = 0) $COLOR [1] = $COLOR [1] >>7; ElseIf (($P *8)%8 = = 1) $COLOR [1] = ($COLOR [1] & 0x40) >>6; ElseIf (($P *8)%8 = = 2) $COLOR [1] = ($COLOR [1] & 0x20) >>5; ElseIf (($P *8)%8 = = 3) $COLOR [1] = ($COLOR [1] & 0x10) >>4; ElseIf (($P *8)%8 = = 4) $COLOR [1] = ($COLOR [1] & 0x8) >>3; ElseIf (($P *8)%8 = = 5) $COLOR [1] = ($COLOR [1] & 0x4) >>2; ElseIf (($P *8)%8 = = 6) $COLOR [1] = ($COLOR [1] & 0x2) >>1; ElseIf (($P *8)%8 = = 7) $COLOR [1] = ($COLOR [1] & 0x1); $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 ($f 1); return $res; } BMP save function, PHP itself without function Imagebmp ($im, $FN = False) { if (! $im) return false;
if ($FN = = false) $fn = ' php://output '; $f = fopen ($fn, "w"); if (! $f) return false;
$biWidth = Imagesx ($im); $biHeight = Imagesy ($im); $biBPLine = $biWidth * 3; $biStride = ($biBPLine + 3) & ~3; $biSizeImage = $biStride * $biHeight; $bfOffBits = 54; $bfSize = $bfOffBits + $biSizeImage;
Fwrite ($f, ' BM ', 2); Fwrite ($f, Pack (' VvvV ', $bfSize, 0, 0, $bfOffBits));
Fwrite ($f, Pack (' VVVVVVVVVVV ', $biWidth, $biHeight, 1, 0, $biSizeImage, 0, 0, 0, 0));
$numpad = $biStride-$biBPLine; for ($y = $biHeight-1; $y >= 0;--$y) { for ($x = 0; $x < $biWidth; + + $x) { $col = Imagecolorat ($im, $x, $y); Fwrite ($f, Pack (' V ', $col), 3); } for ($i = 0; $i < $numpad; + + $i) Fwrite ($f, Pack (' C ', 0)); } Fclose ($f); return true; } ?> |