`

Android bitmap优化

 
阅读更多

直接使用ImageView显示bitmap会占用较多资源,特别是图片较大的时候,可能导致崩溃。

使用BitmapFactory.Options设置inSampleSize, 这样做可以减少对系统资源的要求。

 

属性值inSampleSize表示缩略图大小为原始图片大小的几分之一,即如果这个值为2,则取出的缩略图的宽和高都是原始图片的1/2,图片大小就为原始大小的1/4。

 

Options中有个属性inJustDecodeBounds,SDK中是这么说的

If set to true, the decoder will return null (no bitmap), but the out... fields will still be set, allowing the caller to query the bitmap without having to allocate the memory for its pixels.

 

通过设置inJustDecodeBounds为true,获取到outHeight(图片原始高度)和outWidth(图片的原始宽度),然后计算一个inSampleSize(缩放值)

 

 

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello"
/>
<ImageView
android:id="@+id/imageview"
android:layout_gravity="center"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:scaleType="center"
/>
</LinearLayout>

 

 

 

 

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.widget.ImageView;
import android.widget.Toast;
 
public class AndroidImage extends Activity {
 
private String imageFile = "/sdcard/AndroidSharedPreferencesEditor.png";
/** Called when the activity is first created. */
 
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
   
ImageView myImageView = (ImageView)findViewById(R.id.imageview);
//Bitmap bitmap = BitmapFactory.decodeFile(imageFile);
//myImageView.setImageBitmap(bitmap);
 
Bitmap bitmap;
float imagew = 300;
float imageh = 300;
 
BitmapFactory.Options bitmapFactoryOptions = new BitmapFactory.Options();
bitmapFactoryOptions.inJustDecodeBounds = true;
bitmap = BitmapFactory.decodeFile(imageFile, bitmapFactoryOptions);
 
int yRatio = (int)Math.ceil(bitmapFactoryOptions.outHeight/imageh);
int xRatio = (int)Math.ceil(bitmapFactoryOptions.outWidth/imagew);
 
if (yRatio > 1 || xRatio > 1){
 if (yRatio > xRatio) {
  bitmapFactoryOptions.inSampleSize = yRatio;
  Toast.makeText(this,
    "yRatio = " + String.valueOf(yRatio),
    Toast.LENGTH_LONG).show();
 }
 else {
  bitmapFactoryOptions.inSampleSize = xRatio;
  Toast.makeText(this,
    "xRatio = " + String.valueOf(xRatio),
    Toast.LENGTH_LONG).show();
 }
}
else{
 Toast.makeText(this,
   "inSampleSize = 1",
   Toast.LENGTH_LONG).show();
}
 
bitmapFactoryOptions.inJustDecodeBounds = false;
bitmap = BitmapFactory.decodeFile(imageFile, bitmapFactoryOptions);
myImageView.setImageBitmap(bitmap);
}
 
}
分享到:
评论
1 楼 sunny78117 2012-07-27  
谢谢,写得好

相关推荐

    android中对Bitmap图片设置任意角为圆角

    在Android开发中,Bitmap是用于表示图像数据的基本对象,它是一种内存中的图片表示形式。而当我们需要在应用程序中展示带有圆角的图片时,通常会用到Bitmap的处理技巧。本篇文章将深入探讨如何在Android中对Bitmap...

    Android下利用Bitmap切割图片

    在Android开发中,Bitmap是处理图像的基本类,用于在内存中表示位图图像。当我们需要对图片进行裁剪、缩放或进行其他操作时,Bitmap提供了丰富的功能。本篇文章将详细探讨如何在Android环境下利用Bitmap来切割图片。...

    android Bitmap特效处理

    在实现这些特效时,需要注意性能优化,因为Bitmap操作可能会消耗大量资源。可以使用BitmapFactory.Options来控制解码时的内存占用,或者使用Hardware Acceleration等技术来加速图像处理。此外,还可以考虑使用异步...

    Android Bitmap 处理示例

    在Android开发中,Bitmap是用于表示图像数据的核心类,它在UI显示和图像处理中扮演着重要角色。然而,由于Bitmap对象通常占用大量的内存,不当的处理可能导致内存溢出(Out Of Memory)问题,因此对Bitmap进行高效...

    Android上解析24位深度Bitmap文件示例

    综上所述,处理Android上的24位深度Bitmap文件涉及多个层次的优化,包括内存管理、解码策略、异步加载、缓存策略以及颜色处理等。在实际开发中,要根据应用的需求和设备性能选择合适的方法,确保应用运行流畅且资源...

    Android bitmap图片压缩工具类

    在Android开发中,Bitmap对象是处理图像的主要方式,但它们可能会消耗大量内存,尤其是在处理大图或高分辨率图片时。为了优化性能并防止因内存不足引发的“OutOfMemoryError”,开发者通常需要对Bitmap进行压缩。...

    Android Bitmap的加载优化与Cache相关介绍

    高效加载 Bitmap BitMapFactory 提供了四类方法: decodeFile,decodeResource,decodeStream 和 decodeByteArray 分别用于从文件系统,资源,输入流以及字节数组中加载出一个 Bitmap 对象。 高效加载 Bitmap 很简单,即...

    Android图片Bitmap和字符串String之间的相互转换

    在Android开发中,处理图像数据是一项常见的任务,而Bitmap和String是两个核心的数据类型,分别代表位图图像和文本字符串。Bitmap对象用于存储和显示图像,而String则常用于保存和传输文本信息。本篇文章将深入探讨...

    android bitmap outOfMemory解决方法

    在Android开发中,Bitmap对象是用于处理图像的主要类,但如果不正确管理,它可能导致应用程序运行时出现`OutOfMemoryError`。这是因为Bitmap占用大量的内存,尤其是当加载大尺寸或高分辨率图片时。这个问题在低内存...

    Android bitmap

    总的来说,Android Bitmap的处理涵盖了从加载到保存、显示和优化等多个方面,理解其工作原理和最佳实践对于优化应用性能至关重要。在处理大量图像或高分辨率图像时,特别需要注意内存管理和性能优化。

    android Bitmap用法总结

    Bitmap是Android平台中用于处理图像的核心类,它用于表示位图图像数据。下面是对Bitmap用法的详细总结: 1. **Drawable转换为Bitmap**: 当我们需要将一个Drawable对象(如从XML布局文件中加载的图像)转换为...

    Android中把bitmap存成BMP格式图片的方法

    在Android开发中,有时我们需要将Bitmap对象转换成不同的图片格式,比如BMP。BMP(Bitmap File Format)是一种常见的位图文件格式,但它并不像JPEG或PNG那样被Android SDK直接支持。本文将详细介绍如何在Android中将...

    Bitmap的相关优化及使用

    Bitmap优化是Android开发中的重要环节,合理使用上述策略和技巧,可以显著降低内存消耗,提升应用性能。实践中,开发者应结合项目需求,灵活运用各种方法,实现最佳的Bitmap管理。同时,持续关注Android新版本的优化...

    android bitmap通过byte数组以流的形式创建

    在Android开发中,Bitmap是用于显示图像的基本类,它是一个位图对象,通常用来加载、显示和处理图片。然而,由于Bitmap对象占用大量的内存,直接加载大图片可能会导致内存溢出(Out Of Memory,OOM)问题。因此,...

    处理android bitmap oom

    在Android开发中,Bitmap对象是用于处理图像的主要类,但如果不妥善管理,它可能会引发“Out Of Memory”(OOM)错误。这是因为Android设备的内存有限,尤其是对于大型图像,加载到内存中会消耗大量资源。当应用无法...

    ANDROIDBITMAP内存限制OOM,OUTOFMEMORY.pdf

    文档标题和描述中提到的“ANDROIDBITMAP内存限制OOM,OUTOFMEMORY”指的就是在处理位图(BITMAP)时超出了虚拟机(VM)的内存预算,导致系统抛出OutOfMemoryError异常。 根据给出的内容部分,我们可以推断出以下知识...

    bitmap上传图片demo

    总结,"bitmap上传图片demo"是一个综合性的实例,涵盖了Bitmap的加载、显示、裁剪和上传等多个环节,对于学习Android图像处理和优化具有很高的参考价值。在实际开发中,我们需要根据项目的具体需求,灵活运用这些...

    Android将bitmap保存到本地png/jpg格式等

    此外,考虑到性能优化,我们还可以使用异步操作来保存Bitmap,避免阻塞主线程。可以使用AsyncTask或其他异步框架来实现这一目标。例如: ```java public class SaveBitmapTask extends AsyncTask, Void, Boolean&gt; {...

    Android Drawable Bitmap 相互转换

    在Android开发中,Drawable和Bitmap是两种常用的图像资源类型,它们各有特点且在不同场景下有不同的优势。了解和掌握它们之间的相互转换对于优化性能和提高用户体验至关重要。本篇将详细介绍如何在Android中进行...

    解析Android开发优化之:对Bitmap的内存优化详解

    这里就有疑问了,Android系统有自己的垃圾回收机制,可以不定期的回收掉不使用的内存空间,当然也包括Bitmap的空间。那为什么还需要这个方法呢? Bitmap类的构造方法都是私有的,所以开发者不能直接new出一个Bitmap...

Global site tag (gtag.js) - Google Analytics