zoukankan      html  css  js  c++  java
  • 29 图片缩小案例

    当一张图片如果像素过大的在安卓原比例展示将直接内存溢出
    也许一张图片大小可能也就几百kb 但是在安卓中不是这样计算

    假设 一张1024*1920的图片

    • 那么假设他是256色图 那么每个像素点要存储256个颜色值那么需要2^8位正好是一个字节
    • 那么在安卓设备显示需要 1024*1920 *1= 1.875mb
      • 然后我们jpeg图片完全不止256色 如果高品质每像素点25k
      • 1024*1920 *25 = 46mb
    • 显然这是不能接受的所以们需要约束比例显示
    package com.qf.sxy.imagescale;
    
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.ImageView;
    
    import java.io.ByteArrayOutputStream;
    
    public class MainActivity extends AppCompatActivity {
    
        private ImageView iv;
    
        private Bitmap resourseBitmap;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            iv = ((ImageView) findViewById(R.id.iv_get));
    
            //获取图片
            resourseBitmap  = BitmapFactory.decodeResource(getResources(),R.mipmap.v5);
            iv.setImageBitmap(resourseBitmap);
        }
        //按钮点击事件 点击缩放图片
        public void MyClick(View view) {
    
            ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
            //质量压缩
            resourseBitmap.compress(Bitmap.CompressFormat.JPEG,100,outputStream);
            //获取byte{}
            byte[] bytes = outputStream.toByteArray();
            Bitmap bitmap = getImageScale(bytes,100,100);
            //iv 是布局中一个控件
            iv.setImageBitmap(bitmap);
        }
    
        //进行二次采样
        private Bitmap getImageScale(byte[] bytes,int newWidth ,int newHeight) {
    
            //图片的配置
            BitmapFactory.Options options = new BitmapFactory.Options();
            //仅仅解码图片的边缘部分
            options.inJustDecodeBounds = true;
            //将解析结果放入字节数组
            // 如果options.inJustDecodeBounds = true;那么返回bitmap是null
            BitmapFactory.decodeByteArray(bytes,0,bytes.length,options);
            //获取原始的宽高
            int outWidth = options.outWidth;
            int outHeight = options.outHeight;
    
            int scaleWidth = outWidth/newWidth;
            int scaleHeight = outHeight/newHeight;
    
            //获取缩放的值 值越大图片越小 我们只取最大缩放倍数
            // 原因: 如果宽要缩小 2 倍  高缩小3倍  你为2倍时因为高没有达到比列可能会看不见或者依然内存溢出
            int scale = scaleWidth>scaleHeight?scaleWidth:scaleHeight;
            //设置缩放比例
            //这里注意 约束比例只能是2^n方 也就是1 2 4 8 16
            //举个例子
            // 列子 1:如果你scale 为 3 那么将缩放比列为2
            // 例子 2:如果你scale 为 5 那么缩放比例为 4
            // 也就是说不到缩放比列不到2^n的 那么缩小倍数为 2^(n-1)方
            // 例子 3 : 如果你scale 为 5 因为 5小于 2^3 那么缩小倍数为2^(3-1)方 也就是4倍
            options.inSampleSize =scale;
            // 关闭只解析边缘 不然返回null
            options.inJustDecodeBounds = false;
    
            Bitmap bitmap =   BitmapFactory.decodeByteArray(bytes,0,bytes.length,options);
    
            return bitmap;
        }
    }
    
  • 相关阅读:
    $.contains(a,b)
    文件拷贝, 使用 BIO,NIO的对比,四种写法性能分析。
    win32 窗口缩放时出现闪屏
    Java: md5 加密中文 & 注意编码
    win32: 查询滚动条相关信息的注意事项
    查询字符串(性能对比): Array Vs HashMap
    多线程读取,单线程写入
    写入与读取第三方的 cookie
    asp 读cookie 下划线 丢失
    win7(旗舰版)下,OleLoadPicture 加载内存中的图片(MagickGetImageBlob),返回值 < 0
  • 原文地址:https://www.cnblogs.com/muyuge/p/6152160.html
Copyright © 2011-2022 走看看