сохранение данных о намерениях Android в файл изображения

#android #image-processing #android-intent #android-camera

Вопрос:

Я получаю данные по намерению(onActivityResult) из метода обрезки изображения и сохраняю их в файле.

Моя проблема заключается в том, что файл(изображение) Я получаю уменьшенную до ~50 КБ, что неприемлемо, так как для использования изображение должно быть ~500 КБ.

есть ли какие-либо параметры, которые я могу изменить с целью обрезки, чтобы получить лучшее качество изображения.

 CropIntent = new Intent("com.android.camera.action.CROP");
 

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

Есть ли какой-либо метод, с помощью которого я могу напрямую сохранить данные о намерениях в файл.

Мой код сохранения изображения таков —

 Bitmap bitmap = null;
            try {
                Bundle bundle = data.getExtras();
                bitmap = bundle.getParcelable("data");
                imageView.setImageBitmap(bitmap);
            } catch (Exception e) {
                Log.d("ListView1", "Image view set exception: "  e.toString());
            }

            try {
                File file = new File(Environment.getExternalStorageDirectory().getAbsolutePath()   "/NVoids/toServer.jpeg");
                file.createNewFile();
                FileOutputStream fos = new FileOutputStream(file);
                final BufferedOutputStream bos = new BufferedOutputStream(fos, 1024 * 8);
                bitmap.compress(Bitmap.CompressFormat.JPEG, 100, bos);
                bos.flush();
                bos.close();
                fos.close();
            } catch (Exception e) {
                Log.d("ListView1", "Save to file exception: "  e.toString());
            }
 

Моя функция обрезки изображений —

 public void ImageCropFunction() {
    // Image Crop Code
    try {
        try {
            Log.d("ListView1", "ImageUri: "   imageUri.toString()); } catch ( Exception e) {  Log.d("ListView1", "ImageUri exception: "   e.toString());  }
        CropIntent = new Intent("com.android.camera.action.CROP");
        CropIntent.setDataAndType(imageUri, "image/*");
        CropIntent.putExtra("crop", "true");
        CropIntent.putExtra("outputX", 50000);
        CropIntent.putExtra("outputY", 50000);
        CropIntent.putExtra("aspectX", 1);
        CropIntent.putExtra("aspectY", 1);
        CropIntent.putExtra("scaleUpIfNeeded", true);
        CropIntent.putExtra("return-data", true);
        startActivityForResult(CropIntent, 1);
    } catch (ActivityNotFoundException e) {
        Log.d("ListView1", "ImageCropFunction Activity Not Found exception: "   e.toString());
    } catch (Exception e) {
        Log.d("ListView1", "ImageCropFunction exception: "   e.toString());
    }
}
 

В случае, если вы хотите увидеть весь файл действий, вот он и файл макета

Ответ №1:

Нет никакого свойства Intent для указания размера результирующего изображения в байтах, только «outputX» и «outputY» для управления шириной и высотой и связанными элементами, такими как «масштаб», «aspectX» и «aspectY», которые вы уже используете.

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

Вызывающий может передать дополнительный вывод EXTRA_OUT для управления тем, где будет записано это изображение. Если параметр EXTRA_OUTPUT отсутствует, то в дополнительном поле в виде растрового объекта возвращается изображение небольшого
размера. Это полезно для приложений, которым требуется только небольшое изображение. Если параметр EXTRA_OUTPUT присутствует, то полноразмерное изображение будет записано в значение Uri параметра EXTRA_OUTPUT.

Это также ключ к ответу на вашу вторую проблему. Вам не нужно будет писать изображение самостоятельно — вы должны указать местоположение файла для записи в поле EXTRA_OUTPUT намерения и позволить коду, который выполняет обрезку, записать файл.

TLDR; укажите место назначения файла в поле EXTRA_OUTPUT намерения, и файл будет написан для вас и, вероятно, будет больше, чем то, что будет возвращено, если вы этого не сделаете.