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);
参考毕加索