2

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

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

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

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

4

2 回答 2

0

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

是的,画布就是你想要的。您可以使用画布来操作图像数据(请参阅MDN 上使用 Canvas 进行像素操作)。

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

于 2012-10-30T22:40:35.290 回答
0

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

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-(模数*乘数))。

multiplier

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

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

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

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

具体来说:

$pixelX = $seed / $width;
$pixelY = $seed % $width;
于 2015-05-18T23:23:02.880 回答