PHP 使用 GDLib 将图像转为彩色图像
PHP Image to Color-able image using GDLib
我目前正在编写 PHP 脚本来制作着色书。用户将上传图像(彩色),我将这些图像转换为无色图像(彩色)并将它们排列在 PDF 文件中。一切都在管理中,但我无法将图像转换为彩色图像。图片显示为白底黑笔画。
目前我正在使用这个代码:
$im = imagecreatefromjpeg($_FILES['image']['tmp_name'][$i]);
/* R, G, B, so 0, 255, 0 is green */
if ($im) {
imagefilter($im, IMG_FILTER_GRAYSCALE);
imagefilter($im, IMG_FILTER_EDGEDETECT);
imagefilter($im, IMG_FILTER_MEAN_REMOVAL);
imagefilter($im, IMG_FILTER_CONTRAST, -1000);
imagejpeg($im, "tmp_image/image-".$i.".jpg");
$pdf_images[] = "tmp_image/image-".$i.".jpg";
imagedestroy($im);
}
例如:
Color Image
至
Color-able Image
感谢您的帮助。
我尝试了 PHP GDLib 边缘检测过滤器,但无法获得所需的结果。
你想要的东西很难,我不知道这是否适用于所有图像,但这会帮助你上路:
<?php
$image_name = 'apple.png';
$img = imagecreatefrompng ( $image_name );
$size = getimagesize( $image_name );
if( $img ){
$new_image = colourable( $img , $size );
}
function colourable( $img , $size ) {
$new_img = imagecreate( $size[0] , $size[1] );
$white = imagecolorallocate( $new_img , 255 , 255 , 255 );
imagefill( $new_img , 0 , 0 , $white );
$black = imagecolorallocate( $new_img , 0 , 0 , 0 );
for( $x = 0; $x <= ( $size[0] - 1 ); $x++ ){
for( $y = 0; $y <= ( $size[1] - 1 ); $y++ ){
$pixel = imagecolorsforindex( $img, imagecolorat ( $img , $x , $y ) );
if( ( $pixel['red'] >= 0 && $pixel['red'] < 50 ) && ( $pixel['green'] >= 0 && $pixel['green'] < 50 ) && ( $pixel['blue'] >= 0 && $pixel['blue'] < 50 ) ){
imagesetpixel( $new_img , $x , $y , $black );
}
}
}
return $new_img;
}
header ( 'Content-Type: image/png' );
imagepng( $new_image );
?>
这是提供的图像的结果:
它也适用于其他一些图像,有些不错,有些不太好,但请尝试一下,看看您能做些什么。这是不言自明的,但它基本上是抓取图像中每个像素的颜色,并检查它是否在具有一定公差的黑色 RGB 代码范围内。 (黑色为 0、0、0)。可以微调。
它检查是否:
红色的 &
绿色 &
蓝色的
在 rgb 等级上都在 0 到 50 之间。
if( ( $pixel['red'] >= 0 && $pixel['red'] < 50 ) && ( $pixel['green'] >= 0 && $pixel['green'] < 50 ) && ( $pixel['blue'] >= 0 && $pixel['blue'] < 50 ) ){
如果您的图像已经被描边为黑色,不确定为什么要过滤或进行边缘检测?当然,您只想制作以下所有内容:
- 要么透明,要么
- 不黑
全部变成白色
#!/usr/bin/php -f
<?php
$img = imagecreatefrompng('apple.png');
$w = imagesx($img);
$h = imagesy($img);
// Create a new palettised colorable image same size
// We only need 2 colours so palettised will be fine and nice and small
$colorable = imagecreate($w,$h);
$white = imagecolorallocate($colorable,255,255,255);
$black = imagecolorallocate($colorable,0,0,0);
for($x=0;$x<=$w;$x++){
for($y=0;$y<=$h;$y++){
$px = imagecolorsforindex($img,imagecolorat($img,$x,$y));
// Assume we will make this pixel black in new image
$newcolour = $black;
$R = $px['red']; $G = $px['green']; $B = $px['blue']; $A = $px['alpha'];
// If this pixel is transparent, or has any significant red, green or blue component, make it white
if(($A==127) || ($R > 80) || ($G > 80) || ($B > 80)){
$newcolour = $white;
}
imagesetpixel($colorable,$x,$y,$newcolour);
}
}
imagepng($colorable,'result.png');
?>
我目前正在编写 PHP 脚本来制作着色书。用户将上传图像(彩色),我将这些图像转换为无色图像(彩色)并将它们排列在 PDF 文件中。一切都在管理中,但我无法将图像转换为彩色图像。图片显示为白底黑笔画。
目前我正在使用这个代码:
$im = imagecreatefromjpeg($_FILES['image']['tmp_name'][$i]);
/* R, G, B, so 0, 255, 0 is green */
if ($im) {
imagefilter($im, IMG_FILTER_GRAYSCALE);
imagefilter($im, IMG_FILTER_EDGEDETECT);
imagefilter($im, IMG_FILTER_MEAN_REMOVAL);
imagefilter($im, IMG_FILTER_CONTRAST, -1000);
imagejpeg($im, "tmp_image/image-".$i.".jpg");
$pdf_images[] = "tmp_image/image-".$i.".jpg";
imagedestroy($im);
}
例如:
Color Image
至
Color-able Image
感谢您的帮助。
我尝试了 PHP GDLib 边缘检测过滤器,但无法获得所需的结果。
你想要的东西很难,我不知道这是否适用于所有图像,但这会帮助你上路:
<?php
$image_name = 'apple.png';
$img = imagecreatefrompng ( $image_name );
$size = getimagesize( $image_name );
if( $img ){
$new_image = colourable( $img , $size );
}
function colourable( $img , $size ) {
$new_img = imagecreate( $size[0] , $size[1] );
$white = imagecolorallocate( $new_img , 255 , 255 , 255 );
imagefill( $new_img , 0 , 0 , $white );
$black = imagecolorallocate( $new_img , 0 , 0 , 0 );
for( $x = 0; $x <= ( $size[0] - 1 ); $x++ ){
for( $y = 0; $y <= ( $size[1] - 1 ); $y++ ){
$pixel = imagecolorsforindex( $img, imagecolorat ( $img , $x , $y ) );
if( ( $pixel['red'] >= 0 && $pixel['red'] < 50 ) && ( $pixel['green'] >= 0 && $pixel['green'] < 50 ) && ( $pixel['blue'] >= 0 && $pixel['blue'] < 50 ) ){
imagesetpixel( $new_img , $x , $y , $black );
}
}
}
return $new_img;
}
header ( 'Content-Type: image/png' );
imagepng( $new_image );
?>
这是提供的图像的结果:
它也适用于其他一些图像,有些不错,有些不太好,但请尝试一下,看看您能做些什么。这是不言自明的,但它基本上是抓取图像中每个像素的颜色,并检查它是否在具有一定公差的黑色 RGB 代码范围内。 (黑色为 0、0、0)。可以微调。
它检查是否: 红色的 & 绿色 & 蓝色的 在 rgb 等级上都在 0 到 50 之间。
if( ( $pixel['red'] >= 0 && $pixel['red'] < 50 ) && ( $pixel['green'] >= 0 && $pixel['green'] < 50 ) && ( $pixel['blue'] >= 0 && $pixel['blue'] < 50 ) ){
如果您的图像已经被描边为黑色,不确定为什么要过滤或进行边缘检测?当然,您只想制作以下所有内容:
- 要么透明,要么
- 不黑
全部变成白色
#!/usr/bin/php -f
<?php
$img = imagecreatefrompng('apple.png');
$w = imagesx($img);
$h = imagesy($img);
// Create a new palettised colorable image same size
// We only need 2 colours so palettised will be fine and nice and small
$colorable = imagecreate($w,$h);
$white = imagecolorallocate($colorable,255,255,255);
$black = imagecolorallocate($colorable,0,0,0);
for($x=0;$x<=$w;$x++){
for($y=0;$y<=$h;$y++){
$px = imagecolorsforindex($img,imagecolorat($img,$x,$y));
// Assume we will make this pixel black in new image
$newcolour = $black;
$R = $px['red']; $G = $px['green']; $B = $px['blue']; $A = $px['alpha'];
// If this pixel is transparent, or has any significant red, green or blue component, make it white
if(($A==127) || ($R > 80) || ($G > 80) || ($B > 80)){
$newcolour = $white;
}
imagesetpixel($colorable,$x,$y,$newcolour);
}
}
imagepng($colorable,'result.png');
?>