【问题标题】:Zxing weird image reversezxing怪异图片反转
【发布时间】:2013-06-06 11:51:20
【问题描述】:

我正在为非常简单的识别图像编写 C# lib,以便在 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端口?那里有不同的。请发布您用于保存 binaryBitmap 的代码。
  • @Michael 我已将您的问题的答案添加到主要问题中。谢谢!
  • 真的很奇怪的图像。我无法想象这应该是 zxing.net 的问题。在这种情况下,其他人应该有同样的经历。你试过github上最新的ZXing.Net.Mobile源码吗?你能给我原始图像和/或图像 rgb 数据的转储吗?
  • @Michael 我已将文件上传到谷歌驱动器,请您下载、保存并从中读取字节。这个图像转换让我很生气...docs.google.com/file/d/0B05QJExBv861RUNmV2p1N2llbWs/…

标签: c# .net xamarin.android zxing xamarin


【解决方案1】:

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

new RGBLuminanceSource(rawRgb, width, height, format)

确保 format 的值与参数 rawRgb 的布局和数据相匹配。 如果你使用类似下面的东西

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

确保 yuvBytes 只包含真正的 yuv 数据。 如果您发布更完整的代码示例,我只能给出更好的答案。

【讨论】:

  • 预览图的宽高是多少?
  • 感谢您的帮助,但问题出在 fu... 设备上 :( 但相机可以正常工作,很奇怪。因为我在另一台设备上尝试过,一切正常。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多