到目前为止,我所开发的是能够使用标准DngCreator
方案写出各种设备原始信息。
在我遇到的一台设备上(HTC 10),Image
类包含行间距大于宽度的平面信息。到目前为止,我已经了解到图像会发生这种情况,但我无法找到如何使用我们可用的SDK来纠正它。
ByteBuffer byteBuffer = ByteBuffer.wrap(cameraImageF.getRawBytes());
byteBuffer.rewind();
dngCreator.writeByteBuffer(new FileOutputStream(rawLoggerFileF),
new Size(cameraImageF.getRawImageSize().getWidth(), cameraImageF.getRawImageSize().getHeight()),
byteBuffer, 0);
我已经保留了原始Image
类的字节,并在收到它们之间和它们被拍摄时进行了一些实质性的计算(这是应用程序的要点)。所以,我需要放开Image
以便我可以继续从相机中获取其他帧。
现在,这种方法适用于各种设备(Samsung S7,Nexus 5,Nexus 6p等)。但是在HTC 10上,每行的步幅增加了16个字节,似乎我无法让DngCreator
知道这一点。
在源代码的下方,writeBuffer默认为内部rowStride = width * pixelStride
。我没有能力为参数发送不同的步幅。 rowStride不等于默认值。
dngCreator.saveImage(Outputstream, Image)
在写入缓冲区时使用内部Image的步幅。但是,我无法保持相机上的Image
类,因为它需要被释放并且它不是可克隆对象。
我有点迷失并且试图理解如何为具有rowStride>的照片写出有效的.dng。宽度。
答案 0 :(得分:1)
您必须手动删除多余的字节 - 也就是说,将原始图像复制到新的ByteBuffer,并删除每行末尾的额外字节。如下所示:
byte[] rawBytes = cameraImageF.getRawBytes();
ByteBuffer dst = ByteBuffer.allocate(cameraImageF.getRawImageSize().getWidth() * cameraImageF.getRawImageSize().getHeight() * 2);
for (int row = 0; row < cameraImageF.getRawImageSize().getHeight(); row++) {
dst.put(rawBytes,
row * cameraImageF.getRawImageRowStride(),
cameraImageF.getRawImageSize().getWidth() * 2);
}
dst.rewind();
dngCreator.writeByteBuffer(new FileOutputStream(rawLoggerFileF),
new Size(cameraImageF.getRawImageSize().getWidth(),
cameraImageF.getRawImageSize().getHeight()),
dst, 0);
这当然不是很有效,但是由于DngCreator不允许你用ByteBuffer界面指定一个行距,所以它是你唯一的选择。
您是否有理由将RAW ImageReader的maxCount提高到更高的值,以便您可以抓住图像直到您完成处理?