【问题标题】:Use PHP to convert image in RGB matrix format to PNG or other displayable format使用 PHP 将 RGB 矩阵格式的图像转换为 PNG 或其他可显示格式
【发布时间】:2015-06-23 19:47:45
【问题描述】:

我在数据库中有一些 RGB 矩阵格式的图像,即 [W x H x 3] 矩阵。 (附带问题:这种格式有合适的名称吗?)

PHP 中是否有任何工具可以让我轻松地将其转换为可显示的格式,例如 PNG?我的目标是从数据库中获取这个(字节数组)图像并使用 base64 编码将其嵌入到 HTML 页面中。

【问题讨论】:

    标签: php image image-processing


    【解决方案1】:

    我知道 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 中已经很好地描述了。

    【讨论】:

      【解决方案2】:

      我会将您的 [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>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-06-15
        • 2020-01-31
        • 1970-01-01
        • 2016-04-06
        • 1970-01-01
        • 1970-01-01
        • 2017-05-11
        相关资源
        最近更新 更多