encodedImage
是表示使用Base64的图像的字符串): > 好,但是在将其显示在我的布局的
ImageView
上之前,我必须调整其大小。我必须将其大小调整为120x120。有人可以告诉我代码来调整大小吗? br />
#1 楼
更改:profileImage.setImageBitmap(
BitmapFactory.decodeByteArray(imageAsBytes, 0, imageAsBytes.length)
收件人:
Bitmap b = BitmapFactory.decodeByteArray(imageAsBytes, 0, imageAsBytes.length)
profileImage.setImageBitmap(Bitmap.createScaledBitmap(b, 120, 120, false));
评论
假设您有一个高分辨率的图像,例如1200x1200,则当您显示此图像时,它在imageview中将已满。如果我按比例缩小比例为75%,并且屏幕能够在imageview中完全显示按比例缩放的图像,那么此类屏幕应该怎么做?
– jxgn
13年1月4日在8:54
createScaledBitmap在我的Galaxy Tab2上抛出“内存不足”异常,这对我来说很奇怪,因为内存很大,并且没有其他特定的应用程序在运行。 Matrix解决方案虽然有效。
–Ludovic
13年3月21日在6:11
如果我们要保存长宽比怎么办?
–错误发生
2015年1月20日14:46
dpi缩放比例呢?我认为缩放的位图应基于设备屏幕的高度和宽度?
–道格·雷(Doug Ray)
16年2月2日在19:35
使用Bitmap.createScaledBitmap()将图像缩小到原始大小的一半以上时,会产生锯齿失真。您可以看一下我写的一篇文章,其中提出了一些替代方案,并比较了质量和性能。
– Petrakeas
17年9月9日13:36
#2 楼
import android.graphics.Matrix
public Bitmap getResizedBitmap(Bitmap bm, int newWidth, int newHeight) {
int width = bm.getWidth();
int height = bm.getHeight();
float scaleWidth = ((float) newWidth) / width;
float scaleHeight = ((float) newHeight) / height;
// CREATE A MATRIX FOR THE MANIPULATION
Matrix matrix = new Matrix();
// RESIZE THE BIT MAP
matrix.postScale(scaleWidth, scaleHeight);
// "RECREATE" THE NEW BITMAP
Bitmap resizedBitmap = Bitmap.createBitmap(
bm, 0, 0, width, height, matrix, false);
bm.recycle();
return resizedBitmap;
}
编辑:如@aveschini所建议,我为内存泄漏添加了
bm.recycle();
。请注意,如果您将前一个对象用于其他目的,请相应地进行处理。评论
我尝试了bitmap.createscaledbitmap和这种矩阵方法。我发现使用矩阵方法可以使图像更加清晰。我不知道这是普遍现象还是仅仅因为我使用模拟器而不是手机。对于那些像我一样遇到同样麻烦的人来说,这只是一个提示。
–姚明
2014年11月18日下午4:47
在这里也必须添加bm.recycle()以获得更好的内存性能
–aveschini
15年1月22日在14:22
感谢您的解决方案,但是最好对参数进行重新排序;公共位图getResizedBitmap(位图bm,int newWidth,int newHeight)。我花了很多时间弄清楚它。 ; P
–攻击性
2015年3月2日,下午5:33
请注意,适用于Matrix的正确导入是android.graphics.Matrix。
–级别
17年1月19日在10:05
这与调用Bitmap.createScaledBitmap()相同。请参阅android.googlesource.com/platform/frameworks/base/+/refs/heads/…
–BamsBamx
17 Mar 7 '17 at 21:50
#3 楼
如果已经有位图,则可以使用以下代码来调整大小:Bitmap originalBitmap = <original initialization>;
Bitmap resizedBitmap = Bitmap.createScaledBitmap(
originalBitmap, newWidth, newHeight, false);
评论
@beginner如果调整图像大小,则可能基于不同的尺寸进行缩放,这些尺寸将位图转换为不正确的比例或删除了某些位图信息。
– ZenBalance
16 Dec 4'在9:23
我尝试根据比例调整位图的大小,但随后出现此错误。造成原因:java.lang.RuntimeException:画布:尝试使用回收的位图android.graphics.Bitmap@2291dd13
–初学者
16 Dec 5'在7:57
@beginner每次您调整位图大小时,根据您的操作,通常需要创建一个新尺寸的副本,而不是调整现有位图的大小(因为在这种情况下,看起来好像对位图的引用已在内存中回收)。
– ZenBalance
16 Dec 5'在10:48
正确..我尝试过,现在可以正常使用了。谢谢
–初学者
16 Dec 6'在5:12
#4 楼
基于宽高比的比例尺:float aspectRatio = yourSelectedImage.getWidth() /
(float) yourSelectedImage.getHeight();
int width = 480;
int height = Math.round(width / aspectRatio);
yourSelectedImage = Bitmap.createScaledBitmap(
yourSelectedImage, width, height, false);
将高度用作宽度更改的基本整数,以更改为:
#5 楼
使用目标最大尺寸和宽度缩放位图,同时保持宽高比:int maxHeight = 2000;
int maxWidth = 2000;
float scale = Math.min(((float)maxHeight / bitmap.getWidth()), ((float)maxWidth / bitmap.getHeight()));
Matrix matrix = new Matrix();
matrix.postScale(scale, scale);
bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
#6 楼
试试这个代码:BitmapDrawable drawable = (BitmapDrawable) imgview.getDrawable();
Bitmap bmp = drawable.getBitmap();
Bitmap b = Bitmap.createScaledBitmap(bmp, 120, 120, false);
我希望它有用。
#7 楼
有人问如何在这种情况下保持宽高比:计算要用于缩放的因子并将其用于两个尺寸。
假设您希望图像为20%屏幕的高度
int scaleToUse = 20; // this will be our percentage
Bitmap bmp = BitmapFactory.decodeResource(
context.getResources(), R.drawable.mypng);
int sizeY = screenResolution.y * scaleToUse / 100;
int sizeX = bmp.getWidth() * sizeY / bmp.getHeight();
Bitmap scaled = Bitmap.createScaledBitmap(bmp, sizeX, sizeY, false);
要获得屏幕分辨率,您可以使用以下解决方案:
以像素为单位获取屏幕尺寸
#8 楼
尝试以下操作:此函数按比例调整位图的大小。当最后一个参数设置为“ X”时,将
newDimensionXorY
视为新的宽度,当设置为“ Y”时将视为新的高度。#9 楼
profileImage.setImageBitmap(
Bitmap.createScaledBitmap(
BitmapFactory.decodeByteArray(imageAsBytes, 0, imageAsBytes.length),
80, 80, false
)
);
#10 楼
public Bitmap scaleBitmap(Bitmap mBitmap) {
int ScaleSize = 250;//max Height or width to Scale
int width = mBitmap.getWidth();
int height = mBitmap.getHeight();
float excessSizeRatio = width > height ? width / ScaleSize : height / ScaleSize;
Bitmap bitmap = Bitmap.createBitmap(
mBitmap, 0, 0,(int) (width/excessSizeRatio),(int) (height/excessSizeRatio));
//mBitmap.recycle(); if you are not using mBitmap Obj
return bitmap;
}
评论
对我来说,它工作了一点重新键入浮点extraSizeRatio = width> height吗? (float)((float)width /(float)ScaleSize):(float)((float)height /(float)ScaleSize);
–Csabi
16 Jun 17'13:08
#11 楼
public static Bitmap resizeBitmapByScale(
Bitmap bitmap, float scale, boolean recycle) {
int width = Math.round(bitmap.getWidth() * scale);
int height = Math.round(bitmap.getHeight() * scale);
if (width == bitmap.getWidth()
&& height == bitmap.getHeight()) return bitmap;
Bitmap target = Bitmap.createBitmap(width, height, getConfig(bitmap));
Canvas canvas = new Canvas(target);
canvas.scale(scale, scale);
Paint paint = new Paint(Paint.FILTER_BITMAP_FLAG | Paint.DITHER_FLAG);
canvas.drawBitmap(bitmap, 0, 0, paint);
if (recycle) bitmap.recycle();
return target;
}
private static Bitmap.Config getConfig(Bitmap bitmap) {
Bitmap.Config config = bitmap.getConfig();
if (config == null) {
config = Bitmap.Config.ARGB_8888;
}
return config;
}
#12 楼
根据任何显示大小调整位图大小public Bitmap bitmapResize(Bitmap imageBitmap) {
Bitmap bitmap = imageBitmap;
float heightbmp = bitmap.getHeight();
float widthbmp = bitmap.getWidth();
// Get Screen width
DisplayMetrics displaymetrics = new DisplayMetrics();
this.getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
float height = displaymetrics.heightPixels / 3;
float width = displaymetrics.widthPixels / 3;
int convertHeight = (int) hight, convertWidth = (int) width;
// higher
if (heightbmp > height) {
convertHeight = (int) height - 20;
bitmap = Bitmap.createScaledBitmap(bitmap, convertWidth,
convertHighet, true);
}
// wider
if (widthbmp > width) {
convertWidth = (int) width - 20;
bitmap = Bitmap.createScaledBitmap(bitmap, convertWidth,
convertHeight, true);
}
return bitmap;
}
#13 楼
从API 19开始,存在位图setWidth(int width)和setHeight(int height)。http://developer.android.com/reference/android/graphics/Bitmap.html
#14 楼
尽管可接受的答案是正确的,但它不会通过保持相同的纵横比来调整Bitmap
的大小。如果您正在寻找一种通过保持相同的纵横比来调整Bitmap
大小的方法,则可以使用以下实用程序功能。该链接提供了用法的详细信息和功能说明。public static Bitmap resizeBitmap(Bitmap source, int maxLength) {
try {
if (source.getHeight() >= source.getWidth()) {
int targetHeight = maxLength;
if (source.getHeight() <= targetHeight) { // if image already smaller than the required height
return source;
}
double aspectRatio = (double) source.getWidth() / (double) source.getHeight();
int targetWidth = (int) (targetHeight * aspectRatio);
Bitmap result = Bitmap.createScaledBitmap(source, targetWidth, targetHeight, false);
if (result != source) {
}
return result;
} else {
int targetWidth = maxLength;
if (source.getWidth() <= targetWidth) { // if image already smaller than the required height
return source;
}
double aspectRatio = ((double) source.getHeight()) / ((double) source.getWidth());
int targetHeight = (int) (targetWidth * aspectRatio);
Bitmap result = Bitmap.createScaledBitmap(source, targetWidth, targetHeight, false);
if (result != source) {
}
return result;
}
}
catch (Exception e)
{
return source;
}
}
#15 楼
保持宽高比, public Bitmap resizeBitmap(Bitmap source, int width,int height) {
if(source.getHeight() == height && source.getWidth() == width) return source;
int maxLength=Math.min(width,height);
try {
source=source.copy(source.getConfig(),true);
if (source.getHeight() <= source.getWidth()) {
if (source.getHeight() <= maxLength) { // if image already smaller than the required height
return source;
}
double aspectRatio = (double) source.getWidth() / (double) source.getHeight();
int targetWidth = (int) (maxLength * aspectRatio);
return Bitmap.createScaledBitmap(source, targetWidth, maxLength, false);
} else {
if (source.getWidth() <= maxLength) { // if image already smaller than the required height
return source;
}
double aspectRatio = ((double) source.getHeight()) / ((double) source.getWidth());
int targetHeight = (int) (maxLength * aspectRatio);
return Bitmap.createScaledBitmap(source, maxLength, targetHeight, false);
}
}
catch (Exception e)
{
return source;
}
}
#16 楼
/**
* Kotlin method for Bitmap scaling
* @param bitmap the bitmap to be scaled
* @param pixel the target pixel size
* @param width the width
* @param height the height
* @param max the max(height, width)
* @return the scaled bitmap
*/
fun scaleBitmap(bitmap:Bitmap, pixel:Float, width:Int, height:Int, max:Int):Bitmap {
val scale = px / max
val h = Math.round(scale * height)
val w = Math.round(scale * width)
return Bitmap.createScaledBitmap(bitmap, w, h, true)
}
评论
Android中调整位图的可能重复项@SagarPilkhwal首先被问到这个