账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    yv12格式视频流保存成jpg/png图片或转rgb格式(java)
    • 2020-01-01 00:00
    • 11
    27
    0

    问题描述

    java,java,java的,研究海康摄像头,拿到了yv12格式的视频流数据,现在需要保存成图片或图片流数据,度娘后基本都是转rbg后再保存图片,在java这边有没有什么框架能支持yv12转rgb及rgb转图片或图片流的?或yv12直接转图片流等?

    问题出现的环境背景及自己尝试过哪些方法

    度娘找到的yv12转rgb的方法,效率不是很好,现rgb转图片或图片流不会,有没有方法?

    相关代码

    // 请把代码文本粘贴到下方(请勿用图片代替代码)

    // YV12格式一个像素占1.5个字节
        private byte[] YV12_To_RGB24(byte[] yv12, int width, int height) {
            if (yv12 == null || width < 1 || height < 1) {
                return null;
            }
    
            int nYLen = width * height;
            int halfWidth = width >> 1;
    
            if (nYLen < 1 || halfWidth < 1) {
                return null;
            }
    
            byte[] rgb24 = new byte[width * height * 3];
            int[] rgb = new int[3];
            int i, j, m, n, x, y;
            m = -width;
            n = -halfWidth;
            for (y = 0; y < height; y++) {
                m += width;
                if (y % 2 != 0) {
                    n += halfWidth;
                }
    
                for (x = 0; x < width; x++) {
                    i = m + x;
                    j = n + (x >> 1);
                    rgb[2] = (int) ((int) (yv12[i] & 0xFF) + 1.370705 * ((int) (yv12[nYLen + j] & 0xFF) - 128)); // r
                    rgb[1] = (int) ((int) (yv12[i] & 0xFF) - 0.698001 * ((int) (yv12[nYLen + (nYLen >> 2) + j] & 0xFF) - 128) - 0.703125 * ((int) (yv12[nYLen + j] & 0xFF) - 128));   // g
                    rgb[0] = (int) ((int) (yv12[i] & 0xFF) + 1.732446 * ((int) (yv12[nYLen + (nYLen >> 2) + j] & 0xFF) - 128)); // b
    
                    //j = nYLen - iWidth - m + x;
                    //i = (j<<1) + j;    //图像是上下颠倒的
    
                    j = m + x;
                    i = (j << 1) + j;
    
                    for (j = 0; j < 3; j++) {
                        if (rgb[j] >= 0 && rgb[j] <= 255) {
                            rgb24[i + j] = (byte) rgb[j];
                        } else {
                            rgb24[i + j] = (byte) ((rgb[j] < 0) ? 0 : 255);
                        }
                    }
                }
            }
    
            return rgb24;
        }

    你期待的结果是什么?实际看到的错误信息又是什么?

    0
    打赏
    收藏
    点击回答
    您的回答被采纳后将获得:提问者悬赏的 11 元积分
        全部回答
    • 0
    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部