#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 намерения, и файл будет написан для вас и, вероятно, будет больше, чем то, что будет возвращено, если вы этого не сделаете.