我正在使用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像素。我已经尝试了使用传递给new SimpleTarget(350, 350)的width和height参数进行调整,但是结果图像的尺寸为1040 x 585像素。
我真的不知道该怎么做才能使Glide遵守传递的尺寸。实际上,我希望按比例调整图像大小,以便较大的尺寸(宽度或高度)将限制为1024像素,并相应地调整较小的尺寸(我相信我必须找到一种方法来获取原始图像尺寸,然后将宽度和高度传递给SimpleTarget,但要做到这一点,我需要Glide遵守传递的宽度和高度!)。
有人知道发生了什么吗?我正在使用Glide 3.7.0。
由于这个问题本身可能对试图使用Glide调整大小和保存图像的人有用,因此我认为提供我的实际“解决方案”对每个人都有利,它依赖于一个新的SimpleTarget实现,它会自动保存调整大小的图像:
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 width, 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
}
});
.fitCenter()
吗? - Wess