在我的应用程序中,我试图将呈现的 HTML 画布的任意部分保存到图像文件中。在我的 Javascript 中,我调用并将结果对象传递给我的 macruby 代码(尽管如果您知道 objc 中的解决方案,我也很感兴趣)。ctx.getImageData(x, y, w, h)
在那里,我正在尝试创建一个NSBitmapImageRep对象,以便我可以保存为用户所需的图像格式。
到目前为止,这是我的代码(该函数将WebScriptObject作为其参数):
def setimagedata(d)
w = d.valueForKey("width").to_i
h = d.valueForKey("height").to_i
data = Pointer.new(:char, d.valueForKey("data").valueForKey("length").to_i)
d.valueForKey("data").valueForKey("length").to_i.times do |i|
data[i] = d.valueForKey("data").webScriptValueAtIndex(i).to_i
end
puts "data complete" # get's called
@exported_image = NSBitmapImageRep.alloc.initWithBitmapDataPlanes(data,
pixelsWide: w, pixelsHigh:h, bitsPerSample: 32,
samplesPerPixel: 4, hasAlpha: true, isPlanar: false,
colorSpaceName: NSCalibratedRGBColorSpace,
bitmapFormat: NSAlphaNonpremultipliedBitmapFormat,
bytesPerRow: 0, bitsPerPixel: 0)
puts "done" # doesn't get called
end
该代码似乎没有通过该initWithBitmapDataPlanes
功能,但没有给出错误。
我的问题是:我做错了什么?这种方法是否合理(如果不是,什么会更好?)。
编辑
使用下面 Phrogz 的答案,我得到了一个中间解决方案:我使用另一个画布、getImageData、putImageData 和 toDataURL 来获取所需区域的数据 url。在我的setimagedata
我只是保存数据 url,我的dataOfType: error:
方法如下所示:
def dataOfType(type, error:outError)
workspace = NSWorkspace.sharedWorkspace
if workspace.type(type, conformsToType: "public.image")
@data_url[ /(?<=,).+/ ].unpack("m").first
end
end
失踪的分泌酱是这个丑陋的恶作剧:
class NSString
def writeToURL(url, options: opts, error: error)
File.open(url.path, "w") {|f| f << self }
end
end
它利用 Cocoa 中的鸭子类型,并通常在 NSData 上定义一个选择器以将自身写入文件。
到目前为止,这似乎有效,我很高兴我找到了解决方案。但是我仍然希望看到使用 NSBitmapImageRep 的解决方案。我正在实现的下一个功能是导出到视频,我相信我需要这个类提供的更精细的控制。