Миниатюра в порядке, но изображение на устройстве HTC неверно - PullRequest
0 голосов
/ 09 февраля 2012

У меня есть устройство Galaxy Note, и я написал приложение, которое захватывает изображения с камеры. Я установил макет в альбомную ориентацию и могу получать изображения с помощью своего устройства. Проблема в том, что я запускаю ту же программу на чужом устройстве. Программа работает так же на другом устройстве, но при сохранении картинки содержание картинки неверное. Вы видите слегка диагональные полоски вместо содержимого изображения. Я думаю, что это результат сохранения изображения с неправильным шагом или разрешением. Миниатюра «прослушиваемой» картинки на другом устройстве по какой-то причине вызывает сожаление. Я пытался найти разницу между моим устройством и другим устройством, но кроме одного с разрешением 1280x800 и другого с разрешением 800x480, я не нашел никакой разницы. В обоих случаях функции «Измерение» и «Макет» имеют ориентацию 90 градусов и правильное разрешение ландшафта. В обоих случаях формат изображения - JPEG (по запросу mCamera.getParameters (). GetPictureFormat ()). Я в тупике, я не знаю, что делать, потому что все выглядит одинаково, за исключением того, что одно устройство выдает правильный байтовый массив JPEG, а другое выдает мне правильные данные, но с неправильной ориентацией. Или так кажется.

РЕДАКТИРОВАТЬ: я обнаружил, что есть проблема, даже когда я сохраняю необработанные данные прямо в файл JPEG, поэтому не требуется отображение или декодирование. Я вижу в браузере галереи, что в файле JPEG есть артефакты, что-то не так. Мой код для сохранения данных камеры в (JPEG) файл выглядит следующим образом:

private File onJPGPreviewFrame(byte[] data, String Name) {
    FileOutputStream outStream = null;
    File f = null;
    try {
        if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { 
            File externalRoot = Environment.getExternalStorageDirectory(); 
            File tempDir = new File(externalRoot, Name); 
            tempDir.createNewFile();
            outStream = new FileOutputStream(tempDir);  
            outStream.write(data);
            outStream.close();
            f = tempDir;
        }

        Log.d(TAG, "onPreviewFrame - wrote bytes: " + data.length);
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
    }
    return f;
}

1 Ответ

0 голосов
/ 15 февраля 2012

Разрешение экрана устройства имеет другое соотношение сторон, чем разрешение камеры устройства. Если вы выберете предварительный просмотр, который будет иметь такое же соотношение сторон, что и соотношение сторон камеры, то данные байтового массива jpeg не будут «прослушиваться». Проблема в том, что предварительный просмотр будет искажен, потому что он не соответствует соотношению сторон экрана. Вот некоторый код, который я использовал, чтобы найти оптимальное соотношение сторон:

private Size getOptimalPreviewSize(List<Size> sizes, int width, int height) 
{            
    Size optimalSize = null;                                 

    double targetRatio = (double) width / height;
    int Max = 0;

    for (Size size : sizes) 
    { 
        double ratio = (double) size.width / size.height;
        int m = size.width * size.height;
        if (m>Max && (ratio == targetRatio)) 
        {
            Max = m;
            optimalSize = size; 
        }                
    } 

    if (optimalSize == null) 
    { 
        // TODO : Backup in case we don't get a size. 
    } 

    return optimalSize; 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...