【问题标题】:Change image per pixel and save to db更改每个像素的图像并保存到数据库
【发布时间】:2012-10-30 19:30:55
【问题描述】:

我正在制作一个小网络游戏,我正在寻找一种方法来处理每个像素的图像并将其存储在 mysql 数据库中。准确地说,我需要能够做到以下几点:

  • 从屏幕上的mysql db加载图像(250 x 250px)(图像不可见。例如,每个像素的alpha为0);
  • 随机选取几个像素并将 alpha 设置为 1;
  • 将新图像保存在 mysql 数据库中的旧图像之上
  • 加载具有多个可见像素的新图像;
  • 随机选取几个像素,将 alpha 设置为 1; 等等。

我已经设法让这件事发挥作用,但效率很低。我的 mysql 数据库中有数千条记录,每条记录中都有一个存储有正确位置、颜色和可见性的像素。当图像渲染到屏幕上时,需要读出每条记录。

我查看了 html5 画布,但还没有找到正确的方法。实际上,此刻我不知道最好的方法是什么。希望有人可以在这里提供帮助。

【问题讨论】:

    标签: canvas pixel


    【解决方案1】:

    有几种方法可以做到这一点。

    是的,画布就是你想要的。您可以使用画布来操作图像数据(请参阅pixel manipulation with Canvas on the MDN)。

    为了保存到您的服务器和恢复,您不应该使用数千条记录。您应该使用类似单个 base64 字符串来描述您的图像。画布 API 有一个检索它的方法,称为 toDataURL()

    【讨论】:

    • 最终图像保密很重要。如果我在 PHP 中从 mysql 获取 base64 字符串并使用 javascript 将其传递给画布,可以做到这一点吗?
    • 我现在可以使用 PHP GD。有一些小问题,但我认为它们可以解决。你可以找到脚本here
    【解决方案2】:

    听起来你想要的是一个线性同余随机数生成器。它们实际上比编程和使用要复杂得多(甚至写出它的名字!)。它们真的很容易使用。

    http://en.wikipedia.org/wiki/Linear_congruential_generator

    使用这些,您可以只将当前的seed 值(即您选择首先设置的像素,或者您之前设置的像素)传递到表达式中:

    seed = ((seed * multiplier) + increment) % modulus.
    

    如下选择值: seed = 您的初始值必须大于 0 且小于模数。

    modulus = 图像中的像素总数(即width * height),在 PHP 中必须为 2^31 或更少。它可以多一点,尽管您的代码效率会降低:比像素数大 2 的下一个幂可能是一个不错的选择。

    increment = 最简单:“1”。或者,最多为 23,622,320,123 的素数。或者如果不是这样,那么至少与模数互质,并且小于 (2^53-(modulus*multiplier))。

    multiplier:

    • 比能被模的所有素因数整除的数多一个。
    • 如果模数是 4 的倍数,则大于 4 的倍数。
    • 小于 2^22。
    • 如果您选择的模数是 2 的幂,那么这个乘数可以是 (小素数 * 4) + 1。所以,5 或 9,或其他什么。

    这种仔细选择值意味着,当您重复种子生成代码modulus 次时,您将永远不会得到重复的数字 - 您只会半随机地“选择”每个像素一次。

    如果您的 modulus 大于 width * height,您有时会选择一个不在图像“内”的像素:如果您的图像是 10x10 或 100 像素,并且您选择了 128 的 modulus(下一个2) 的最大幂,那么你就有机会选择 100 到 127 之间的数字。在这种情况下,你可以再次循环它直到你得到一个有效的像素,或者只是改变更少的像素。

    但如果它选择了一个从 0 到 99 的像素,那就是要使用的像素。因此,对于 10x10 的图像,种子 37 可能意味着第四行第八像素。

    具体来说:

    $pixelX = $seed / $width;
    $pixelY = $seed % $width;
    

    【讨论】:

      猜你喜欢
      • 2020-05-08
      • 2019-12-21
      • 1970-01-01
      • 2021-04-10
      • 2017-09-20
      • 1970-01-01
      相关资源
      最近更新 更多