2013-05-24 2 views
1

Я пытаюсь получить картину от SurfaceView, где я имею вид камеры работает,onPreviewFrame YUV полутоновой перекос

Я уже внедренные onPreviewFrame, и это называется правильно, как отлаживать показывает мне.

Проблема, с которой я столкнулся сейчас, это то, что я получаю данные в байтах [] в методе, в цвете пространства YUV (NV21), я пытаюсь преобразовать его в оттенки серого для создания растрового изображения, а затем для сохранения это в файл.

Процесс преобразования, который я следую за это:

public Bitmap convertYuvGrayScaleRGB(byte[] yuv, int width, int height) { 

    int[] pixels = new int[width * height]; 

    for (int i = 0; i < height*width; i++) { 
     int grey = yuv[i] & 0xff; 
     pixels[i] = 0xFF000000 | (grey * 0x00010101); 
    } 

    return Bitmap.createBitmap(pixels, width, height, Bitmap.Config.ARGB_8888); 

    } 

Процедура импорта для хранения его в файл, это:

Bitmap bitmap = convertYuvGrayScaleRGB(data,widht,heigth); 

    ByteArrayOutputStream bytes = new ByteArrayOutputStream(); 
    bitmap.compress(Bitmap.CompressFormat.PNG, 50, bytes); 

     File f = new File(Environment.getExternalStorageDirectory() 
            + File.separator + "test.jpg"); 

    Log.d("Camera", "File: " + f.getAbsolutePath()); 
    try { 
     f.createNewFile(); 
     FileOutputStream fo = new FileOutputStream(f); 
     fo.write(bytes.toByteArray()); 
     fo.close(); 
     bitmap.recycle(); 
     bitmap = null; 
     } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 

Altough, результат я получил это следующее:

Result

ответ

0

Я не могу найти О.Б. вы ошибаетесь в своем коде, но я уже встречал подобные искажения. Когда это случилось со мной, это было связано с:

  • В какой-то момент в коде, ширина и высота изображения меняются местами,
  • Или исходное изображение вы пытаетесь конвертировать имеет отступы, в котором вам понадобится stride в дополнение к ширине и высоте.

Надеюсь, это поможет!

0

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

Дайте мне взглянуть на документы ...

Это кажется более сложным, чем это. если вы хотите, чтобы ваш код работать, как сейчас, вам придется иметь ширину кратное 16.

из документации:

общественности статической окончательный ИНТ YV12

Добавлено в API уровня 9 для Android YUV.

Этот формат предназначен для программных декодеров и приложений.

YV12 - это планарный формат YCrCb 4: 2: 0, состоящий из плоскости WxH Y , за которой следует (W/2) x (H/2) Cr и Cb.

Этот формат предполагает

даже ширину равномерной высоты горизонтального шаг кратны 16 пикселей вертикальный СТРАЙД равен высота y_size = походку * высота c_stride = ALIGN (шаг/2, 16) c_size = c_stride * высота/2 размер = y_size + c_size * 2 = cr_offset y_size cb_offset = y_size + c_size

0

Я просто имел эту проблему с S3. Моя проблема заключалась в том, что я использовал неправильные размеры для предварительного просмотра. Я предположил, что камера была 16: 9, когда это было фактически 4: 3. .

Используйте Camera.getParameters() getPreviewSize(), чтобы увидеть, что выход в

0

Я сделал это:

int frameSize = width * height; 
for (int i = 0; i < height; i++) { 
    for (int j = 0; j < width; j++) { 
     ret[frameSize + (i >> 1) * width + (j & ~1) + 1] = 127; //U 
     ret[frameSize + (i >> 1) * width + (j & ~1) + 0] = 127; //V 
    } 
} 

Так просто, но это работает очень хорошо и быстро;)

.
Смежные вопросы