eric-gao
View Code
function ImageCreateFromBMP($filename) {
        if (! $f1 = fopen($filename,"rb")) return FALSE;
        $FILE = unpack("vfile_type/Vfile_size/Vreserved/Vbitmap_offset", fread($f1,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($f1,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 && $BMP[\'colors\'] != 65536) {
            $PALETTE = unpack(\'V\'.$BMP[\'colors\'], fread($f1,$BMP[\'colors\']*4));
        }
    
        $IMG = fread($f1,$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("v",substr($IMG,$P,2));
                    $blue  = ($COLOR[1] & 0x001f) << 3;
                    $green = ($COLOR[1] & 0x07e0) >> 3;
                    $red   = ($COLOR[1] & 0xf800) >> 8;
                    $COLOR[1] = $red * 65536 + $green * 256 + $blue;
                }
                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($f1);
        return $res;
    }

//转换图片格式
$img = ImageCreateFromBMP("valid.bmp");
imagejpeg($img, $url_img);

分类:

技术点:

相关文章:

  • 2021-12-02
  • 2021-06-27
  • 2022-02-09
  • 2022-03-05
  • 2021-11-27
  • 2022-12-23
  • 2021-12-24
  • 2022-02-22
猜你喜欢
  • 2021-10-26
  • 2022-12-23
  • 2021-11-12
  • 2021-11-05
  • 2021-08-05
  • 2021-11-01
  • 2022-12-23
相关资源
相似解决方案