簡體   English   中英

在 android 中錄制視頻時旋轉圖像幀

[英]rotate image frame while video recording in android

我想在視頻錄制時旋轉圖像幀,我找到了一種旋轉圖像字節數組的解決方案,如下面的代碼。

private byte[] rotateYUV420Degree90(byte[] data, int imageWidth, int imageHeight) {

          byte[] yuv = new byte[imageWidth * imageHeight * 3 / 2];
          // Rotate the Y luma
          int i = 0;
          for (int x = 0; x < imageWidth; x++) {
              for (int y = imageHeight - 1; y >= 0; y--) {
                  yuv[i] = data[y * imageWidth + x];
                  i++;
              }

          }
          // Rotate the U and V color components
          i = imageWidth * imageHeight * 3 / 2 - 1;
          for (int x = imageWidth - 1; x > 0; x = x - 2) {
              for (int y = 0; y < imageHeight / 2; y++) {
                  yuv[i] = data[(imageWidth * imageHeight) + (y * imageWidth) + x];
                  i--;
                  yuv[i] = data[(imageWidth * imageHeight) + (y * imageWidth) + (x - 1)];
                  i--;
              }
          }
          return yuv;
      }

此代碼返回這樣的錯誤圖像在此處輸入圖像描述

如果有人有想法實現這一點,請幫助我旋轉字節數組圖像。

謝謝你。

我找到了 NV12 方法的解決方案,這種方法通過我已經實現了正確的 output,如果有人遇到同樣的問題,請嘗試以下代碼。

public  byte[] rotateNV21(byte[] input, int width, int height, int rotation) {
        byte[] output = new byte[input.length];
        boolean swap = (rotation == 90 || rotation == 270);
        // **EDIT:** in portrait mode & front cam this needs to be set to true:
        boolean yflip = true;// (rotation == 90 || rotation == 180);
        boolean xflip = (rotation == 270 || rotation == 180);
        for (int x = 0; x < width; x++) {
            for (int y = 0; y < height; y++) {
                int xo = x, yo = y;
                int w = width, h = height;
                int xi = xo, yi = yo;
                if (swap) {
                    xi = w * yo / h;
                    yi = h * xo / w;
                }
                if (yflip) {
                    yi = h - yi - 1;
                }
                if (xflip) {
                    xi = w - xi - 1;
                }
                output[w * yo + xo] = input[w * yi + xi];
                int fs = w * h;
                int qs = (fs >> 2);
                xi = (xi >> 1);
                yi = (yi >> 1);
                xo = (xo >> 1);
                yo = (yo >> 1);
                w = (w >> 1);
                h = (h >> 1);
                // adjust for interleave here
                int ui = fs + (w * yi + xi) * 2;
                int uo = fs + (w * yo + xo) * 2;
                // and here
                int vi = ui + 1;
                int vo = uo + 1;
                output[uo] = input[ui];
                output[vo] = input[vi];
            }
        }
        return output;
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM