Android如何创build运行时缩略图

我有一个大尺寸的图像。 在运行时,我想从存储中读取图像,并将其缩放,以便减轻其重量和尺寸,并将其用作缩略图。 当用户点击缩略图时,我想显示全尺寸的图像。

我的解决scheme

byte[] imageData = null; try { final int THUMBNAIL_SIZE = 64; FileInputStream fis = new FileInputStream(fileName); Bitmap imageBitmap = BitmapFactory.decodeStream(fis); imageBitmap = Bitmap.createScaledBitmap(imageBitmap, THUMBNAIL_SIZE, THUMBNAIL_SIZE, false); ByteArrayOutputStream baos = new ByteArrayOutputStream(); imageBitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos); imageData = baos.toByteArray(); } catch(Exception ex) { } 

尝试这个

 Bitmap ThumbImage = ThumbnailUtils.extractThumbnail(BitmapFactory.decodeFile(imagePath), THUMBSIZE, THUMBSIZE); 

此实用程序可从API_LEVEl 8获得。 [Source]

我find的最佳解决scheme如下。 与其他解决scheme相比,这个不需要加载完整的图像来创build缩略图,所以效率更高! 它的限制是,你不能有一个确切的宽度和高度的缩略图,但解决scheme尽可能接近。

 File file = ...; // the image file Options bitmapOptions = new Options(); bitmapOptions.inJustDecodeBounds = true; // obtain the size of the image, without loading it in memory BitmapFactory.decodeFile(file.getAbsolutePath(), bitmapOptions); // find the best scaling factor for the desired dimensions int desiredWidth = 400; int desiredHeight = 300; float widthScale = (float)bitmapOptions.outWidth/desiredWidth; float heightScale = (float)bitmapOptions.outHeight/desiredHeight; float scale = Math.min(widthScale, heightScale); int sampleSize = 1; while (sampleSize < scale) { sampleSize *= 2; } bitmapOptions.inSampleSize = sampleSize; // this value must be a power of 2, // this is why you can not have an image scaled as you would like bitmapOptions.inJustDecodeBounds = false; // now we want to load the image // Let's load just the part of the image necessary for creating the thumbnail, not the whole image Bitmap thumbnail = BitmapFactory.decodeFile(file.getAbsolutePath(), bitmapOptions); // Save the thumbnail File thumbnailFile = ...; FileOutputStream fos = new FileOutputStream(thumbnailFile); thumbnail.compress(Bitmap.CompressFormat.JPEG, 90, fos); fos.flush(); fos.close(); // Use the thumbail on an ImageView or recycle it! thumbnail.recycle(); 

这是一个比较完整的解决scheme,将缩略图缩小为缩略图。 它扩展了Bitmap.createScaledBitmap解决scheme,通过保持图像的高宽比,并将它们填充到相同的宽度,使它们在ListView中看起来不错。

另外,最好做一次这样的缩放,并将得到的Bitmap作为一个blob存储在你的Sqlite数据库中。 我已经包含了一个片段如何将位图转换为一个字节数组为此目的。

 public static final int THUMBNAIL_HEIGHT = 48; public static final int THUMBNAIL_WIDTH = 66; imageBitmap = BitmapFactory.decodeByteArray(mImageData, 0, mImageData.length); Float width = new Float(imageBitmap.getWidth()); Float height = new Float(imageBitmap.getHeight()); Float ratio = width/height; imageBitmap = Bitmap.createScaledBitmap(imageBitmap, (int)(THUMBNAIL_HEIGHT*ratio), THUMBNAIL_HEIGHT, false); int padding = (THUMBNAIL_WIDTH - imageBitmap.getWidth())/2; imageView.setPadding(padding, 0, padding, 0); imageView.setImageBitmap(imageBitmap); ByteArrayOutputStream baos = new ByteArrayOutputStream(); imageBitmap.compress(Bitmap.CompressFormat.PNG, 100, baos); byte[] byteArray = baos.toByteArray(); 

使用BitmapFactory.decodeFile(...)获取您的Bitmap对象,并使用ImageView.setImageBitmap()将其设置为ImageView

ImageView将布局的尺寸设置ImageView小,例如:

 android:layout_width="66dip" android:layout_height="48dip" 

将一个onClickListener添加到ImageView并启动一个新的活动,在其中用全尺寸显示图像

 android:layout_width="wrap_content" android:layout_height="wrap_content" 

或者指定一些较大的尺寸。

 /** * Creates a centered bitmap of the desired size. * * @param source original bitmap source * @param width targeted width * @param height targeted height * @param options options used during thumbnail extraction */ public static Bitmap extractThumbnail( Bitmap source, int width, int height, int options) { if (source == null) { return null; } float scale; if (source.getWidth() < source.getHeight()) { scale = width / (float) source.getWidth(); } else { scale = height / (float) source.getHeight(); } Matrix matrix = new Matrix(); matrix.setScale(scale, scale); Bitmap thumbnail = transform(matrix, source, width, height, OPTIONS_SCALE_UP | options); return thumbnail; } 

如果你想要高质量的结果,那么使用[RapidDecoder] [1]库。 简单如下:

 import rapid.decoder.BitmapDecoder; ... Bitmap bitmap = BitmapDecoder.from(getResources(), R.drawable.image) .scale(width, height) .useBuiltInDecoder(true) .decode(); 

如果你想缩小小于50%和HQ结果,不要忘记使用内置解码器。

我发现了一个简单的方法来做到这一点

 Bitmap thumbnail = ThumbnailUtils.extractThumbnail(BitmapFactory.decodeFile(mPath),200,200) 

句法

 Bitmap thumbnail = ThumbnailUtils.extractThumbnail(Bitmap source,int width,int height) 

要么

使用毕加索的依赖

编译'com.squareup.picasso:picasso:2.5.2'

 Picasso.with(context) .load("file:///android_asset/DvpvklR.png") .resize(50, 50) .into(imageView2); 

参考毕加索