YUV 数据和 Bitmap 互相转换

2023-05-16

YUV 数据和 Bitmap 互相转换

在 Android 的 Camera 应用开发过程中会遇到需要保存预览图像进行分析的情况,比如人脸检测或扫描等场景。此时需要将预览的 YUV 数据转为为 Bitmap 保存下来,方便分析;同时也可能遇到需要将 Bitmap 图像转换为 YUV 数据的情况,这样可以使用任意的图片进行调试和测试。

这里分享一下我这边用来测试的代码,貌似也是之前在网上找到,这里也当做个备份吧~

    public static Bitmap yuv2Bmp(byte[] data, int width, int height) {
        ByteArrayOutputStream baos;
        byte[] rawImage;
        Bitmap bitmap;
        BitmapFactory.Options newOpts = new BitmapFactory.Options();
        newOpts.inJustDecodeBounds = true;
        YuvImage yuvimage = new YuvImage(
                data,
                ImageFormat.NV21,
                width,
                height,
                null);
        baos = new ByteArrayOutputStream();
        yuvimage.compressToJpeg(new Rect(0, 0, width, height), 100, baos);
        rawImage = baos.toByteArray();
        BitmapFactory.Options options = new BitmapFactory.Options();
        options.inPreferredConfig = Bitmap.Config.ARGB_8888;
        bitmap = BitmapFactory.decodeByteArray(rawImage, 0, rawImage.length, options);
        return bitmap;
    }
    public static byte[] bmp2Yuv(Bitmap bitmap) {   
       int width = bitmap.getWidth();  
       int height = bitmap.getHeight();  
     
       int size = width * height;  
     
       int pixels[] = new int[size];  
       bitmap.getPixels(pixels, 0, width, 0, 0, width, height);  
     
       byte[] data = rgb2YCbCr420(pixels, width, height);  
       return data;  
    }
    
    public static byte[] rgb2YCbCr420(int[] pixels, int width, int height) {  
       int len = width * height;  
       // yuv格式数组大小,y亮度占len长度,u、v各占len/4长度
       byte[] yuv = new byte[len * 3 / 2];  
       int y, u, v;  
       for (int i = 0; i < height; i++) {  
           for (int j = 0; j < width; j++) {  
               // 屏蔽ARGB的透明度 
               int rgb = pixels[i * width + j] & 0x00FFFFFF;  
               // 像素的颜色顺序为bgr,移位运算
               int r = rgb & 0xFF;  
               int g = (rgb >> 8) & 0xFF;  
               int b = (rgb >> 16) & 0xFF;  
               // 套用公式
               y = ((66 * r + 129 * g + 25 * b + 128) >> 8) + 16;  
               u = ((-38 * r - 74 * g + 112 * b + 128) >> 8) + 128;  
               v = ((112 * r - 94 * g - 18 * b + 128) >> 8) + 128;  
               // 调整
               y = y < 16 ? 16 : (y > 255 ? 255 : y);  
               u = u < 0 ? 0 : (u > 255 ? 255 : u);  
               v = v < 0 ? 0 : (v > 255 ? 255 : v);  
               // 复制 
               yuv[i * width + j] = (byte) y;  
               yuv[len + (i >> 1) * width + (j & ~1) + 0] = (byte) u;  
               yuv[len + +(i >> 1) * width + (j & ~1) + 1] = (byte) v;  
           }  
       }  
       return yuv;  
    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

YUV 数据和 Bitmap 互相转换 的相关文章

  • .Net 使用 Lockbits 从位图中获取 RGB 值

    我使用下面的代码从图像中提取 RGB 值 有时这有效 但是在某些文件上 似乎步幅不能被位图宽度整除 它返回混合值 Dim rect As New Rectangle 0 0 bmp Width bmp Height Dim bmpData
  • 有没有办法获取Bitmap的存储大小?

    在我的应用程序中 我正在下载一些图像 我想知道是否有任何方法可以获得我下载的位图的大小 这是一个简单的问题 但我似乎无法通过谷歌找到解决方案 这是下载代码 Bitmap b BitmapFactory decodeStream InputS
  • 将预览帧转换为位图

    我知道这个主题已经在黑板上出现过很多次了 但无论如何我都无法让它发挥作用 我想将预览中的视图帧保存为 jpeg 文件 它看起来或多或少 代码被简化 没有额外的逻辑 异常等 像这样 public void onPreviewFrame byt
  • System.Drawing - 参数无效

    经过更多测试后 我发现此问题可能是由于图像未及时加载以克隆到位图并显示所致 这可能还是不可能 注意 是的 标题中还有其他与此错误相关的问题 但从一些研究来看 它似乎是一个含糊不清的错误 有许多可能的原因 我没有发现任何与我的情况相同的问题
  • YUY2 与 YUV 422

    我无法理解两者之间的确切区别 从研究来看 更多地讨论两者是不同的 但少数人似乎将它们分组在 4 2 2 抽样方案下 YUV 422 I 和 J 版本 有一个亮度平面 Y 和 2 个色度平面 U V 然而 在 I422 中 色度平面 蓝色和红
  • 为我的组件位图属性赋值时发生访问冲突[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我正在尝试创建一个必须使用位图的组件
  • 如何在 C++ 中存储位数组?

    在 C 中存储位数组 无 Boost 只是标准容器 例如表示卷分配位图 的最佳方式是什么 我想std vector
  • 如何从 Android 应用程序中的异步任务返回位图

    好的 这段代码就在 Android 开发者网站上 它设置了一个ImageView to a Bitmap class BitmapWorkerTask extends AsyncTask
  • 如何在 WPF 中拉伸位图而不平滑像素

    我正在开发用 WPF 编写的 SEM 图像处理应用程序 我有一个源自 Canvas 的图像显示控件 它使用 DrawingVisuals 显示图像和叠加层 每个 层 一个 它还使用应用于 DrawingVisuals 的缩放和平移变换来实现
  • 显示图像的片段中的内存问题

    我正在使用片段来显示图像 页面 我有一个活动 主要 其中包含所有片段 package com example hscroll demo import android os Bundle import android preference P
  • 尝试共享图像时 Facebook 不会出现在共享窗口上

    我在应用程序中创建了一个位图 并希望使用 Intent ACTION SEND 通过电子邮件应用程序或 Facebook 共享它 共享窗口打开 gmail 和 yahoomail 应用程序图标出现 但没有 facebook 或 g 我真的不
  • NV21 格式和奇数图像尺寸

    我在 Android 中使用 NV21 图像已经有一段时间了 我一直在跟踪可能由 NV21 图像中不正确的索引字节引起的错误 答案中的图片这个问题 https stackoverflow com questions 5272388 extr
  • 对(可能的)Android 内存泄漏一无所知

    我一直面临着一些烦人的事情OutOfMemoryErrors 即使在确保我的所有位图都正确缩放等之后 事实上 这个问题似乎与位图根本无关 但我可能是错的 出于测试和错误隔离的目的 我一直使用导航抽屉 不使用后退按钮 在两个活动 让我们称之为
  • 如何从字符串设置 imageView 的图像?

    我在 res drawable mdpi 目录中有一个条目列表和一些位图文件 我试图通过生成路径字符串并使用位图工厂来加载与从列表中选择的字符串值相对应的图像 问题是我认为我的路径不正确 因为位图始终为空 即使对于默认图像也是如此 Stri
  • 删除图像c#的圆形透明部分

    我正在位图上创建一个圆圈 但想在其中有一个洞 经过半个小时的搜索 我只找到了将图像裁剪为圆形的方法 困难的是 中间的孔应该像图像的其余部分一样透明 This https i stack imgur com Avdrv png是基础图像并且黄
  • 位图分配在 Oreo 上如何工作,以及如何调查它们的内存?

    背景 在过去的几年里 为了检查 Android 上有多少堆内存以及使用了多少内存 您可以使用如下命令 JvmStatic fun getHeapMemStats context Context String val runtime Runt
  • 当将位图加载为 Windows 资源时,是否有办法保留 BITMAPFILEHEADER?

    我一直在使用测试一些东西SFML 1 4 http sfml dev org 简单快速的多媒体库 采用 C 和 Visual C 2008 Express Edition 为了避免我的图形程序出现外部图像 我正在测试sf Image Loa
  • 如何从位图中删除白色背景色

    我想删除位图中的白色背景颜色 Bitmap capcha new Bitmap C image jpg pictureBox1 Image capcha 但我想在我的 pictureBox1 中仅显示背景中存在的没有白色的图像 尝试在验证码
  • Android - 减少位图绘制的内存使用量

    我的应用程序中有一张地图 显示了 Gowalla 的位置 我使用带有简单默认标记的 ItemizedOverlay 但在绘制项目时 我将默认标记替换为从 Gowalla 下载 9 并缓存在磁盘上 的位置图标 问题是 如果屏幕上有很多位置 例
  • NSImage 到 NSBitmapImageRep

    如何将 NSImage 转换为 NSBitmapImageRep 我有代码 NSBitmapImageRep bitmapImageRepresentation NSBitmapImageRep ret NSBitmapImageRep s

随机推荐