Android: лучший эффективный способ сделать фотографии и проработать их? - PullRequest
0 голосов
/ 13 апреля 2020

в моем приложении я должен разрешить пользователю делать фотографии в документе. Я использую простое: 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 и использовать другую библиотеку вместо этого?

...