Ruby 如何将字节数组转换为png图像

Ruby 如何将字节数组转换为png图像,ruby,png,Ruby,Png,我想将一个字节字符串从Ice服务器转换为png,频率高达每秒30次。我使用chunky\u pnggem来表示以下代码: data = @@cprx.getImageData() width= data.description.width height = data.description.height png = ChunkyPNG::Image.new(width,height, ChunkyPNG::Color::TRANSPARENT) pixeles = data.pixelDa

我想将一个字节字符串从Ice服务器转换为png,频率高达每秒30次。我使用
chunky\u png
gem来表示以下代码:

data = @@cprx.getImageData()
width= data.description.width   
height = data.description.height
png = ChunkyPNG::Image.new(width,height, ChunkyPNG::Color::TRANSPARENT)
pixeles = data.pixelData.bytes.to_a
k=0
for i in 0..height-1
  for j in 0..width-1
    png[j,i]=ChunkyPNG::Color.rgb(pixeles[k],pixeles[k+1],pixeles[k+2])
    k=k+3
  end
end
image = png.to_data_url

我创建一个图像,然后逐像素给出值。但是它太慢了。我想知道是否有一种更快的方法。

最后,我用来自_rgb_stream的方法解决了这个问题。此外,还有一个相当于CykykyPNG的库,叫做CuyYyPNG,这是因为C++核心更快。我的代码当前看起来像:

def ice_camera
    status = 0
    ic = nil
    if session[:conected2] == nil
        arguments= ["--Ice.Config=cameraview.cfg"]
        ic = Ice::initialize(arguments)
        base = ic.propertyToProxy("Cameraview.Camera.Proxy")
        cprx = Jderobot::CameraPrx::checkedCast(base)
        session[:conected2] = true
        thr1 = Thread.new do
            @@mutex = Mutex.new
            while true do
                puts "11111111111111111111111111111111111111111"
                data = cprx.getImageData()
                png = ChunkyPNG::Canvas.from_rgb_stream(data.description.width, data.description.height, data.pixelData)
                @@mutex.synchronize do
                    @@image=png.to_data_url
                end
            end
        end
    end
end

是每秒30张不同的图片吗?缓存是一种选择吗?您是否可以分叉4-8个进程,让所有CPU/内核保持忙碌,并以循环方式向它们发送图像?或者每个图像是否需要了解上一个/下一个图像的运动检测或类似信息?我尝试发送视频,每秒发送30个图像(可能更少,可能25个或更多)-是的,它们之间的图像是不同的,我现在不打算使用它们进行运动检测,尽管它是用于监视项目。如果您试图实现视频效果,那么
png
很可能是错误的解决方案。此外,在这种速度要求下(可能有多个客户端?),您可能应该使用ruby以外的其他语言来完成繁重的工作。请看一下
opencv
ruby绑定:例如,接收视频流。OpenCV库包含一些例程,您可能会发现这些例程对您的项目非常有用。