2014-01-03 5 views
0

Я сделал свое собственное приложение для камеры на Android.андроид байт [] изменение данных

1) Настройка камеры и предварительного просмотра:

Camera.Parameters parameters = camera.getParameters(); 
// My camera takes landscape picture by befault (Samsung GT-9300). 
// But my app is only in portrait mode. 
camera.setDisplayOrientation(90); 
// Here to rotate final pict 
parameters.set("rotation", 90); 

// Some code to define best preview resolution and best picture resolution 
... some code ... 

// Apply 
camera.setParameters(parameters); 

2) StartPreview

// Here I see what i want to see... Is there no problem here. 
camera.startPreview(); 

3) GetOutputMediaFile()

// private function to create empty file which will receive data 
private static File getOutputMediaFile(){ 
    String NewFolder = "/TEST"; 
    String StorageDirectory; 
    StorageDirectory = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).toString(); 
    File mediaStorageDir = new File(StorageDirectory + NewFolder); 
    if (!mediaStorageDir.exists()){ 
     if (!mediaStorageDir.mkdirs()){ 
      Log.d("myApp", "failed to create directory"); 
      return null; 
     } else { 
      mediaStorageDir.mkdir(); 
     } 
    } 

    String date = new SimpleDateFormat("yyyy-MM-dd_HH:mm:ss", Locale.FRANCE).format(new Date()); 

    File photo = new File(StorageDirectory + NewFolder, "photo_" + date + ".jpg"); 

    return photo;  
} 

4) Здесь моя проблема

// camera.takePicture(null, null, mPicture) called on onCreate function 

// Here this callback 
private PictureCallback mPicture = new PictureCallback() { 
    @Override 
    public void onPictureTaken(byte[] data, Camera camera) { 
    pictureFile = getOutputMediaFile(); 
    if (pictureFile == null){ 
     Log.d(TAG, "Error creating media file, check storage permissions: " + e.getMessage()); 
     return; 
    } 

    try { 
     FileOutputStream fos = new FileOutputStream(pictureFile); 
     fos.write(data); 
     fos.close(); 
    } catch (FileNotFoundException e) { 
     Log.d(TAG, "File not found: " + e.getMessage()); 
    } catch (IOException e) { 
     Log.d(TAG, "Error accessing file: " + e.getMessage()); 
    }  
}; 

На моем телефоне, если я иду в свою галерею или оригинальное приложение для файлов, у меня есть эскиз и фотография правильно ориентированы.

Теперь, если я поеду с корневым файловым менеджером в этой папке с картинками, миниатюра ориентирована по умолчанию (реальная ориентация камеры) и так же, как если бы я смотрел картинку с моего компьютера.

Тогда я думаю, что мои данные var (byte [] data) на моей функции onPictureTaken не очень хорошие. Я думаю, что данные таково:

How I think my var data is

Но я хотел бы иметь, что в моем варе данных:

How I would like to have

Я знаю, что мои данные вары только байты [], но эти cat pictures - это показать, как я вижу свои данные var.

Теперь мои вопросы:

А) У меня прямо о том, как мои переменных данных?

B) Если да, можете ли вы сказать мне, как сделать поворот на 90 ° на этом «массиве»?

ответ

0

Вы не должны изменять биты изображения для учета вращения.

Вращение хранится в значении ориентации метаданных JPG EXIF, поэтому вам нужно просто установить значение метаданных в соответствии с ориентацией камеры. Узнайте больше об этом значении EXIF ​​и других here.

Для управления данными EXIF ​​вы можете использовать класс рамки ExifInterface.

+0

Я искал атрибут Exif как getAttribute («TAG_ORIENTATION»), он возвращает значение null, что означает, что в файле JPEG нет такого тега. Затем я попытался установить атрибут атрибута («TAG_ORIENTATION», «6»), 6 = ORIENTATION_ROTATE_90, затем сохранить атрибуты () в конце onPictureTaken(). Но у меня такой же результат. Любая идея почему? – locobastos

0

Если изображение правильно отображается в приложении для галереи телефона, оно, вероятно, правильно ориентировано. Вы можете поэкспериментировать с разными значениями для Parameters.setRotation и посмотреть, влияют ли они на то, что вы видите в приложении галереи.

Некоторые программы просмотра изображений неправильно применяют поле ориентации EXIF, что может привести к неправильному вращению изображения. Если это так, изменение поля ориентации ничего не делает, поскольку эти программы не будут работать с любым значением ориентации. Вам нужно будет повернуть изображение в формате JPEG вместо того, чтобы просто устанавливать поле метаданных, чтобы они выглядели корректно.

Если вы хотите сделать это в Android, вам придется декодировать байт [], который вы получаете с камеры, в растровое изображение (с BitmapFactory.decodeByteArray, поворот растрового изображения и сохранение результата в виде JPEG. ll потерять все другие метаданные EXIF ​​(дата/время и т. д.), если вы не используете ExifInterface для их записи. Также возможно без потерь вращать JPEG, но я не знаю, есть ли для этого библиотеки Android.

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