imagecreatefrombmp 不适用于 php

Posted

技术标签:

【中文标题】imagecreatefrombmp 不适用于 php【英文标题】:imagecreatefrombmp not working on php 【发布时间】:2013-05-15 05:53:53 【问题描述】:

我正在尝试将 php 中的 bmp 图像大小减半。 PHO gd 没有 imagecreatefrombmp 所以我必须包含单独的功能。但是我的代码似乎不起作用。它适用于 jpeg。这是我的代码,它应该显示 bmp 图像 test.bmp 的一半图像

<?php


if (!function_exists("imagecreatefrombmp")) 
    function imagecreatefrombmp( $filename ) 
        $file = fopen( $filename, "rb" );
        $read = fread( $file, 10 );
        while( !feof( $file ) && $read != "" )
        
            $read .= fread( $file, 1024 );
        
        $temp = unpack( "H*", $read );
        $hex = $temp[1];
        $header = substr( $hex, 0, 104 );
        $body = str_split( substr( $hex, 108 ), 6 );
        if( substr( $header, 0, 4 ) == "424d" )
        
            $header = substr( $header, 4 );
            // Remove some stuff?
            $header = substr( $header, 32 );
            // Get the width
            $width = hexdec( substr( $header, 0, 2 ) );
            // Remove some stuff?
            $header = substr( $header, 8 );
            // Get the height
            $height = hexdec( substr( $header, 0, 2 ) );
            unset( $header );
        
        $x = 0;
        $y = 1;
        $image = imagecreatetruecolor( $width, $height );
        foreach( $body as $rgb )
        
            $r = hexdec( substr( $rgb, 4, 2 ) );
            $g = hexdec( substr( $rgb, 2, 2 ) );
            $b = hexdec( substr( $rgb, 0, 2 ) );
            $color = imagecolorallocate( $image, $r, $g, $b );
            imagesetpixel( $image, $x, $height-$y, $color );
            $x++;
            if( $x >= $width )
            
                $x = 0;
                $y++;
            
        
        return $image;
    

// File and new size
$filename = 'wheat.bmp';
$percent = 0.5;

// Content type
header('Content-Type: image/bmp');

// Get new sizes
list($width, $height) = getimagesize($filename);
$newwidth = $width * $percent;
$newheight = $height * $percent;

// Load
$thumb = imagecreatetruecolor($newwidth, $newheight);
$source = imagecreatefrombmp($filename);

// Resize
imagecopyresized($thumb, $source, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);

// Output
imagejpeg($thumb);
?>

【问题讨论】:

那么实际上它似乎不起作用?什么有效,什么无效? 它只是一个银行页面,半尺寸图片不显示 【参考方案1】:

在我的情况下,它也抛出了与下面相同的错误。

调用未定义函数 imagecreatefrombmp()

即使我在使用 php 版本 PHP 版本 7.1.28

所以,我把这个函数定义为

function imagecreatefrombmp($p_sFile)

    $file    =    fopen($p_sFile,"rb");
    $read    =    fread($file,10);
    while(!feof($file)&&($read<>""))
    $read    .=    fread($file,1024);
    $temp    =    unpack("H*",$read);
    $hex    =    $temp[1];
    $header    =    substr($hex,0,108);
    if (substr($header,0,4)=="424d")
    
        $header_parts    =    str_split($header,2);
        $width            =    hexdec($header_parts[19].$header_parts[18]);
        $height            =    hexdec($header_parts[23].$header_parts[22]);
        unset($header_parts);
    
    $x                =    0;
    $y                =    1;
    $image            =    imagecreatetruecolor($width,$height);
    $body            =    substr($hex,108);
    $body_size        =    (strlen($body)/2);
    $header_size    =    ($width*$height);
    $usePadding        =    ($body_size>($header_size*3)+4);
    for ($i=0;$i<$body_size;$i+=3)
    
        if ($x>=$width)
        
            if ($usePadding)
                $i    +=    $width%4;
            $x    =    0;
            $y++;
            if ($y>$height)
                break;
        
        $i_pos    =    $i*2;
        $r        =    hexdec($body[$i_pos+4].$body[$i_pos+5]);
        $g        =    hexdec($body[$i_pos+2].$body[$i_pos+3]);
        $b        =    hexdec($body[$i_pos].$body[$i_pos+1]);
        $color    =    imagecolorallocate($image,$r,$g,$b);
        imagesetpixel($image,$x,$height-$y,$color);
        $x++;
    
    unset($body);
    return $image;

作为参数,我传递了文件的相对路径。即(upload/images/example.bmp)

【讨论】:

【参考方案2】:

试试imagecreatefromwbmp()。这是将图像转换为 bmp 文件的正确功能。

【讨论】:

文档表明这是一种无线位图规范,不同于 windows 位图图像格式。【参考方案3】:

显然 imagecreatefrombmp() 现在包含在 PHP 7 中。

【讨论】:

以上是关于imagecreatefrombmp 不适用于 php的主要内容,如果未能解决你的问题,请参考以下文章

生产推送通知 .p12 生产证书不适用于企业分发应用程序(应用商店之外)

Ajax update=":#table.clientId" 似乎不适用于 <p:dataTable>

前向声明不适用于转换运算符

自定义样式不适用于 angular 10

微语法`as`不适用于我自己的指令

IE8 中的不透明度适用于 <p> 但不适用于 <a>