Dashboard
PHP:
8.4.22
OS:
Linux
User:
adsvisc
/
/
home
/
adsvisc
/
www
/
wp-content
/
plugins
/
wp-file-manager
/
lib
/
php
/
libs
ð€ Upload
ð New File
ð New Folder
Close
Editing: GdBmp.php
<?php /** * Copyright (c) 2011, oov. All rights reserved. * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * - Neither the name of the oov nor the names of its contributors may be used to * endorse or promote products derived from this software without specific prior * written permission. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * bmp ãã¡ã€ã«ã GD ã§äœ¿ããããã« * 䜿çšäŸ: * //ãã¡ã€ã«ããèªã¿èŸŒãå Žåã¯GDã§PNGãªã©ãèªã¿èŸŒãã®ãšåããããªæ¹æ³ã§å¯ * $image = imagecreatefrombmp("test.bmp"); * imagedestroy($image); * //æååããèªã¿èŸŒãå Žåã¯ä»¥äžã®æ¹æ³ã§å¯ * $image = GdBmp::loadFromString(file_get_contents("test.bmp")); * //èªåå€å®ãããã®ã§ç Žæãã¡ã€ã«ã§ãªããã°ããã§ãäžæããã * //$image = imagecreatefrombmp(file_get_contents("test.bmp")); * imagedestroy($image); * //ãã®ä»ä»»æã®ã¹ããªãŒã ããã®èªã¿èŸŒã¿ãå¯èœ * $stream = fopen("http://127.0.0.1/test.bmp"); * $image = GdBmp::loadFromStream($stream); * //èªåå€å®ãããã®ã§ããã§ããã * //$image = imagecreatefrombmp($stream); * fclose($stream); * imagedestroy($image); * 察å¿ãã©ãŒããã * 1bit * 4bit * 4bitRLE * 8bit * 8bitRLE * 16bit(ä»»æã®ããããã£ãŒã«ã) * 24bit * 32bit(ä»»æã®ããããã£ãŒã«ã) * BITMAPINFOHEADER ã® biCompression ã BI_PNG / BI_JPEG ã®ç»å * ãã¹ãŠã®åœ¢åŒã§ãããããŠã³/ããã ã¢ããã®äž¡æ¹ããµããŒã * ç¹æ®ãªããããã£ãŒã«ãã§ãããããã£ãŒã«ãããŒã¿ãæ£åžžãªãèªã¿èŸŒã¿å¯èœ * 以äžã®ãã®ã¯éå¯Ÿå¿ * BITMAPV4HEADER ãš BITMAPV5HEADER ã«å«ãŸããè²ç©ºéã«é¢ããæ§ã ãªæ©èœ * * @param $filename_or_stream_or_binary * * @return bool|resource */ if (!function_exists('imagecreatefrombmp')) { function imagecreatefrombmp($filename_or_stream_or_binary) { return elFinderLibGdBmp::load($filename_or_stream_or_binary); } } class elFinderLibGdBmp { public static function load($filename_or_stream_or_binary) { if (is_resource($filename_or_stream_or_binary)) { return self::loadFromStream($filename_or_stream_or_binary); } else if (is_string($filename_or_stream_or_binary) && strlen($filename_or_stream_or_binary) >= 26) { $bfh = unpack("vtype/Vsize", $filename_or_stream_or_binary); if ($bfh["type"] == 0x4d42 && ($bfh["size"] == 0 || $bfh["size"] == strlen($filename_or_stream_or_binary))) { return self::loadFromString($filename_or_stream_or_binary); } } return self::loadFromFile($filename_or_stream_or_binary); } public static function loadFromFile($filename) { $fp = fopen($filename, "rb"); if ($fp === false) { return false; } $bmp = self::loadFromStream($fp); fclose($fp); return $bmp; } public static function loadFromString($str) { //data scheme ããå€ãããŒãžã§ã³ãã察å¿ããŠãããããªã®ã§ php://memory ã䜿ã $fp = fopen("php://memory", "r+b"); if ($fp === false) { return false; } if (fwrite($fp, $str) != strlen($str)) { fclose($fp); return false; } if (fseek($fp, 0) === -1) { fclose($fp); return false; } $bmp = self::loadFromStream($fp); fclose($fp); return $bmp; } public static function loadFromStream($stream) { $buf = fread($stream, 14); //2+4+2+2+4 if ($buf === false) { return false; } //ã·ã°ããã£ãã§ã㯠if ($buf[0] != 'B' || $buf[1] != 'M') { return false; } $bitmap_file_header = unpack( //BITMAPFILEHEADERæ§é äœ "vtype/" . "Vsize/" . "vreserved1/" . "vreserved2/" . "Voffbits", $buf ); return self::loadFromStreamAndFileHeader($stream, $bitmap_file_header); } public static function loadFromStreamAndFileHeader($stream, array $bitmap_file_header) { if ($bitmap_file_header["type"] != 0x4d42) { return false; } //æ å ±ããããµã€ãºãå ã«åœ¢åŒãåºå¥ããŠèªã¿èŸŒã¿ $buf = fread($stream, 4); if ($buf === false) { return false; } list(, $header_size) = unpack("V", $buf); if ($header_size == 12) { $buf = fread($stream, $header_size - 4); if ($buf === false) { return false; } extract(unpack( //BITMAPCOREHEADERæ§é äœ - OS/2 Bitmap "vwidth/" . "vheight/" . "vplanes/" . "vbit_count", $buf )); //é£ãã§ããªãå㯠0 ã§åæåããŠãã $clr_used = $clr_important = $alpha_mask = $compression = 0; //ãã¹ã¯é¡ã¯åæåãããªãã®ã§ããã§å²ãåœãŠãŠãã $red_mask = 0x00ff0000; $green_mask = 0x0000ff00; $blue_mask = 0x000000ff; } else if (124 < $header_size || $header_size < 40) { //æªç¥ã®åœ¢åŒ return false; } else { //ãã®æç¹ã§36ãã€ãèªããããšãŸã§ã¯ããã£ãŠãã $buf = fread($stream, 36); //æ¢ã«èªãã éšåã¯é€å€ãã€ã€BITMAPINFOHEADERã®ãµã€ãºã ãèªã if ($buf === false) { return false; } //BITMAPINFOHEADERæ§é äœ - Windows Bitmap extract(unpack( "Vwidth/" . "Vheight/" . "vplanes/" . "vbit_count/" . "Vcompression/" . "Vsize_image/" . "Vx_pels_per_meter/" . "Vy_pels_per_meter/" . "Vclr_used/" . "Vclr_important", $buf )); /** * @var integer $width * @var integer $height * @var integer $planes * @var integer $bit_count * @var integer $compression * @var integer $size_image * @var integer $x_pels_per_meter * @var integer $y_pels_per_meter * @var integer $clr_used * @var integer $clr_important */ //è² ã®æŽæ°ãåãåãå¯èœæ§ããããã®ã¯èªåã§å€æãã if ($width & 0x80000000) { $width = -(~$width & 0xffffffff) - 1; } if ($height & 0x80000000) { $height = -(~$height & 0xffffffff) - 1; } if ($x_pels_per_meter & 0x80000000) { $x_pels_per_meter = -(~$x_pels_per_meter & 0xffffffff) - 1; } if ($y_pels_per_meter & 0x80000000) { $y_pels_per_meter = -(~$y_pels_per_meter & 0xffffffff) - 1; } //ãã¡ã€ã«ã«ãã£ãŠã¯ BITMAPINFOHEADER ã®ãµã€ãºãããããïŒæžã蟌ã¿ééãïŒïŒã±ãŒã¹ããã //èªåã§ãã¡ã€ã«ãµã€ãºãå ã«éç®ããããšã§åé¿ã§ããããšãããã®ã§åèšç®ã§ããããªãæ£åœæ§ã調ã¹ã //ã·ãŒã¯ã§ããªãã¹ããªãŒã ã®å Žåå šäœã®ãã¡ã€ã«ãµã€ãºã¯ååŸã§ããªãã®ã§ã$bitmap_file_headerã«ãµã€ãºç³åããªããã°ãããªã if ($bitmap_file_header["size"] != 0) { $colorsize = $bit_count == 1 || $bit_count == 4 || $bit_count == 8 ? ($clr_used ? $clr_used : pow(2, $bit_count)) << 2 : 0; $bodysize = $size_image ? $size_image : ((($width * $bit_count + 31) >> 3) & ~3) * abs($height); $calcsize = $bitmap_file_header["size"] - $bodysize - $colorsize - 14; //æ¬æ¥ã§ããã°äžèŽããã¯ããªã®ã«åããªãæã¯ãå€ããããããªããããªãïŒBITMAPV5HEADERã®ç¯å²å ãªãïŒèšç®ããŠæ±ããå€ãæ¡çšãã if ($header_size < $calcsize && 40 <= $header_size && $header_size <= 124) { $header_size = $calcsize; } } //BITMAPV4HEADER ã BITMAPV5HEADER ã®å ŽåãŸã èªãã¹ãããŒã¿ãæ®ã£ãŠããå¯èœæ§ããã if ($header_size - 40 > 0) { $buf = fread($stream, $header_size - 40); if ($buf === false) { return false; } extract(unpack( //BITMAPV4HEADERæ§é äœ(Windows95以é) //BITMAPV5HEADERæ§é äœ(Windows98/2000以é) "Vred_mask/" . "Vgreen_mask/" . "Vblue_mask/" . "Valpha_mask", $buf . str_repeat("\x00", 120) )); } else { $alpha_mask = $red_mask = $green_mask = $blue_mask = 0; } //ãã¬ããããªããã«ã©ãŒãã¹ã¯ããªãæ if ( ($bit_count == 16 || $bit_count == 24 || $bit_count == 32) && $compression == 0 && $red_mask == 0 && $green_mask == 0 && $blue_mask == 0 ) { //ããã«ã©ãŒãã¹ã¯ãææããŠããªãå Žå㯠//èŠå®ã®ã«ã©ãŒãã¹ã¯ãé©çšãã switch ($bit_count) { case 16: $red_mask = 0x7c00; $green_mask = 0x03e0; $blue_mask = 0x001f; break; case 24: case 32: $red_mask = 0x00ff0000; $green_mask = 0x0000ff00; $blue_mask = 0x000000ff; break; } } } if ( ($width == 0) || ($height == 0) || ($planes != 1) || (($alpha_mask & $red_mask) != 0) || (($alpha_mask & $green_mask) != 0) || (($alpha_mask & $blue_mask) != 0) || (($red_mask & $green_mask) != 0) || (($red_mask & $blue_mask) != 0) || (($green_mask & $blue_mask) != 0) ) { //äžæ£ãªç»å return false; } //BI_JPEG ãš BI_PNG ã®å Žå㯠jpeg/png ããã®ãŸãŸå ¥ã£ãŠãã ããªã®ã§ãã®ãŸãŸåãåºããŠãã³ãŒããã if ($compression == 4 || $compression == 5) { $buf = stream_get_contents($stream, $size_image); if ($buf === false) { return false; } return imagecreatefromstring($buf); } //ç»åæ¬äœã®èªã¿åºã //1è¡ã®ãã€ãæ° $line_bytes = (($width * $bit_count + 31) >> 3) & ~3; //å šäœã®è¡æ° $lines = abs($height); //y軞é²è¡éïŒããã ã¢ããããããããŠã³ãïŒ $y = $height > 0 ? $lines - 1 : 0; $line_step = $height > 0 ? -1 : 1; //256è²ä»¥äžã®ç»åãïŒ if ($bit_count == 1 || $bit_count == 4 || $bit_count == 8) { $img = imagecreate($width, $lines); //ç»åããŒã¿ã®åã«ãã¬ããããŒã¿ãããã®ã§ãã¬ãããäœæãã $palette_size = $header_size == 12 ? 3 : 4; //OS/2圢åŒã®å Žå㯠x ã«çžåœããç®æã®ããŒã¿ã¯æåãã確ä¿ãããŠããªã $colors = $clr_used ? $clr_used : pow(2, $bit_count); //è²æ° $palette = array(); for ($i = 0; $i < $colors; ++$i) { $buf = fread($stream, $palette_size); if ($buf === false) { imagedestroy($img); return false; } extract(unpack("Cb/Cg/Cr/Cx", $buf . "\x00")); /** * @var integer $b * @var integer $g * @var integer $r * @var integer $x */ $palette[] = imagecolorallocate($img, $r, $g, $b); } $shift_base = 8 - $bit_count; $mask = ((1 << $bit_count) - 1) << $shift_base; //å§çž®ãããŠããå ŽåãšãããŠããªãå Žåã§ãã³ãŒãåŠçã倧ããå€ãã if ($compression == 1 || $compression == 2) { $x = 0; $qrt_mod2 = $bit_count >> 2 & 1; for (; ;) { //ããæåå ãç¯å²å€ã«ãªã£ãŠããå Žåãã³ãŒãåŠçããããããªã£ãŠããã®ã§æãã //å€ãªããŒã¿ãæž¡ããããšããŠãææªãªã±ãŒã¹ã§255åçšåºŠã®ç¡é§ãªã®ã§ç®ãçã if ($x < -1 || $x > $width || $y < -1 || $y > $height) { imagedestroy($img); return false; } $buf = fread($stream, 1); if ($buf === false) { imagedestroy($img); return false; } switch ($buf) { case "\x00": $buf = fread($stream, 1); if ($buf === false) { imagedestroy($img); return false; } switch ($buf) { case "\x00": //EOL $y += $line_step; $x = 0; break; case "\x01": //EOB $y = 0; $x = 0; break 3; case "\x02": //MOV $buf = fread($stream, 2); if ($buf === false) { imagedestroy($img); return false; } list(, $xx, $yy) = unpack("C2", $buf); $x += $xx; $y += $yy * $line_step; break; default: //ABS list(, $pixels) = unpack("C", $buf); $bytes = ($pixels >> $qrt_mod2) + ($pixels & $qrt_mod2); $buf = fread($stream, ($bytes + 1) & ~1); if ($buf === false) { imagedestroy($img); return false; } for ($i = 0, $pos = 0; $i < $pixels; ++$i, ++$x, $pos += $bit_count) { list(, $c) = unpack("C", $buf[$pos >> 3]); $b = $pos & 0x07; imagesetpixel($img, $x, $y, $palette[($c & ($mask >> $b)) >> ($shift_base - $b)]); } break; } break; default: $buf2 = fread($stream, 1); if ($buf2 === false) { imagedestroy($img); return false; } list(, $size, $c) = unpack("C2", $buf . $buf2); for ($i = 0, $pos = 0; $i < $size; ++$i, ++$x, $pos += $bit_count) { $b = $pos & 0x07; imagesetpixel($img, $x, $y, $palette[($c & ($mask >> $b)) >> ($shift_base - $b)]); } break; } } } else { for ($line = 0; $line < $lines; ++$line, $y += $line_step) { $buf = fread($stream, $line_bytes); if ($buf === false) { imagedestroy($img); return false; } $pos = 0; for ($x = 0; $x < $width; ++$x, $pos += $bit_count) { list(, $c) = unpack("C", $buf[$pos >> 3]); $b = $pos & 0x7; imagesetpixel($img, $x, $y, $palette[($c & ($mask >> $b)) >> ($shift_base - $b)]); } } } } else { $img = imagecreatetruecolor($width, $lines); imagealphablending($img, false); if ($alpha_mask) { //αããŒã¿ãããã®ã§ééæ å ±ãä¿åã§ããããã« imagesavealpha($img, true); } //x軞é²è¡é $pixel_step = $bit_count >> 3; $alpha_max = $alpha_mask ? 0x7f : 0x00; $alpha_mask_r = $alpha_mask ? 1 / $alpha_mask : 1; $red_mask_r = $red_mask ? 1 / $red_mask : 1; $green_mask_r = $green_mask ? 1 / $green_mask : 1; $blue_mask_r = $blue_mask ? 1 / $blue_mask : 1; for ($line = 0; $line < $lines; ++$line, $y += $line_step) { $buf = fread($stream, $line_bytes); if ($buf === false) { imagedestroy($img); return false; } $pos = 0; for ($x = 0; $x < $width; ++$x, $pos += $pixel_step) { list(, $c) = unpack("V", substr($buf, $pos, $pixel_step) . "\x00\x00"); $a_masked = $c & $alpha_mask; $r_masked = $c & $red_mask; $g_masked = $c & $green_mask; $b_masked = $c & $blue_mask; $a = $alpha_max - ((($a_masked << 7) - $a_masked) * $alpha_mask_r); $r = (($r_masked << 8) - $r_masked) * $red_mask_r; $g = (($g_masked << 8) - $g_masked) * $green_mask_r; $b = (($b_masked << 8) - $b_masked) * $blue_mask_r; imagesetpixel($img, $x, $y, ($a << 24) | ($r << 16) | ($g << 8) | $b); } } imagealphablending($img, true); //ããã©ã«ãå€ã«æ»ããŠãã } return $img; } }
Save
Cancel