更改每像素的图像并保存到db

时间:2012-10-30 19:30:56

标签: canvas pixel

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

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

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

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

2 个答案:

答案 0 :(得分:0)

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

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

要保存到您的服务器并恢复,您不应该使用数千条记录。您应该使用类似于描述图像的单个base64字符串。 canvas API有一个检索此方法的方法toDataURL()

答案 1 :(得分: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像素,并且你选择了modulus 128(下一个最大功率为2),那么你有机会选择100到127之间的数字。在这种情况下,您可以再次循环,直到获得有效像素,或者只更改更少的像素。

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

具体做法是:

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