android 将Bitmap转YUV420sp(实例)



/**
     * 将bitmap里得到的argb数据转成yuv420sp格式
     * 这个yuv420sp数据就可以直接传给MediaCodec,通过AvcEncoder间接进行编码
     * @param yuv420sp 用来存放yuv429sp数据
     * @param argb 传入argb数据
     * @param width   图片width
     * @param height 图片height
     */
    public static void encodeYUV420SP(byte[] yuv420sp, int[] argb, int width, int height) {
        final int frameSize = width * height;

        int yIndex = 0;
        int uvIndex = frameSize;

        int a, R, G, B, Y, U, V;
        int index = 0;
        for (int j = 0; j < height; j++) {
            for (int i = 0; i < width; i++) {

                a = (argb[index] & 0xff000000) >> 24; // a is not used obviously
                R = (argb[index] & 0xff0000) >> 16;
                G = (argb[index] & 0xff00) >> 8;
                B = (argb[index] & 0xff) >> 0;

                // well known RGB to YUV algorithm
                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;

                // NV21 has a plane of Y and interleaved planes of VU each sampled by a factor of 2
                //    meaning for every 4 Y pixels there are 1 V and 1 U.  Note the sampling is every other
                //    pixel AND every other scanline.
                yuv420sp[yIndex++] = (byte) ((Y < 0) ? 0 : ((Y > 255) ? 255 : Y));
                if (j % 2 == 0 && index % 2 == 0) {
                    yuv420sp[uvIndex++] = (byte)((V<0) ? 0 : ((V > 255) ? 255 : V));
                    yuv420sp[uvIndex++] = (byte)((U<0) ? 0 : ((U > 255) ? 255 : U));
                }

                index ++;
            }
        }
    }








Android中,将JPEG图片换为YUV 420格式通常涉及到两个步骤:解码JPEG到RGB图像,然后将RGB数据换为YUV 420。这里以Java为例,你可以使用Android的`Bitmap`类以及`exif`库来进行处理: 1. **解码JPEG到RGB**: ```java BitmapFactory.Options options = new BitmapFactory.Options(); options.inPreferredConfig = Bitmap.Config.RGB_565; // 设置预加载的配置 Bitmap bitmap = BitmapFactory.decodeResource(getResources(), yourImageResourceId, options); ``` 2. **换为YUV 420**: Android提供了一个名为`MediaCodec`的API,可以用于视频编码和解码,包括YUV格式。首先需要创建`SurfaceTexture`和`MediaCodec`对象,然后创建一个`ByteBuffer`来接收YUV数据: ```java SurfaceTexture texture = ...; MediaFormat format = MediaFormat.createVideoFormat("video/avc", width, height); MediaCodec decoder = MediaCodec.createDecoderByType(format.getString(MediaFormat.KEY_MIME)); decoder.configure(format, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE); ByteBuffer[] yuvBuffers = new ByteBuffer[3]; for (int i = 0; i < 3; i++) { yuvBuffers[i] = ...; // 分配足够的空间并设置缓冲区 } decoder.getInputBuffers(); // 获取输入缓冲区列表 // 这里你需要将解码后的数据放入yuvBuffers中 // 当解码完成时,会触发MediaCodec的OutputBufferInfo对象的onOutputBufferAvailable方法,那时你可以获取新的YUV帧 ``` 请注意,这个过程需要对Android多媒体框架有深入的理解,并且可能会比较复杂,因为涉及到了线程管理、解码回调等细节。如果你只是简单地想要换而不做实时解码,也可以考虑第三方库如FFmpeg。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值