GD 和图像处理 函数


GD 和图像处理 函数 ¶

原文( php官网

Table of Contents ¶

add a note add a note

User Contributed Notes 9 notes

up
8
shd at earthling dot net  ¶
11 years ago
If you happen to need a way to output a Windows BMP file (e.g. when using the PEAR ExcelWriter), feel free to use the following code:

<?php
function imagebmp ($im$fn false)
{
    if (!
$im) return false;
            
    if (
$fn === false$fn 'php://output';
    
$f fopen ($fn"w");
    if (!
$f) return false;
            
    
//Image dimensions
    
$biWidth imagesx ($im);
    
$biHeight imagesy ($im);
    
$biBPLine $biWidth 3;
    
$biStride = ($biBPLine 3) & ~3;
    
$biSizeImage $biStride $biHeight;
    
$bfOffBits 54;
    
$bfSize $bfOffBits $biSizeImage;
            
    
//BITMAPFILEHEADER
    
fwrite ($f'BM'2);
    
fwrite ($fpack ('VvvV'$bfSize00$bfOffBits));
            
    
//BITMAPINFO (BITMAPINFOHEADER)
    
fwrite ($fpack ('VVVvvVVVVVV'40$biWidth$biHeight1240$biSizeImage0000));
            
    
$numpad $biStride $biBPLine;
    for (
$y $biHeight 1$y >= 0; --$y)
    {
        for (
$x 0$x $biWidth; ++$x)
        {
            
$col imagecolorat ($im$x$y);
            
fwrite ($fpack ('V'$col), 3);
        }
        for (
$i 0$i $numpad; ++$i)
            
fwrite ($fpack ('C'0));
    }
    
fclose ($f);
    return 
true;
}
?>

It works the same way as regular imagejpeg/imagepng do and only supports GD2.0 true colour bitmaps (which is what's required by ExcelWriter).
up
7
michal-ok at o2 dot pl  ¶
11 years ago
The image sharpen function (by Alex R. Austin) provided below seems to be very resource hungry and I couldn't make it work on two different servers - trying to sharpen a 413 x 413 image I ended up with "Fatal error: Allowed memory size of 8388608 bytes exhausted" or "Internal Server Error" or the script terminated without notice. Because I had no priviliges to change the default memory limit on these servers I started looking for other sharpen functions. I have come across a php Unsharp Mask function which works like a charm on both of the servers I dealt with. It can be found at http://vikjavev.no/hovudsida/umtestside.php.
up
5
ingo at jache dot de  ¶
5 years ago
I know this might look somewhat superfluous to others, but i once came across a situation where i needed a *strong* blur on an image without having ImageMagick installed. Executing the convolution-filter several times on the same image is awfully slow and still doesn't give a good blur.

The function below accepts a truecolor-image and a blur-factor between 0.0 and 1.0. Beware: It's still quite slow.

<?php

    
function blurImage($srcimg,$blur)
    {
        
$blur $blur*$blur;
        
$blur max(0,min(1,$blur));
    
        
$srcw imagesx($srcimg);
        
$srch imagesy($srcimg);
        
        
$dstimg imagecreatetruecolor($srcw,$srch);
    
        
$f1a $blur;
        
$f1b 1.0 $blur;

    
        
$cr 0$cg 0$cb 0;
        
$nr 0$ng 0$nb 0;

        
$rgb imagecolorat($srcimg,0,0);
        
$or = ($rgb >> 16) & 0xFF;
        
$og = ($rgb >> 8) & 0xFF;
        
$ob = ($rgb) & 0xFF;

        
//-------------------------------------------------
        // first line is a special case
        //-------------------------------------------------
        
$x $srcw;
        
$y $srch-1;
        while (
$x--)
        {
            
//horizontal blurren
            
$rgb imagecolorat($srcimg,$x,$y);
            
$cr = ($rgb >> 16) & 0xFF;
            
$cg = ($rgb >> 8) & 0xFF;
            
$cb = ($rgb) & 0xFF;
    
            
$nr = ($cr $f1a) + ($or $f1b);
            
$ng = ($cg $f1a) + ($og $f1b);
            
$nb = ($cb $f1a) + ($ob $f1b);    

            
$or $nr;
            
$og $ng;
            
$ob $nb;
            
            
imagesetpixel($dstimg,$x,$y,($nr << 16) | ($ng << 8) | ($nb));
        }
        
//-------------------------------------------------

        //-------------------------------------------------
        // now process the entire picture
        //-------------------------------------------------
        
$y $srch-1;
        while (
$y--)
        {

            
$rgb imagecolorat($srcimg,0,$y);
            
$or = ($rgb >> 16) & 0xFF;
            
$og = ($rgb >> 8) & 0xFF;
            
$ob = ($rgb) & 0xFF;

            
$x $srcw;
            while (
$x--)
            {
                
//horizontal 
                
$rgb imagecolorat($srcimg,$x,$y);
                
$cr = ($rgb >> 16) & 0xFF;
                
$cg = ($rgb >> 8) & 0xFF;
                
$cb = ($rgb) & 0xFF;
                
                
$nr = ($cr $f1a) + ($or $f1b);
                
$ng = ($cg $f1a) + ($og $f1b);
                
$nb = ($cb $f1a) + ($ob $f1b);    
    
                
$or $nr;
                
$og $ng;
                
$ob $nb;
                
                
                
//vertical 
                
$rgb imagecolorat($dstimg,$x,$y+1);
                
$vr = ($rgb >> 16) & 0xFF;
                
$vg = ($rgb >> 8) & 0xFF;
                
$vb = ($rgb) & 0xFF;
                
                
$nr = ($nr $f1a) + ($vr $f1b);
                
$ng = ($ng $f1a) + ($vg $f1b);
                
$nb = ($nb $f1a) + ($vb $f1b);    
    
                
$vr $nr;
                
$vg $ng;
                
$vb $nb;
                
                
imagesetpixel($dstimg,$x,$y,($nr << 16) | ($ng << 8) | ($nb));
            }
        
        }
        
//-------------------------------------------------
        
return $dstimg;        

    }

    
    
$srcimg imagecreatefromjpeg("test.jpg");
    
$dstimg blurImage($srcimg,0.2);

    
header('Content-type: image/jpeg');
    echo( 
imagejpeg($dstimg) );
    exit();
    
    
?>
up
5
felipensp at gmail dot com  ¶
11 years ago
Representation decimal of a color in hexadecimal for use on functions of library GD.

<?php

    
// Representation hexadecimal
    
$var '#FFFFFF';

    function 
getRgbFromGd($color_hex) {

        return 
array_map('hexdec'explode('|'wordwrap(substr($color_hex1), 2'|'1)));

    }
    
    
print_r(getRgbFromGd($var));

    
// Output: Array ( [0] => 255 [1] => 255 [2] => 255 )

?>
up
4
jeff at lushmedia dot com  ¶
13 years ago
I wrote an online overview of the image functions that people might find useful. In addition to a general overview of the various function categories and code samples, I have included many interactive examples of the functions, allowing viewers to experiment with the parameters, and seeing the results in real time. The presentation is located at New York PHP
http://www.nyphp.org/content/presentations/GDintro/
up
2
mpyw  ¶
4 months ago
This is an example of black-and-white imagebmp() implementation. 

<?php

/**
* Output a black-and-white BMP image to either the browser or a file.

* @param resource $image
*            An image resource, returned by one of the image creation functions,
*            such as imagecreatetruecolor().
*
* @param string|null $to
*            The path or an open stream resource
*            (which is automatically being closed after this function returns)
*            to save the file to.
*            If not set or NULL, the raw image stream will be outputted directly.
*
* @param float $threshold
*            The number in the range of 0.0 to 1.0.
*            Brighter for larger, or darker for smaller.
*
* @return bool Returns TRUE on success or FALSE on failure.

*/
function imagebwbmp($image$to null$threshold 0.5)
{
    if (
func_num_args() < 1) {
        
$fmt "imagebwbmp() expects a least 1 parameters, %d given";
        
trigger_error(sprintf($fmtfunc_num_args()), E_USER_WARNING);
        return;
    }
    if (!
is_resource($image)) {
        
$fmt "imagebwbmp() expects parameter 1 to be resource, %s given";
        
trigger_error(sprintf($fmtgettype($image)), E_USER_WARNING);
        return;
    }
    if (!
is_numeric($threshold)) {
        
$fmt "imagebwbmp() expects parameter 3 to be float, %s given";
        
trigger_error(sprintf($fmtgettype($threshold)), E_USER_WARNING);
        return;
    }

    if (
get_resource_type($image) !== 'gd') {
        
$msg "imagebwbmp(): supplied resource is not a valid gd resource";
        
trigger_error($msgE_USER_WARNING);
        return 
false;
    }
    switch (
true) {
        case 
$to === null:
            break;
        case 
is_resource($to) && get_resource_type($to) === 'stream':
        case 
is_string($to) && $to fopen($to'wb'):
            if (
preg_match('/[waxc+]/'stream_get_meta_data($to)['mode'])) {
                break;
            }
        default:
            
$msg "imagebwbmp(): Invalid 2nd parameter, it must a writable filename or a writable stream";
            
trigger_error($msgE_USER_WARNING);
            return 
false;
    }

    if (
$to === null) {
        
$to fopen('php://output''wb');
    }

    
$biWidth imagesx($image);
    
$biHeight imagesy($image);
    
$biSizeImage = ((int)ceil($biWidth 32) * 32 $biHeight);
    
$bfOffBits 54 2// Use two colors (black and white)
    
$bfSize $bfOffBits $biSizeImage;
    
    
fwrite($to'BM');
    
fwrite($topack('VvvV'$bfSize00$bfOffBits));
    
fwrite($topack('VVVvvVVVVVV'40$biWidth$biHeight110$biSizeImage0000));
    
fwrite($to"\xff\xff\xff\x00"); // white
    
fwrite($to"\x00\x00\x00\x00"); // black
    
    
for ($y $biHeight 1$y >= 0; --$y) {
        
$byte 0;
        for (
$x 0$x $biWidth; ++$x) {
            
$rgb imagecolorsforindex($imageimagecolorat($image$x$y));
            
$value = (0.299 $rgb['red'] + 0.587 $rgb['green'] + 0.114 $rgb['blue']) / 0xff;
            
$color = (int)($value $threshold);
            
$byte = ($byte << 1) | $color;
            if (
$x === 7) {
                
fwrite($topack('C'$byte));
                
$byte 0;
            }
        }
        if (
$x 8) {
            
fwrite($topack('C'$byte << ($x 8)));
        }
        if (
$x 32) {
            
fwrite($tostr_repeat("\x00", (int)((32 $x 32) / 8)));
        }
    }

    return 
true;
}
?>
up
4
chuckstudios at gmail dot com  ¶
8 years ago
I wrote a simple function to convert an image resource to PGM (portable graymap) in order to feed it to an OCR program. It works just like the rest of the image output functions, and will convert to grayscale for you:

<?php
    
function imagepgm($image$filename null)
    {
        
$pgm "P5 ".imagesx($image)." ".imagesy($image)." 255\n";
        for(
$y 0$y imagesy($image); $y++)
        {
            for(
$x 0$x imagesx($image); $x++)
            {
                
$colors imagecolorsforindex($imageimagecolorat($image$x$y));
                
$pgm .= chr(0.3 $colors["red"] + 0.59 $colors["green"] + 0.11 $colors["blue"]);
            }
        }
        if(
$filename != null)
        {
            
$fp fopen($filename"w");
            
fwrite($fp$pgm);
            
fclose($fp);
        }
        else
        {
            return 
$pgm;
        }
    }
?>
up
1
ph_corp at yahoo dot fr  ¶
9 years ago
<?php

/**
HSL/RGB conversion functions
very useful for a lot of applications
**/

function RBGtoHSL $R$G$B )
{

    
$var_R = ( $R 255 );
    
$var_G = ( $G 255 );
    
$var_B = ( $B 255 );

    
$var_Min min$var_R$var_G$var_B )
    
$var_Max max$var_R$var_G$var_B )
    
$del_Max $var_Max $var_Min

    $L 
= ( $var_Max $var_Min ) / 2;

    if ( 
$del_Max == )
    {
       
$H 0
       $S 
0
    
}
    else
    {
        if ( 
$L 0.5 )
        {
            
$S $del_Max / ( $var_Max $var_Min );
        }
        else
        {
            
$S $del_Max / ( $var_Max $var_Min );
        }

        
$del_R = ( ( ( $var_Max $var_R ) / ) + ( $del_Max ) ) / $del_Max;
        
$del_G = ( ( ( $var_Max $var_G ) / ) + ( $del_Max ) ) / $del_Max;
        
$del_B = ( ( ( $var_Max $var_B ) / ) + ( $del_Max ) ) / $del_Max;

        if ( 
$var_R == $var_Max )
        {
            
$H $del_B $del_G;
        }
        else if ( 
$var_G == $var_Max )
        {
            
$H = ( ) + $del_R $del_B;
        }
        else if ( 
$var_B == $var_Max )
        {
            
$H = ( ) + $del_G $del_R;
        }

        if ( 
$H )
        {
            
$H += 1;
        }
        if ( 
$H )
        {
            
$H -= 1
        
}

    }

    return array( 
$H$S$L );

}

function 
HuetoRGB$v1$v2$vH )
{
    if ( 
$vH )
    {
        
$vH += 1;
    }
    if ( 
$vH )
    {
        
$vH -= 1;
    }
    if ( ( 
$vH ) < )
    {
        return ( 
$v1 + ( $v2 $v1 ) * $vH );
    }
    if ( ( 
$vH ) < )
    {
        return ( 
$v2 );
    }
    if ( ( 
$vH ) < )
    {
        return ( 
$v1 + ( $v2 $v1 ) * ( ( ) - $vH ) * );
    }
    return ( 
$v1 )
}

function 
HSLtoRGB $H$S$L )
{

    if ( 
$S == )
    {
        
$R $L 255;
        
$G $L 255;
        
$B $L 255;
    }
    else
    {
        if ( 
$L 0.5 )
        {
            
$var_2 $L * ( $S );
        }
        else
        {
            
$var_2 = ( $L $S ) - ( $S $L );
        }

        
$var_1 $L $var_2;

        
$R 255 HuetoRGB$var_1$var_2$H + ( ) );
        
$G 255 HuetoRGB$var_1$var_2$H );
        
$B 255 HuetoRGB$var_1$var_2$H - ( ) );
    }

    return array( 
$R$G$B );

}

function 
distance $R1$G1$B1$R2$G2$B2 )
{
    
$result sqrt ( ( $R1 $R2 )*( $R1 $R2 ) + ( $G1 $G2 )*( $G1 $G2 ) + ( $B1 $B2 )*( $B1 $B2 ) );
    return ( 
$result );
}

?>
up
1
delabahan at gmail dot com  ¶
4 months ago
This is an example of get high resolution images.

<?php
/**
* Class name      : resizeImage
* Created by   : wang
* Description   : This class is to resize the image from original size to new size 
*/
class resizeImage
{
     
/**
     * Function name : resize_img
     * Description   : This function is to resize image 
     * @param          : $origimg variable is the original image 
     * @param          : $newimg variable is the new image 
     * @param          : $w variable is the width of image 
     * @param          : $f variable is the height of image 
     */
    
public  function resize_img($origimg,$newimg,$w,$h){
        
$info getimagesize($origimg);
        
$mime   $info['mime'];

        
// Make sure that the requested file is actually an image
        
if(substr($mime06) != 'image/')
        {
            
header('HTTP/1.1 400 Bad Request');
            return 
'Error: requested file is not an accepted type: ' .$origimg;
            exit();
        }

        
// Check they extention of image
        
$extension image_type_to_extension($info[2]);
        if(
strtolower($extension) == '.png'){
            
$img $this->resize_imagepng($origimg,$w$h);
            
imagepng($img,$newimg);
            
imagedestroy($img);
        }elseif(
strtolower($extension) == '.jpeg'){
            
$img $this->resize_imagejpeg($origimg$w$h);
            
imagejpeg($img$newimg);
            
imagedestroy($img);
        }elseif(
strtolower($extension == '.gif')){
            
$img $this->resize_imagegif($origimg$w$h);
            
imagegif($img,$newimg);
            
imagedestroy($img);
        }

    }
     
/**
     * End function name : resize_img
     */

     /**
     * Function name : resize_imagepng
     * Description   : This function is to resize png image 
     * @param          : $file variable is the original image 
     * @param          : $w variable is the width of image 
     * @param          : $f variable is the height of image 
     */
    
private function resize_imagepng($file$w$h) {
       list(
$width$height) = getimagesize($file);
       
$src imagecreatefrompng($file);
       
$dst imagecreatetruecolor($w$h);
       
imagecopyresampled($dst$src0000$w$h$width$height);
       return 
$dst;
    }
     
/**
     * End function name : resize_imagepng
     */

     /**
     * Function name : resize_imagejpeg
     * Description   : This function is to resize jpeg image 
     * @param          : $file variable is the original image 
     * @param          : $w variable is the width of image 
     * @param          : $f variable is the height of image 
     */
    
private function resize_imagejpeg($file$w$h) {
       list(
$width$height) = getimagesize($file);
       
$src imagecreatefromjpeg($file);
       
$dst imagecreatetruecolor($w$h);
       
imagecopyresampled($dst$src0000$w$h$width$height);
       return 
$dst;
    }
     
/**
     * End function name : resize_imagejpeg
     */

     /**
     * Function name : resize_imagegif
     * Description   : This function is to resize gif image 
     * @param          : $file variable is the original image 
     * @param          : $w variable is the width of image 
     * @param          : $f variable is the height of image 
     */
    
private function resize_imagegif($file$w$h) {
       list(
$width$height) = getimagesize($file);
       
$src imagecreatefromgif($file);
       
$dst imagecreatetruecolor($w$h);
       
imagecopyresampled($dst$src0000$w$h$width$height);
       return 
$dst;
    }
     
/**
     * End function name : resize_imagegif
     */
}
/**
* End class name : resizeImage
*/
?>


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值