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然后我得到完整的几乎正常的图像,见示例图像。所以现在我有两个问题:

  1. 为什么平面只取图像的一部分并且有"层对层"的效果?和
  2. 好吧,如果我使用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();
    }

Zxing怪异的形象反转

我想我知道你做了什么。数据看起来像RGB565位图数据(或类似的东西)。你不能把这样一个字节数组放到PlanarYUVLuminanceSource中。您必须确保与平面源一起使用的字节数组实际上是只有yuv数据的数组,而不是RGB565。规则很简单:如果使用以下代码片段

new RGBLuminanceSource(rawRgb, width, height, format)

确保format的值与参数rawRgb的布局和数据匹配。如果您使用以下内容

new PlanarYUVLuminanceSource(yuvBytes, 640, 960, 0, 0, 640, 960, false);

确保yuvBytes只包含真正的yuv数据。我只能给出一个更好的答案,如果你张贴更完整的代码样本。