Tôi có byte[] yuvByteArray
(hình ảnh 540x360 được chụp từ phương pháp Camera.PreviewCallback.onPreviewFrame
và được chuyển vào tệp assets/yuv.bin
). Tôi muốn chuyển đổi byte[] yuv
thành byte[] rgba
mảng, sử dụng mã sau (dựa trên ví dụ android của LivePreview).Cách sử dụng ScriptIntrinsicYuvToRGB (chuyển đổi byte [] yuv sang byte [] rgba)
Nhưng tôi nhận được outBytes
mảng rgba chứa đầy số không sau khi forEach và sao chép phân bổ out
thành outBytes. Có gì sai với mã của tôi?
package hellorender;
import android.app.Activity;
import android.content.res.AssetManager;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.support.v8.renderscript.Allocation;
import android.support.v8.renderscript.Element;
import android.support.v8.renderscript.RenderScript;
import android.support.v8.renderscript.ScriptIntrinsicYuvToRGB;
import android.support.v8.renderscript.Type;
import android.widget.ImageView;
import hellorender.R;
import java.io.IOException;
import java.io.InputStream;
public class HelloRenderActivity extends Activity {
public static final int W = 540;
public static final int H = 360;
private RenderScript rs;
private ScriptIntrinsicYuvToRGB yuvToRgbIntrinsic;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
AssetManager assets = getAssets();
byte[] yuvByteArray = new byte[291600];
byte[] outBytes = new byte[W * H * 4];
InputStream is = null;
try {
is = assets.open("yuv.bin");
System.out.println("read: " + is.read(yuvByteArray));
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
ImageView iv = (ImageView) findViewById(R.id.image);
rs = RenderScript.create(this);
yuvToRgbIntrinsic = ScriptIntrinsicYuvToRGB.create(rs, Element.RGBA_8888(rs));
Type.Builder yuvType = new Type.Builder(rs, Element.U8(rs))
.setX(W).setY(H)
.setYuvFormat(android.graphics.ImageFormat.NV21);
Allocation in = Allocation.createTyped(rs, yuvType.create(), Allocation.USAGE_SCRIPT);
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);
in.copyFrom(yuvByteArray);
yuvToRgbIntrinsic.setInput(in);
yuvToRgbIntrinsic.forEach(out);
out.copyTo(outBytes);
Bitmap bmpout = Bitmap.createBitmap(W, H, Bitmap.Config.ARGB_8888);
out.copyTo(bmpout);
iv.setImageBitmap(bmpout);
}
}
Rất vui khi bạn có thể làm cho nó hoạt động. Thật không may, bản chất và hầu hết các RenderScript không được tài liệu hóa tốt nên thật dễ dàng để có những điều kỳ lạ như thế này. –
Làm cách nào để nhận được mảng byte RGB được chuyển đổi? –
Điều này là điên nhanh so với việc có rutine thực hiện trong java tinh khiết !! – slott