в моем приложении я должен разрешить пользователю делать фотографии в документе. Я использую простое: MediaStore.ACTION_IMAGE_CAPTURE. Результат необходимо правильно повернуть и сохранить в нужной папке. Я достиг цели, используя glide:
private fun resizeImageFileWithGlide(file: File, outputFile: File) {
val futureTarget:FutureTarget<Bitmap> = Glide.with(application)
.asBitmap()
.load(file)
//.apply(RequestOptions().override(2560).downsample(DownsampleStrategy.CENTER_INSIDE))
.submit()
val bitmap: Bitmap = futureTarget.get()
writeBitmapToFile(bitmap, outputFile)
Glide.with(application).clear(futureTarget);
}
Теперь в базе бизнес-логи c случаев я должен: - сохранить фотографию в разных разрешениях - сохранить фотографию в ARGB_8888 или RGB_565 - сохранить фотографию в PNG или формат JPEG - сохранить фотографию в оттенках серого
. Для этого я использую Glide, и в результате получаю:
private fun glideImageConversion(inFile: File,
outFile: File,
outFormat: String,
outCompression: Double,
outWidth: Int,
outHeight: Int,
outColorMode: String){
val requestOption = RequestOptions()
if(outWidth != 0 || outHeight != 0) {
var outWidthTmp = outWidth
var outHeightTmp = outHeight
val originalDim = ImageHelper.getBitmapDimensions(inFile)
val aspectRatio =
originalDim[0].toFloat() / originalDim[1].toFloat() /* width/height */
if (outWidthTmp == 0) {
outWidthTmp = (outHeight * aspectRatio).roundToInt()
} else if (outHeightTmp == 0) {
outHeightTmp = (outWidth / aspectRatio).roundToInt()
}
requestOption.override(outWidthTmp,outHeightTmp).downsample(DownsampleStrategy.CENTER_INSIDE)
}else{
requestOption.downsample(DownsampleStrategy.NONE)
}
requestOption.skipMemoryCache(true).diskCacheStrategy(DiskCacheStrategy.NONE)
val withAlpha = outColorMode == "argb" || outColorMode == "agray"
if(withAlpha){
requestOption.format(DecodeFormat.PREFER_ARGB_8888)
}else{
requestOption.format(DecodeFormat.PREFER_RGB_565)
}
if (outColorMode.contains("gray")) {
requestOption.transform(GrayscaleTransformation())
}
val futureTarget:FutureTarget<Bitmap> = Glide.with(application)
.asBitmap()
.load(inFile)
.apply(requestOption)
.submit()
val bitmap: Bitmap = futureTarget.get()
writeBitmapToFile(bitmap, outFile, ImageHelper.getCompressFormat(outFormat), ImageHelper.calculateCompressionFactor(outCompression))
Glide.with(application).clear(futureTarget);
}
Я хочу улучшить свое решение, чтобы использовать как можно меньше памяти. Прежде всего, я хотел бы сделать фотографию с меньшим разрешением (13 мегапикселей - это слишком много для простой фотографии документа)
Более того, я хочу использовать Glide лучше. Метод glideImageConversion можно вызывать много раз, и было бы неплохо повторно использовать растровую память. Glide обрабатывает все это автоматически o Я должен что-то установить?
ps: Вы предлагаете не использовать glide и использовать другую библиотеку вместо этого?