我正在使用Glide加载图像,调整大小并通过SimpleTarget< Bitmap>将其保存到文件中.这些图像将上传到Amazon S3,但除此之外.我正在上传之前调整图像大小以节省尽可能多的用户带宽.对于我的应用程序需要1024像素宽的图像绰绰有余,所以我使用以下代码来实现这一点:
final String to = getMyImageUrl();
final Context appCtx = context.getApplicationContext();

Glide.with(appCtx)
        .load(sourceImageUri)
        .asBitmap()
        .into(new SimpleTarget<Bitmap>(1024,768) {
            @Override
            public void onResourceReady(Bitmap resource,GlideAnimation<? super Bitmap> glideAnimation) {
                try {
                    FileOutputStream out = new FileOutputStream(to);
                    resource.compress(Bitmap.CompressFormat.JPEG,70,out);
                    out.flush();
                    out.close();
                    MediaScannerConnection.scanFile(appCtx,new String[]{to},null,null);
                } catch (IOException e) {
                    e.printstacktrace();
                }
            }
        });

它几乎完美地工作,但生成的图像的大小不是1024像素宽.使用尺寸为4160 x 2340像素的源图像对其进行测试,得到的保存图像的尺寸为2080 x 1170像素.

我尝试使用传递给新SimpleTarget< Bitmap>(350,350)的宽度和高度参数,并使用这些参数得到的图像尺寸为1040 x 585像素.

我真的不知道如何使Glide尊重传递的尺寸.事实上,我想按比例调整图像大小,以便将较大的尺寸(宽度或高度)限制为1024像素,较小的尺寸相应调整大小(我相信我必须找到获得原始图像的方法)尺寸,然后将宽度和高度传递给SimpleTarget,但要做到这一点,我需要Glide尊重传递的宽度和高度!).

有没有人知道发生了什么?我正在使用Glide 3.7.0.

由于这个问题本身可能对尝试使用Glide调整大小和保存图像的人有用,我相信提供我的实际“解决方案”符合每个人的利益,该解决方案依赖于自动保存调整大小的图像的新SimpleTargetimplementation:

import android.graphics.Bitmap;

import com.bumptech.glide.request.animation.GlideAnimation;
import com.bumptech.glide.request.target.SimpleTarget;

import java.io.FileOutputStream;
import java.io.IOException;

public class FileTarget extends SimpleTarget<Bitmap> {
    public FileTarget(String fileName,int width,int height) {
        this(fileName,width,height,Bitmap.CompressFormat.JPEG,70);
    }
    public FileTarget(String fileName,int height,Bitmap.CompressFormat format,int quality) {
        super(width,height);
        this.fileName = fileName;
        this.format = format;
        this.quality = quality;
    }
    String fileName;
    Bitmap.CompressFormat format;
    int quality;
    public void onResourceReady(Bitmap bitmap,GlideAnimation anim) {
            try {
                FileOutputStream out = new FileOutputStream(fileName);
                bitmap.compress(format,quality,out);
                out.flush();
                out.close();
                onFileSaved();
            } catch (IOException e) {
                e.printstacktrace();
                onSaveException(e);
            }
    }
    public void onFileSaved() {
        // do nothing,should be overriden (optional)
    }
    public void onSaveException(Exception e) {
        // do nothing,should be overriden (optional)
    }

}

使用它很简单:

Glide.with(appCtx)
        .load(sourceImageUri)
        .asBitmap()
        .into(new FileTarget(to,1024,768) {
            @Override
            public void onFileSaved() {
                // do anything,or omit this override if you want
            }
        });

解决方法

经过一夜好眠,我才明白了!我在Glide的github页面上偶然发现了一个有问题的问题,但我没有意识到:我在解释中遗漏了一些内容,我现在已经完全理解了10个小时后的内容.你永远不应该低估睡眠的力量!但我离题了.以下是 Glide’s Github issue tracker的答案:

Sizing the image usually has two phases:

  • Decoding/Downsampler read image from stream with inSampleSize
  • Transforming/BitmapTransformation take the Bitmap and match the exact
    target size

The decoding is always needed and is included in the flow,
the default case is to match the target size with the “at least”
downsampler,so when it comes to the transformation the image can be
downsized more without quality loss (each pixel in the source will
match at least 1.0 pixels and at most ~1.999 pixels) this can be
controlled by asBitmap().at least|atMost|asIs|decoder(with
downsampler)

The transformation and target size is automatic by default,but only
when using a ViewTarget. When you load into an ImageView the size of
that will be detected even when it has match_parent. Also if there’s
no explicit transformation there’ll be one applied from scaleType.
Thus results in a pixel perfect Bitmap for that image,meaning 1 pixel
in Bitmap = 1 pixel on screen resulting in the best possible quality
with the best memory usage and fast rendering (because there’s no
pixel mapping needed when drawing the image).

With a SimpleTarget you take on these responsibilities by providing a
size on the constructor or via override() or implementing getSize if
the sizing info is async-ly available only.

To fix your load add a transformation: .fitCenter|centerCrop(),your
current applied transformation is .dontTransform()
(Answer by 07001)

我对此答案感到困惑,因为:

With a SimpleTarget you take on these responsibilities by providing a
size on the constructor or via override() or implementing getSize if
the sizing info is async-ly available only.

由于我通过了尺寸,我认为我已经覆盖了这个尺寸,这样的尺寸应该得到尊重.我错过了这个重要的概念:

  • Decoding/Downsampler read image from stream with inSampleSize
  • Transforming/BitmapTransformation take the Bitmap and match the exact
    target size

还有这个:

To fix your load add a transformation: .fitCenter|centerCrop(),your
current applied transformation is .dontTransform()

现在,我将它拼凑在一起是有道理的. Glide只是对图像进行下采样(如Róbert所解释的尺寸图像流程中的第一步),它给出了具有近似尺寸的图像.让我说Glide在这方面非常聪明.通过在调整大小之前使用下采样方法,可以避免在内存中处理不必要的大位图并提高调整大小的质量,因为缩减到精确的大小会损害太多“重要”像素!

由于我没有对此加载管道应用任何转换,因此在第一步(下采样)中停止了大小调整流程,并且生成的图像仅具有与我的预期目标大小相近的大小.

为了解决这个问题,我刚刚应用了一个.fitCenter()变换,如下所示:

Glide.with(appCtx)
        .load(sourceImageUri)
        .asBitmap()
        .fitCenter()
        .into(new FileTarget(to,or omit this override if you want
            }
        });

生成的图像现在具有1024 x 576像素的尺寸,这正是我所期望的.

Glide是一个非常酷的图书馆!

java – 滑入加载到SimpleTarget中不遵守指定的宽度和高度的更多相关文章

  1. canvas像素点操作之视频绿幕抠图

    这篇文章主要介绍了canvas像素点操作之视频绿幕抠图的相关资料,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  2. html5利用canvas实现颜色容差抠图功能

    这篇文章主要介绍了html5利用canvas实现颜色容差抠图功能,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下

  3. 吃透移动端 1px的具体用法

    这篇文章主要介绍了吃透移动端 1px的具体用法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  4. canvas中普通动效与粒子动效的实现代码示例

    canvas用于在网页上绘制图像、动画,可以将其理解为画布,在这个画布上构建想要的效果。本文详细的介绍了粒子特效,和普通动效进行对比,非常具有实用价值,需要的朋友可以参考下

  5. Canvas 像素处理之改变透明度的实现代码

    这篇文章主要介绍了Canvas 像素处理之改变透明度的实现代码的相关资料,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  6. 深入了解canvas在移动端绘制模糊的问题解决

    这篇文章主要介绍了深入了解canvas在移动端绘制模糊的问题解决,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  7. 移动端Html5页面生成图片解决方案

    现在有很多微信公众号运营活动,都有生成图片的需求,这篇文章主要介绍了移动端Html5页面生成图片解决方案的相关资料,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  8. 高清屏中使用Canvas绘图出现模糊的问题及解决方法

    这篇文章主要介绍了高清屏中使用Canvas绘图出现模糊的问题及解决方法,需要的朋友可以参考下

  9. ios – 替换UIView的contentStretch,用于非基于图像的内容

    .但如果内容不是基于图像的,那么该怎么办的问题却没有提及.有什么建议?在一个特定情况下,它是用于动画.解决方法不是真正的替代品,但对于那些需要它用于动画,从一种尺寸到另一种尺寸的动画,解决方案可以是获取screenshot,获取图像,使用UIImageViewstretch功能并为该图像设置动画.

  10. ios – 当我缩放时,如何关闭所有图像处理以查看实际的未修改像素?

    我有一个应用程序需要放大到足够远的图像,我可以清楚地看到图像上的单个像素.我需要看到一种颜色的清晰正方形,没有抗锯齿或其他通常有用的技术,使图像在显示器上看起来很好.我如何扼杀所有这些帮助?

随机推荐

  1. 基于EJB技术的商务预订系统的开发

    用EJB结构开发的应用程序是可伸缩的、事务型的、多用户安全的。总的来说,EJB是一个组件事务监控的标准服务器端的组件模型。基于EJB技术的系统结构模型EJB结构是一个服务端组件结构,是一个层次性结构,其结构模型如图1所示。图2:商务预订系统的构架EntityBean是为了现实世界的对象建造的模型,这些对象通常是数据库的一些持久记录。

  2. Java利用POI实现导入导出Excel表格

    这篇文章主要为大家详细介绍了Java利用POI实现导入导出Excel表格,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  3. Mybatis分页插件PageHelper手写实现示例

    这篇文章主要为大家介绍了Mybatis分页插件PageHelper手写实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  4. (jsp/html)网页上嵌入播放器(常用播放器代码整理)

    网页上嵌入播放器,只要在HTML上添加以上代码就OK了,下面整理了一些常用的播放器代码,总有一款适合你,感兴趣的朋友可以参考下哈,希望对你有所帮助

  5. Java 阻塞队列BlockingQueue详解

    本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景,通过实例代码介绍了Java 阻塞队列BlockingQueue的相关知识,需要的朋友可以参考下

  6. Java异常Exception详细讲解

    异常就是不正常,比如当我们身体出现了异常我们会根据身体情况选择喝开水、吃药、看病、等 异常处理方法。 java异常处理机制是我们java语言使用异常处理机制为程序提供了错误处理的能力,程序出现的错误,程序可以安全的退出,以保证程序正常的运行等

  7. Java Bean 作用域及它的几种类型介绍

    这篇文章主要介绍了Java Bean作用域及它的几种类型介绍,Spring框架作为一个管理Bean的IoC容器,那么Bean自然是Spring中的重要资源了,那Bean的作用域又是什么,接下来我们一起进入文章详细学习吧

  8. 面试突击之跨域问题的解决方案详解

    跨域问题本质是浏览器的一种保护机制,它的初衷是为了保证用户的安全,防止恶意网站窃取数据。那怎么解决这个问题呢?接下来我们一起来看

  9. Mybatis-Plus接口BaseMapper与Services使用详解

    这篇文章主要为大家介绍了Mybatis-Plus接口BaseMapper与Services使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  10. mybatis-plus雪花算法增强idworker的实现

    今天聊聊在mybatis-plus中引入分布式ID生成框架idworker,进一步增强实现生成分布式唯一ID,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

返回
顶部