欢迎光临散文网 会员登陆 & 注册

android studio 常用图片处理,大量加载图片的内存处理,压缩等等

2023-06-14 13:26 作者:翼618  | 我要投稿

图片缓存  这个比较特殊 

//图片存储

    private void saveBitmapToSharedPreferences(Bitmap bitmap){

//        Bitmap bitmap=BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher);

        //第一步:将Bitmap压缩至字节数组输出流ByteArrayOutputStream

        ByteArrayOutputStream byteArrayOutputStream=new ByteArrayOutputStream();

        bitmap.compress(Bitmap.CompressFormat.PNG, 80, byteArrayOutputStream);

        //第二步:利用Base64将字节数组输出流中的数据转换成字符串String

        byte[] byteArray=byteArrayOutputStream.toByteArray();

        String imageString=new String(Base64.encodeToString(byteArray, Base64.DEFAULT));

        //第三步:将String保持至SharedPreferences

        SharedPreferences sharedPreferences=getSharedPreferences("testSP", Context.MODE_PRIVATE);

        SharedPreferences.Editor editor=sharedPreferences.edit();

        editor.putString("image", imageString);

        editor.commit();

    }


//    拿 图片缓存

   private void getBitmapFromSharedPreferences(){

        SharedPreferences sharedPreferences= getSharedPreferences("testSP", Context.MODE_PRIVATE);

        //第一步:取出字符串形式的Bitmap

        String imageString=sharedPreferences.getString("image", "");

        //第二步:利用Base64将字符串转换为ByteArrayInputStream

        byte[] byteArray=Base64.decode(imageString, Base64.DEFAULT);

        ByteArrayInputStream byteArrayInputStream=new ByteArrayInputStream(byteArray);

        //第三步:利用ByteArrayInputStream生成Bitmap

        Bitmap bitmap=BitmapFactory.decodeStream(byteArrayInputStream);


        if (bitmap == null) {

         bitmap = BitmapFactory.decodeResource(getResources(),R.drawable.portrait);

        }else{

            ivHead.setImageBitmap(bitmap);

        }

    }

-----------------------我是分割线------------------------------


设置本地图片为bitmap

 Bitmap rawBitmap = BitmapFactory.decodeResource(getResources(),R.drawable.ic_launcher);

  切换图片

 messageImage.setImageResource(R.drawable.message_selected);


android 网络url转bitmap


注意:该方法必须要在子线程中调用,因为涉及网络请求

public Bitmap getBitmap(String url) {  

        Bitmap bm = null;  

        try {  

            URL iconUrl = new URL(url);  

            URLConnection conn = iconUrl.openConnection();  

            HttpURLConnection http = (HttpURLConnection) conn;  

              

            int length = http.getContentLength();  

              

            conn.connect();  

            // 获得图像的字符流  

            InputStream is = conn.getInputStream();  

            BufferedInputStream bis = new BufferedInputStream(is, length);  

            bm = BitmapFactory.decodeStream(bis);  

            bis.close();  

            is.close();// 关闭流  

        }  

        catch (Exception e) {  

            e.printStackTrace();  

        }  

        return bm;  

    }  

-----------------------我是分割线------------------------------

imageView  常用属性设置


等比例缩放图片   重要

android:adjustViewBounds="true"


控制为了使图片适合 ImageView 的大小,应该如何变更图片大小或移动图片。一定是下列常量之一:

android:scaleType

常量值描述:

matrix

用矩阵来绘图

fitXY

拉伸图片(不按比例)以填充View的宽高

fitStart

按比例拉伸图片,拉伸后图片的高度为View的高度,且显示在View的左边

fitCenter

按比例拉伸图片,拉伸后图片的高度为View的高度,且显示在View的中间

fitEnd

按比例拉伸图片,拉伸后图片的高度为View的高度,且显示在View的右边

center

按原图大小显示图片,但图片宽高大于View的宽高时,截图图片中间部分显示

centerCrop

按比例放大原图直至等于某边View的宽高显示。

centerInside

当原图宽高或等于View的宽高时,按原图大小居中显示;反之将原图缩放至View的宽高居中显示。

(译者注:设置图片的填充方式。)


往下推的神技!

    <ImageView

        android:paddingBottom="140dp"

        android:scaleType="centerCrop"

        android:layout_width="match_parent"

        android:layout_height="100dp"

        android:src="@drawable/huck" />



-----------------------我是分割线------------------------------



下面介绍一个常用的图片加载库Glide,可以极大的优化加载的内存,而且合并处理狠很多东西,同时加载图片越多,越能体现价值,可以在android里面看到内存的波动情况


Glide 的一个优势:缓存

Glide 的缓存实现是基于 Picasso,当加载图片时,Glide 使用3个来源:内存,磁盘和网络(从最快到最慢排序)。 他还可以加载动态图片


glide 在程序入口里面 有一个初始化配置 配置了他的话 就可以不用做缓存操作之类的

使用要先导包

compile 'com.github.bumptech.glide:glide:+'


加载网络图片

ImageView targetImageView = (ImageView) findViewById(R.id.imageView);

String internetUrl = "http://i.imgur.com/DvpvklR.png";

Glide .with(context) 

  .load(internetUrl) 

  .into(targetImageView);



// 加载本地图片

File file = new File(getExternalCacheDir() + "/image.jpg");

Glide.with(this).load(file).into(imageView);


// 加载应用资源

int resource = R.drawable.image;

Glide.with(this).load(resource).into(imageView);


// 加载二进制流

byte[] image = getImageBytes();

Glide.with(this).load(image).into(imageView);


// 加载Uri对象

Uri imageUri = getImageUri();

Glide.with(this).load(imageUri).into(imageView);


    更多设置用法

 .placeholder(R.drawable.loading) // 站位图 

  .error(R.drawable.error)加载图片失败时显示的图片

Glide.with(this)

     .load(url)

     .placeholder(R.drawable.loading)

     .diskCacheStrategy(DiskCacheStrategy.NONE)

     .into(imageView);


Glide.with(this)

     .load(url)

     .placeholder(R.drawable.loading)

     .error(R.drawable.error)

     .diskCacheStrategy(DiskCacheStrategy.NONE)

     .into(imageView);




这里在load()方法的后面加入了一个asBitmap()方法,这个方法的意思就是说这里只允许加载静态图片,不需要Glide去帮我们自动进行图片格式的判断了。

Glide.with(this)

     .load(url)

     .asBitmap()

     .placeholder(R.drawable.loading)

     .error(R.drawable.error)

     .diskCacheStrategy(DiskCacheStrategy.NONE)

     .into(imageView);




这里调用了asGif()方法替代了asBitmap()方法, 强制动态图片

Glide.with(this)

     .load(url)

     .asGif()

     .placeholder(R.drawable.loading)

     .error(R.drawable.error)

     .diskCacheStrategy(DiskCacheStrategy.NONE)

     .into(imageView);



//这个文件可能不存在于你的设备中。然而你可以用任何文件路径,去指定一个图片路径。

File file = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "Running.jpg");

Glide .with(context) .load(file) .into(imageViewFile);


占位符和渐现动画

Glide 的流式接口只需要调用 .placeHolder()用一个 drawable(resource) 引用,Glide 将会显示它作为一个占位符,直到你的实际图片准备好。


  Glide 

      .with(context) 

      .load(UsageExampleListViewAdapter.eatFoodyImages[0])

      .placeholder(R.mipmap.ic_launcher) // 也可以是一个drawable 

      .into(imageViewPlaceholder);



Glide 

    .with(context) 

    .load("http://futurestud.io/non_existing_image.png") 

    .placeholder(R.mipmap.ic_launcher) // 也可以是一个drawable 

    .error(R.mipmap.future_studio_launcher) // 如果图片不能加载就会显示

    .into(imageViewError);



Glide 

    .with(context) 

    .load(UsageExampleListViewAdapter.eatFoodyImages[0])

    .override(600, 200) // 重新改变图片大小成这些尺寸(像素).不关心长宽比

    .into(imageViewResize);



Glide.with(this)

     .load(url)

     .placeholder(R.drawable.loading)

     .error(R.drawable.error)

     .diskCacheStrategy(DiskCacheStrategy.NONE)

     .override(100, 100) //设置图片大小 并非是view大小

     .into(imageView);



/**设置实体图片 加缓存 待测试*/

Glide.with(context)

.load(file)

.diskCacheStrategy(DiskCacheStrategy.NONE)// 缓存所有尺寸的图片

.into(holder.img1);



显示 Gif


检查图片加载的是否是一个gif图片,调用一个额外的防区强制 Glide变成一个 Gif asGif()

String gifUrl = "http://i.kinja-img.com/gawker-media/image/upload/s--B7tUiM5l--/gf2r69yorbdesguga10i.gif";

Glide 

    .with( context ) 

    .load( gifUrl ) 

    .asGif() 

    .error( R.drawable.full_cake ) 

    .into( imageViewGif );



android studio 常用图片处理,大量加载图片的内存处理,压缩等等的评论 (共 条)

分享到微博请遵守国家法律