Canvas.drawBitmap рисует изображение с желтым оттенком

1

Я пытаюсь нарисовать компонент "Y" как оттенок серого из изображения, которое я получаю из камеры через onPreviewFrame.

Я использую версию Canvas.drawBitmap, которая принимает в качестве параметра массив "цветов". В документах Android не упоминается, в каком формате находится цвет, поэтому я предполагаю ARGB 8888.

Я получаю изображение, показывающее вверх, но оно появляется с нечетным желтым оттенком.

Вот мой код ниже:

  public void onPreviewFrame(byte[] bytes, Camera camera) {    
    Canvas canvas = null;
    try {
      synchronized(mSurfaceHolder) {
        canvas = mSurfaceHolder.lockCanvas();

        Size size = camera.getParameters().getPreviewSize();

        int width = size.width;
        int height = size.height;
        if (mHeight * mWidth != height * width)
        {
          mColors = new int[width * height];
          mHeight = height;
          mWidth = width;
          Log.i(TAG, "prewviw size = " + width + " x " + height);
        }
        for (int x = 0; x < width; x ++) {
          for (int y = 0; y < height; y++) {
            int yval = bytes[x + y * width];

            mColors[x + y * width] = (0xFF << 24) | (yval << 16) | (yval << 8) | yval;
          }
        }

        canvas.drawBitmap(mColors, 0, width, 0.f, 0.f, width, height, false, null);
      }
    }
    finally {
      if (canvas != null) {
        mSurfaceHolder.unlockCanvasAndPost(canvas);
      }
    }
  }

Я также попытался использовать другую версию Canvas.drawBitmap, которая принимает битмап в качестве параметра. Я построил Bitmap аналогичным образом из того же массива, и я сказал ему использовать ARGB явно. Но он все еще закончился тонированным Желтым!

Что я здесь делаю неправильно?

  • 0
    Может быть, ваша камера в режиме сепии?
  • 1
    Следующая строка была неправильной для отрицательных значений: int yval = bytes [x + y * width]; Я продвигал подписанный байт в целое число, а затем делал сдвиги байтов на нем. Добавление & 0xFF решает проблему.
Показать ещё 1 комментарий
Теги:
camera
bitmap

1 ответ

0

Это другой подход, но следующие работы и не страдают от цветовых проблем вашего решения:

    YuvImage yuv = new YuvImage(data, previewFormat, size.width, size.height, null);
    ByteArrayOutputStream out = new ByteArrayOutputStream();
    yuv.compressToJpeg(new Rect(0, 0, size.width, size.height), 50, out);

    byte[] bytes = out.toByteArray();
    Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
    canvas.drawBitmap(bitmap, null, new Rect(0, 0, size.width, size.height), null);

Примечание. Вероятно, это необходимо для распределения данных для каждого кадра, чего нет у вашего решения.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню