Zxing怪异的形象反转
本文关键字:Zxing | 更新日期: 2023-09-27 18:17:07
我正在编写c#库,用于非常简单的识别图像,以便在monodroid
中使用它,并使用zxing
端口到c#。但是当我从文件中读取图像字节后,我做了这样的事情,就像在zxing
条形码扫描中一样。
binaryBitmap = new BinaryBitmap(new HybridBinarizer(new RGBLuminanceSource(rawRgb, width, height, format)));
但不知何故,它通过垂直方向反转图像。我只是将binaryBitmap
保存为像素文件的位图。
请告诉我为什么会这样?我做错了什么?
@Michael我使用Zxing.Net.Mobile端口,从这里https://github.com/Redth/ZXing.Net.Mobile。这对我来说很奇怪,如果我使用PlanarYUVLuminanceSource -然后我得到这样的图像http://i.imgur.com/OlwqC0I.png,但如果我使用RGBLuminanceSource然后我得到完整的几乎正常的图像,见示例图像。所以现在我有两个问题:
- 为什么平面只取图像的一部分并且有"层对层"的效果?和
- 好吧,如果我使用RGBLuminanceSource,为什么它有一些颜色反转,我的意思是矩形的边界是黑色和白色的地方。因为它是实像,它们都是黑色的?
更新:这是我如何从设备获取字节,也如你所见,我设置了nv21格式,所以它必须是YUV,不是吗?我想知道,我做错了什么,rgb源工作(在列表图像是好的)和PLanarYUV不是:(顺便说一句,来自预览帧的原始字节具有结果和相同的文件大小。任何建议吗?
public void OnPreviewFrame(byte[] bytes, Android.Hardware.Camera camera)
{
var img = new YuvImage(bytes, ImageFormatType.Nv21, cameraParameters.PreviewSize.Width, cameraParameters.PreviewSize.Height, null); string _fileName2 = "YUV_BYtes_"+ DateTime.Now.Ticks +".txt";
string pathToFile2 = Path.Combine(Android.OS.Environment.ExternalStorageDirectory.AbsolutePath, _fileName2);
using (var fileStream = new FileStream(pathToFile2, FileMode.Append, FileAccess.Write, FileShare.None))
{
fileStream.Write(img.GetYuvData(), 0, img.GetYuvData().Length);
}
}
public void SurfaceChanged(ISurfaceHolder holder, global::Android.Graphics.Format format, int width, int height)
{
if (camera == null)
return;
var parameters = camera.GetParameters();
width = parameters.PreviewSize.Width;
height = parameters.PreviewSize.Height;
parameters.PreviewFormat = ImageFormatType.Nv21;
//parameters.PreviewFrameRate = 15;
//this.height = size.height;
//this.width = size.width;
//camera.setParameters( params );
//parameters.PreviewFormat = ImageFormatType.;
camera.SetParameters(parameters);
camera.SetDisplayOrientation(90);
camera.StartPreview();
cameraResolution = new Size(parameters.PreviewSize.Width, parameters.PreviewSize.Height);
AutoFocus();
}
我想我知道你做了什么。数据看起来像RGB565位图数据(或类似的东西)。你不能把这样一个字节数组放到PlanarYUVLuminanceSource中。您必须确保与平面源一起使用的字节数组实际上是只有yuv数据的数组,而不是RGB565。规则很简单:如果使用以下代码片段
new RGBLuminanceSource(rawRgb, width, height, format)
确保format的值与参数rawRgb的布局和数据匹配。如果您使用以下内容
new PlanarYUVLuminanceSource(yuvBytes, 640, 960, 0, 0, 640, 960, false);
确保yuvBytes只包含真正的yuv数据。我只能给出一个更好的答案,如果你张贴更完整的代码样本。