【发布时间】:2015-06-23 19:47:45
【问题描述】:
我在数据库中有一些 RGB 矩阵格式的图像,即 [W x H x 3] 矩阵。 (附带问题:这种格式有合适的名称吗?)
PHP 中是否有任何工具可以让我轻松地将其转换为可显示的格式,例如 PNG?我的目标是从数据库中获取这个(字节数组)图像并使用 base64 编码将其嵌入到 HTML 页面中。
【问题讨论】:
标签: php image image-processing
我在数据库中有一些 RGB 矩阵格式的图像,即 [W x H x 3] 矩阵。 (附带问题:这种格式有合适的名称吗?)
PHP 中是否有任何工具可以让我轻松地将其转换为可显示的格式,例如 PNG?我的目标是从数据库中获取这个(字节数组)图像并使用 base64 编码将其嵌入到 HTML 页面中。
【问题讨论】:
标签: php image image-processing
我知道 ImageMagick 可以做这种事情,但我自己不使用 PHP。
似乎有一个名为Imagick::importImagePixels 的“方法/函数”,但它可能已被弃用。详情here.
如果做不到这一点,ImageMagick 可以在命令行中读取这样的原始 RGB 文件,假设它的尺寸为 500x300,并创建一个名为 image.png 的 PNG 文件
convert -size 500x300 RGB:file.dat image.png
如果您的数据是 16 位,您可能需要设置 -depth 16。如果您的原始数据是 MSB-first endian,您可能需要添加 -endian msb。
您可以从 PHP 中使用 ImageMagick 并让它创建 base64 编码图像。因此,例如,如果您想创建一个小的 3 像素红绿蓝条,您可以这样做:
convert xc:red xc:green xc:blue +append png:- | base64 -i - -o -
iVBORw0KGgoAAAANSUhEUgAAAAMAAAABAgMAAABmjvwnAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAADFBMVEX/AAAAgAAAAP////+OcOPKAAAAAWJLR0QDEQxM8gAAAAd0SU1FB98EEQklANW7eQgAAAAKSURBVAjXY5AAAAAaABmHBux0AAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDE1LTA0LTE3VDA5OjM3OjAwKzAxOjAw5tCGLgAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxNS0wNC0xN1QwOTozNzowMCswMTowMJeNPpIAAAAASUVORK5CYII=
因此,如果您可以在名为 data.bin 的文件中获取原始 RGB 数据,您同样可以这样做:
convert -size 300x200 RGB:data.bin png:- | base64 -i - -o -
另一种选择可能是使用像素迭代器,一次遍历一个像素的图像,这在 Octopus 的回答 here 中已经很好地描述了。
【讨论】:
我会将您的 [W x H x 3] 矩阵格式的 RGB 数组转换为可显示的格式(如 PNG),并将图像嵌入其中,并根据您的需要使用 base64 编码在 HTML 页面中。
但是,由于我没有包含此类数据的数据库,因此我将首先从实际图像文件创建数组作为示例:
<?php
$filename='image.png';
//Attempt to open
$img=@imagecreatefrompng($filename);
//See if it failed
if(!$img){
//Create a blank image
$width=150;
$height=150;
$newimg=imagecreatetruecolor($width,$height);
$bgcolor=imagecolorallocate($newimg,255,255,255);
$color=imagecolorallocate($newimg,0,0,0);
imagefilledrectangle($newimg,0,0,$width-1,$height-1,$bgcolor);
//Output an error message at half the height of the image
imagestring($newimg,1,10,round($height/2),'Error loading '.$filename,$color);
}else{
//CONVERT IMAGE TO WxHx3 ARRAY
$width=imagesx($img);
$height=imagesy($img);
//Create and array of RGB values
$array=array();
for($x=0;$x<$width;++$x){
for($y=0;$y<$height;++$y){
//Every pixel will be an array of 4 ints with the keys 'red', 'green', 'blue' and 'alpha'.
$bytes=imagecolorat($img,$x,$y);
$colors=imagecolorsforindex($img,$bytes);
$array[$x][$y]=$colors;
}
}
//CONVERT WxHx3 ARRAY TO IMAGE
$newimg=imagecreatetruecolor($width,$height);
for($x=0;$x<$width;++$x){
for($y=0;$y<$height;++$y){
$r=$array[$x][$y]['red'];
$g=$array[$x][$y]['green'];
$b=$array[$x][$y]['blue'];
//$a=$array[$x][$y]['alpha'];
$a=0; //0: opaque, 127: transparent
$colors=imagecolorallocatealpha($newimg,$r,$g,$b,$a);
imagesetpixel($newimg,$x,$y,$colors);
}
}
}
//Remove these comments to show the image instead of HTML
//header('Content-Type: image/png');
//imagepng($newimg);
//exit();
//Show the image inside a IMG tag
header('Content-Type: text/html; charset=utf-8');
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Image</title>
</head>
<body>
<?php
ob_start();
imagepng($newimg);
$data = ob_get_clean();
ob_end_clean();
echo '<img src="data:image/png;base64,'.base64_encode($data).'" />';
?>
</body>
</html>
【讨论】: