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

Canvas 更改每像素图像并保存到db,canvas,pixel,Canvas,Pixel,我正在制作一个小的网络游戏,我正在寻找一种方法来处理每像素的图像,并将其存储在mysql数据库中。准确地说,我需要能够做到以下几点: 在屏幕上从mysql db加载图像(250 x 250px)(图像不可见,例如每个像素的alpha为0) 随机选取几个像素,将alpha设置为1 将新映像保存在mysql数据库中的旧映像之上 加载可见像素数的新图像 随机选取几个像素,将alpha设置为1; 等等 我已经设法使这件事运作起来了,但效率很低。我的mysql数据库中有数千条记录,每条记录中都有一个位

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

  • 在屏幕上从mysql db加载图像(250 x 250px)(图像不可见,例如每个像素的alpha为0)
  • 随机选取几个像素,将alpha设置为1
  • 将新映像保存在mysql数据库中的旧映像之上
  • 加载可见像素数的新图像
  • 随机选取几个像素,将alpha设置为1; 等等
我已经设法使这件事运作起来了,但效率很低。我的mysql数据库中有数千条记录,每条记录中都有一个位置、颜色和可见性正确的像素。当图像呈现到屏幕上时,需要读取每条记录


我看过html5画布,但还没有找到正确的方法。实际上,现在我不知道最好的方法是什么。希望有人能帮上忙。

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

是的,画布就是你想要的。可以使用画布操作图像数据(请参见)


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

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

使用这些选项,您可以仅将当前的
种子值
传递到表达式中(该值是您首先选择设置的像素,或之前设置的像素):

seed = ((seed * multiplier) + increment) % modulus.
选择以下值:
seed
=初始值必须大于0且小于模数

module
=图像中的总像素数(即,
width*height
),在PHP中必须小于等于2^31。虽然代码的效率较低,但它可以稍高一些:下一个大于像素数的2次方可能是一个不错的选择

increment
=最简单的:“1”。或者,一个质数,最多23622320123。或者如果不是这样,则至少用模相对质数,并且小于(2^53-(模*乘数))

乘数

  • 一个大于一个可被模的所有素数因子整除的数
  • 如果模量为4的倍数,则比4的倍数多1倍
  • 小于2^22
  • 如果你选择一个2的幂的模,那么这个乘法器可以是(小素数*4)+1。所以,5,或9,或其他
这种精心选择的值意味着,当您重复种子生成代码<代码>模数次时,您将永远不会得到重复的数字-您将半随机地“选择”每个像素仅一次

如果您的
模数
大于
宽度*高度
,您有时会选择一个不在图像中的像素:如果您的图像为10x10或100像素,您选择的
模数
为128(下一个最大幂为2),则您有机会选择100到127之间的数字。在这种情况下,您可以再次循环,直到获得有效像素,或者只更改较少的像素

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

具体而言:

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

最后的图像保密很重要。如果我在PHP中从mysql获取base64字符串并用javascript将其传递到画布,可以做到这一点吗?我现在就用PHP GD获得了它。有一些小问题,但我认为可以解决。你可以找到脚本