Hey, küçük kamera uygulaması oluşturuyorum Her şeyi uygulamam var ama NV21 bayt dizisini jpeg biçimine dönüştüren bir sorunum var
Birçok yol buldum ama hepsi bile ben bu pasajı çalıştı ve aynı cihazda çalışır Xperia z2 5.2 değil, galaxy s4 4.4.4 daNV21 bayt dizisini bitmap okunabilir biçime dönüştürün
bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);
bu yolda çalışmak ve diğer
başarısız çalışan yaöncelikle bazı cihazlarda çalışmıyor ikincisi
ben kod çözme NV21 dönüştürmek için birçok çözüm çalıştı birincisi renderscript
kod
public Bitmap convertYUV420_NV21toRGB8888_RenderScript(byte [] data,int W, int H, Fragment fragment) {
// http://stackoverflow.com/questions/20358803/how-to-use-scriptintrinsicyuvtorgb-converting-byte-yuv-to-byte-rgba
RenderScript rs;
ScriptIntrinsicYuvToRGB yuvToRgbIntrinsic;
rs = RenderScript.create(fragment.getActivity());
yuvToRgbIntrinsic = ScriptIntrinsicYuvToRGB.create(rs, Element.U8_4(rs)); //Create an intrinsic for converting YUV to RGB.
Type.Builder yuvType = new Type.Builder(rs, Element.U8(rs)).setX(data.length);
Allocation in = Allocation.createTyped(rs, yuvType.create(), Allocation.USAGE_SCRIPT); //an Allocation will be populated with empty data when it is first created
Type.Builder rgbaType = new Type.Builder(rs, Element.RGBA_8888(rs)).setX(W).setY(H);
Allocation out = Allocation.createTyped(rs, rgbaType.create(), Allocation.USAGE_SCRIPT); //an Allocation will be populated with empty data when it is first created
in.copyFrom(data);//Populate Allocations with data.
yuvToRgbIntrinsic.setInput(in); //Set the input yuv allocation, must be U8(RenderScript).
yuvToRgbIntrinsic.forEach(out); //Launch the appropriate kernels,Convert the image to RGB.
Bitmap bmpout = Bitmap.createBitmap(W, H, Bitmap.Config.ARGB_8888);
out.copyTo(bmpout); //Copy data out of Allocation objects.
return bmpout;
}
ve ayrıca bu kod
void decodeYUV420SP(int[] rgb, byte[] yuv420sp, int width, int height) {
final int frameSize = width * height;
for (int j = 0, yp = 0; j < height; j++) {
int uvp = frameSize + (j >> 1) * width, u = 0, v = 0;
for (int i = 0; i < width; i++, yp++) {
int y = (0xff & ((int) yuv420sp[yp])) - 16;
if (y < 0)
y = 0;
if ((i & 1) == 0) {
v = (0xff & yuv420sp[uvp++]) - 128;
u = (0xff & yuv420sp[uvp++]) - 128;
}
int y1192 = 1192 * y;
int r = (y1192 + 1634 * v);
int g = (y1192 - 833 * v - 400 * u);
int b = (y1192 + 2066 * u);
if (r < 0)
r = 0;
else if (r > 262143)
r = 262143;
if (g < 0)
g = 0;
else if (g > 262143)
g = 262143;
if (b < 0)
b = 0;
else if (b > 262143)
b = 262143;
rgb[yp] = 0xff000000 | ((r << 6) & 0xff0000) | ((g >> 2) & 0xff00) | ((b >> 10) & 0xff);
}
}
}
ve nihayet sd kart üzerinde görüntüyü kaydetmek için çalıştı ve daha sonra yeniden 'u yeniden açın, ancak aynı zamanda
File pictureFile = new File(filename);
int pich = camera.getParameters().getPreviewSize().height;
int picw = camera.getParameters().getPreviewSize().width;
Rect rect = new Rect(0, 0,picw, pich);
YuvImage img = new YuvImage(data, ImageFormat.NV21, picw, picw, null);
try {
FileOutputStream fos = new FileOutputStream(pictureFile);
img.compressToJpeg(rect, 100, fos);
fos.write(data);
fos.close();
Jpeg'i almak istiyorsanız, lütfen sorunuzu yeniden adlandırın, NV21'i RGB'ye dönüştürmek istediğiniz gibi görünüyor, bu tamamen farklı bir görev. –
Resmi nasıl görüntülediniz? Jpeg dosyasını bir ImageView'a yükleyin? –