1
no1xsyzy 2021-02-25 12:22:07 +08:00
随便地搜索了一下,看到这个:
//注意这儿有个坑,ARGBToI420 内存顺序是 BGRA //BGRAToI420 内存顺序是 ARGB 不知道是否有关 |
3
darer 2021-02-25 13:32:07 +08:00
只是说数据不对也判断不出是什么问题吧
还是再补充一些信息吧 |
4
AX5N 2021-02-25 13:38:27 +08:00
你把 argb 映射到 srgb 了吗
|
5
fengwei23 OP @darer #3 确实是这样的,但是我不是很好描述
``` Image image = reader.acquireLatestImage(); if (image != null) { Image.Plane[] planes = image.getPlanes(); Image.Plane plane = planes[0]; ByteBuffer buffer = plane.getBuffer(); byte[] bytes = new byte[buffer.remaining()]; buffer.get(bytes, 0, bytes.length); if (mDataThread != null) { mDataThread.addData(bytes); } image.close(); } ``` 上面是我从 image 中取出来的数据,然后把这个数据送给的 libyuv 去转换的,iamgereader 用的是 PixelFormat.RGBA_8888,libyuv 用的是 ABGRToI420 |
7
AX5N 2021-02-25 14:11:36 +08:00
@fengwei23 没在手机上开发过这些东西,但我觉得就是色域的问题。
理论上你应该声明 2 次,一次是转成 yuv 的时候,一次是转回 rgb 的时候。如果你不清楚你这个解码器的工作原理,那你最好直接转成 srgb 一劳永逸,缺点是会压缩色彩空间。如果你编码解码都是自己负责,那你可以自己捣鼓下相关参数。 |
8
qieqie 2021-02-25 14:20:45 +08:00
这个代码意思是取 Y 平面然后清空,然后转换?
地铁老人看手机.jpg |
9
qieqie 2021-02-25 14:23:51 +08:00
看上去你这样只是拿到了一个灰度图
|
10
LouisLiu 2021-02-25 14:36:24 +08:00
Android 读取的 argb8888 是大端对齐,而 c/c++对应的是 abgr,例如 libyuv::ABGRToI420
|
11
newmlp 2021-02-25 16:24:10 +08:00
argb 顺序不对,用过 libyuv 的基本都踩过这个坑
|
12
elonmask 2021-02-25 16:29:19 +08:00
改 renderscript 吧
|
13
rabbitknight 2021-03-08 10:33:05 +08:00
imagereader 可以直接获取 YUV420_888 数据。然后拿 libyuv::Android420ToI420 转换。
rgb<->yuv 转换资源消耗太大了。 |
14
fengwei23 OP @rabbitknight #13 我是用 Mediaprojection 来配合使用的,YUV420_888 这种格式使用的时候显示不支持
|