创建bitmap的几种方法

  • 创建一个位图的方法,切记通过工厂得到的位图不能通过矩阵进行一系列转换,必须重新创建一个
  • 通过流获得bitmap是会更省内存
 private Bitmap bitmap1;

    /**
     * 创建一个位图的方法,切记通过工厂得到的位图不能通过矩阵进行一系列转换,必须重新创建一个
     * Bitmap.Config枚举类,
     * Bitmap.Config getConfig
     * setConfig(Bitmap.Config config)
     * 

* ALPHA_8 *

* RGB_565 *

* ARGB_8888 *

* RGBA_F16 *

* HARDWARE * * @param context */ public void createBitmap(Context context) { BitmapFactory.Options options = new BitmapFactory.Options(); options.inPreferredConfig = Bitmap.Config.ARGB_8888; options.inBitmap = bitmap1; bitmap1 = BitmapFactory.decodeResource(context.getResources(), R.mipmap.ic_launcher, options); Bitmap.Config config = bitmap1.getConfig(); bitmap1.setConfig(Bitmap.Config.ARGB_8888); //直接创建一个位图 Bitmap bitmap2 = Bitmap.createBitmap(bitmap1); //创建一个空位图,位图信息可以通过buffer流,或者canvas复制得到 Bitmap bitmap = Bitmap.createBitmap(100, 200, Bitmap.Config.ARGB_8888); //在原图的基础上进行裁剪,起点,以及新的位图的宽高 Bitmap bitmap3 = Bitmap.createBitmap(bitmap1, 20, 30, 50, 50); //先将原图通过矩阵进行变换,之后在进行裁剪,filter只有在matrix包含信息的时候才会用到 Matrix matrix = new Matrix(); matrix.setScale(2, 2); matrix.postRotate(180); Bitmap.createBitmap(bitmap1, 0, 0, 30, 30, matrix, true); //将位图缩放到这个尺寸,源码通过矩阵实现 Bitmap.createScaledBitmap(bitmap1, 102, 300, true); //改变原位图的宽高以及色彩,生成新位图,不会产生新位图 bitmap1.reconfigure(100, 200, Bitmap.Config.RGB_565); //将网络图转化为bitmap URL conurl = null; try { conurl = new URL(""); HttpURLConnection con = (HttpURLConnection) conurl.openConnection(); bitmap1 = BitmapFactory.decodeStream(con.getInputStream()); } catch (Exception e) { e.printStackTrace(); } //通过流获得图片以文件流的方式 try { FileInputStream fis = new FileInputStream("/sdcard/test.png"); Bitmap bitmap4 = BitmapFactory.decodeStream(fis); } catch (Exception e) { } BitmapDrawable bitmapDrawable = (BitmapDrawable) ContextCompat.getDrawable(context, R.mipmap.ic_launcher); Bitmap bitmap6 = bitmapDrawable.getBitmap(); //以ResourceStream的方式,不用R文件 Bitmap bitmap7 = BitmapFactory.decodeStream(getClass().getResourceAsStream("/res/drawable/test.png")); //以文件流+R文件的方式 @SuppressLint("ResourceType") InputStream in = context.getResources().openRawResource(R.mipmap.ic_launcher); Bitmap bitmap8 = BitmapFactory.decodeStream(in); try { InputStream issn = context.getResources().getAssets().open("ic"); Bitmap imageBitmap4 = BitmapFactory.decodeStream(in); } catch (IOException e) { e.printStackTrace(); } } public void bitmapOtherApi() { //得到存储该位图所占用内存的大小 int allocationByteCount = bitmap1.getAllocationByteCount(); //返回存储该位图的像素字节数 int byteCount = bitmap1.getByteCount(); //判断是否回收 boolean recycled = bitmap1.isRecycled(); bitmap1.recycle(); //比较两个位图是否相同 boolean b = bitmap1.sameAs(bitmap1); } /** * 复制图片的方法 */ private void copyBitmap() { //复制图片,isMutable代表是否可以修改新位图像素 Bitmap copy = bitmap1.copy(Bitmap.Config.RGB_565, false); //通过buffer流复制 //设置缓冲大小,一般设置位图的大小 Buffer buffer = ByteBuffer.allocate(bitmap1.getByteCount()); //将图片信息复制到缓冲流中 bitmap1.copyPixelsToBuffer(buffer); buffer.position(0); Bitmap bitmap = Bitmap.createBitmap(bitmap1.getWidth(), bitmap1.getHeight(), Bitmap.Config.ARGB_8888); //通过刘得到图片信息 bitmap.copyPixelsFromBuffer(buffer); //创建新的位图,允许新的位图宽高大于之前的位图 Canvas canvas = new Canvas(bitmap); canvas.drawBitmap(bitmap1, null, new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight()), null); } /** * 设置压缩图片,CompressFormat设置为Bitmap.CompressFormat.PNG,无效 */ public void compressBitmap() { ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); bitmap1.compress(Bitmap.CompressFormat.JPEG, 100, byteArrayOutputStream); }

你可能感兴趣的:(创建bitmap的几种方法)