1

renderscript の ScriptIntrinsicYuvToRGB クラスを使用して、ソースが YUV420 形式の YUV から RGB への変換を試みます。ファイルから読み取った 3 つの未加工のプレーンがあり、それらを YUV 種類の割り当てにフィードして、ScriptIntrinsicYuvToRGB.forEach を介して渡します。

輝度 (Y プレーン) は正しく変換されますが、クロマ チャネルが buf[w*h] の場所からすべての値を読み取るように見えるため、色では失敗します。コード サンプルのコメント部分を参照してください。Allocation が UV プレーンに適切に対処しない場合、バグのように見えます。割り当て時に関数を使用してスクリプトでテストし、rsGetElementAtYuv_uchar_Uどの座標に対しても同じ値 (buf[w*h] から) を与えるため、そう推測します。

ストライド/オフセットなどのYUV形式をさらに指定できるかどうか、すべての場所を検索しましたが、その設定Element.DataKind.PIXEL_YUVType.Builder.setYuvFormat(ImageFormat.YUV_420_888)..

誰かがこれを手伝ってくれますか?

{
      int w = 320, h = 172;
      ScriptIntrinsicYuvToRGB yc = ScriptIntrinsicYuvToRGB.create(rs, Element.U8_4(rs));
      {
         Element elemYUV = Element.createPixel(rs, Element.DataType.UNSIGNED_8, Element.DataKind.PIXEL_YUV);
         Type typeYUV = new Type.Builder(rs, elemYUV).setX(w).setY(h).setYuvFormat(ImageFormat.YUV_420_888).create();
         Allocation yuv = Allocation.createTyped(rs, typeYUV);
         byte[] buf = new byte[yuv.getBytesSize()];
         int offs = 0;
         for(int i=0; i<3; i++){
            int sz = w*h;
            if(i>0)
               sz /= 4;
            InputStream is = new FileInputStream("/sdcard/yuv/"+(i==0 ? 'y' : i==1 ? 'u' : 'v'));
            int n = is.read(buf, offs, sz);
            if(n!=sz)
               throw new AssertionError("!");
            offs += sz;
            is.close();
         }
//               buf[w*h] = 0x40;
         yuv.copyFrom(buf);
         yc.setInput(yuv);
      }

      Type outType = new Type.Builder(rs, Element.U8_4(rs)).setX(w).setY(h).create();
      Allocation out = Allocation.createTyped(rs, outType);
      yc.forEach(out);

      int[] buf = new int[out.getBytesSize()/4];
      out.copy1DRangeToUnchecked(0, w*h, buf);

      bm = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
      bm.setPixels(buf, 0, bm.getWidth(), 0, 0, bm.getWidth(), bm.getHeight());
      iv.setImageBitmap(bm);

      yc.destroy();
   }
4

2 に答える 2