【问题标题】:How to convert RGB to a 1px base64 encoded data uri in php如何在 php 中将 RGB 转换为 1px base64 编码的数据 uri
【发布时间】:2012-03-07 15:09:34
【问题描述】:

我正在尝试找出一种更有效的方法来从 php.ini 中的单一 RGB 颜色代码创建 1px x 1px 图像(jpg、png 和 gif)。

下面的示例说明了一种方法,但我希望有某种算法可以让我获得相同的输出,而无需加载任何库或 php 扩展。

示例:

function rgbToDataUri($r,$g,$b,$type)
{
    $im = imageCreateTrueColor(1, 1);

    imageFill($im, 0, 0, ImageColorAllocate($im,$r,$g,$b));

    ob_start();

    switch($type)
    {
        case 'gif':
            imageGif($im);
            break;
        case 'jpg':
        case 'jpeg':
            imageJpeg($im);
            break;
        default:
            imagePng($im);
    }

    $img = ob_get_contents();

    ob_end_clean();

    return 'data:image/' . $type . ';base64,' . base64_encode($img);
}

echo rgbToDataUri(0,0,0,'gif');

输出:

data:image/gif;base64,R0lGODdhAQABAIAAAAQCBAAAACwAAAAAAQABAAACAkQBADs=

我的目标是(按优先顺序):

  1. 低内存消耗
  2. 处理器效率高
  3. 处理速度快

要求包括支持 gif、jpg 和 png。每次请求都会创建 20 到 50 张这样的单像素图​​像(每个像素独立于其他像素)。

如何生成 1px 单色图像的二进制文件?

【问题讨论】:

  • 您的代码非常简单/直接。您几乎肯定不想手动实现所有各种图像格式。
  • 输出 BMP 怎么样?对于单个像素,它与其他三种格式一样有效,并且可能足够简单,因此您可以使用一些位移和packing 直接生成二进制文件,而无需太多工作。
  • @amber 不幸的是,简单不是这个特定练习的目标。
  • @deceze 除了列出的格式之外,我还可以生成 BMP,但我确实需要支持其他格式,因为这是主要要求之一。你的方法听起来很有趣。如何直接为 1px 图像生成二进制文件?也许这应该是我的问题。
  • 您可以通过简单地生成几个字节的标头(可能是静态的)来生成 BMP,然后将这些位拼凑成单个像素的颜色值。请参阅en.wikipedia.org/wiki/BMP_file_format 的格式说明以了解开始。一个新的问题可能确实很有趣。

标签: php image base64


【解决方案1】:

我不是这个领域的专家。但我遇到了“ImageMagick”,这是一个用于创建和修改图像的原生 PHP 扩展。它可以读取、转换和写入各种格式(超过 100 种)的图像,包括 DPX、EXR、GIF、JPEG、JPEG-2000、PDF、PhotoCD、PNG、Postscript、SVG 和 TIFF。

【讨论】:

  • 绝对不能帮助他实现目标:低内存、cpu 使用率、速度。
【解决方案2】:

我建议为每个支持的大小为 1x1 像素的图像保留一个二进制字符串,并找到一个存储颜色数据的位置(使用可用的规范)。然后,您只需将所需的颜色放在那里并进行 base64 编码。

这应该至少适用于 PNG 和 GIF。他们有调色板,所有颜色数据都存储在一个地方。另一方面,JPG 没有普通的 RGB,所以它有点棘手(而且绝对不是 1x1 图像的最佳选择)。

【讨论】:

  • 我已经考虑过这种方法,但我担心检索(延迟)对于这个特定的练习来说可能是一个太大的瓶颈。
  • @BillH 修改已存储在内存中的字符串中的 4 个字节几乎不是瓶颈。进行 base64 编码可能是其中之一,但您也可以为您以前拥有的值或(如果您对数据有一些知识)期望拥有的值实现编码缓存。但是,后者会消耗内存,这是优先于 CPU 使用率的 1。
猜你喜欢
  • 1970-01-01
  • 2016-10-15
  • 2019-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-17
相关资源
最近更新 更多