[问题] android onPreviewframe RGB value

楼主: iamgraveboy   2014-07-14 15:59:47
大家好,小弟正在开发一款跟相机有关的app
目前遇到一些问题想请教一下各位前辈
我用onPreview产生格式为NV21的byte[]data转换为RGB
公示如下:
for(int y = 0; y < height; y++) {
for(int x = startX; x < startX+width; x++) {
Y = (0xff & ((int) data[(startY + y)*framewidth + x]));
V = (0xff & ((int) data[framesize + ((startY + y) >> 1) * framewidth + (x & ~ 1) + 0]));
U = (0xff & ((int) data[framesize + ((startY + y) >> 1) * framewidth + (x & ~ 1) + 1]));
Y = Y < 16 ? 16 : Y;
r = (int) (1.164f * (Y - 16) + 1.596f * (V - 128));
g = (int) (1.164f * (Y - 16) - 0.813f * (V - 128) - 0.391f * (U - 128));
b = (int) (1.164f * (Y - 16) + 2.018f * (U - 128));
r = r < 0 ? 0 : (r > 255 ? 255 : r);
g = g < 0 ? 0 : (g > 255 ? 255 : g);
b = b < 0 ? 0 : (b > 255 ? 255 : b);
}
}
同时我把每0.1秒的byte [] data转成图片存进手机
方法如下:
if(imageFormat == ImageFormat.NV21) {
Rect rect = new Rect(0,
0,
param.getPreviewSize().width,
param.getPreviewSize().height);
YuvImage img = new YuvImage(picturerawdata, ImageFormat.NV21,
param.getPreviewSize().width,
param.getPreviewSize().height,
null);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmssSS");
java.util.Date date = new java.util.Date();
String now = formatter.format(date);
File file = new File(Environment.getExternalStorageDirectory().toString()
+ now + ".bmp");
try
{
img.compressToJpeg(rect, 100, baos);
FileOutputStream fos = new FileOutputStream(file);
fos.write(baos.toByteArray());
fos.flush();
fos.close();
}
值顺利的取到的,图片也顺利的存到手机了
可是问题来了
当我用一些软件如imageJ去分析我存的照片时
RGB数值与我直接用nv21的byte[] data转成的RGB数值却差了10~15左右
想请问其中的数值差异来自何处?这样的差异是正常的吗?还是是我哪边出了问题?
先谢谢各位前辈的帮助了!!
作者: redok (火焰)   2014-07-15 09:36:00
跟压缩成Jpeg有关系吧?jpeg失真压缩
作者: kmank44 (k男孩)   2014-07-16 20:57:00
但是通常压缩不是只会滤掉高频的部分吗?所以出来的值理论上应该不会差到15这么多不是吗~?

Links booklink

Contact Us: admin [ a t ] ucptt.com