版权声明:本文为HaiyuKing原创文章,转载请注明出处!

前言

用于缩放bitmap以及将bitmap保存成图片到SD卡中

效果图

代码分析

bitmapZoomByHeight(Bitmap srcBitmap, float newHeight): 根据指定的高度进行缩放(src是bitmap)

bitmapZoomByHeight(Drawable drawable, float newHeight) :根据指定的高度进行缩放(src是drawable)

bitmapZoomByScale(Bitmap srcBitmap, float scaleWidth, float scaleHeight): 根据指定的宽度比例值和高度比例值进行缩放

drawableToBitmap(Drawable drawable) :将drawable对象转成bitmap对象

drawableToBitmap2(Drawable drawable) :将drawable对象转成bitmap对象

saveBitmapToSDCard(Bitmap bitmap, String path): 将bitmap对象保存成图片到sd卡中

getBitmapFromSDCard(String path) :从sd卡中去除图片的bitmap对象

使用步骤

一、项目组织结构图

注意事项:

1、  导入类文件后需要change包名以及重新import R文件路径

2、  Values目录下的文件(strings.xml、dimens.xml、colors.xml等),如果项目中存在,则复制里面的内容,不要整个覆盖

二、导入步骤

将BitmapUtil复制到项目中

package com.why.project.bitmaputildemo.utils;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.PixelFormat;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable; import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream; /**
* Created by HaiyuKing
* Used
*/ public class BitmapUtil {
public static Bitmap temp; /**根据指定的高度进行缩放(source是bitmap)*/
public static Bitmap bitmapZoomByHeight(Bitmap srcBitmap, float newHeight) {
float scale = newHeight / (((float)srcBitmap.getHeight()));
return BitmapUtil.bitmapZoomByScale(srcBitmap, scale, scale);
}
/**根据指定的高度进行缩放(source是drawable)*/
public static Bitmap bitmapZoomByHeight(Drawable drawable, float newHeight) {
Bitmap bitmap = BitmapUtil.drawableToBitmap(drawable);
float scale = newHeight / (((float)bitmap.getHeight()));
return BitmapUtil.bitmapZoomByScale(bitmap, scale, scale);
} /**根据指定的宽度比例值和高度比例值进行缩放*/
public static Bitmap bitmapZoomByScale(Bitmap srcBitmap, float scaleWidth, float scaleHeight) {
int width = srcBitmap.getWidth();
int height = srcBitmap.getHeight();
Matrix matrix = new Matrix();
matrix.postScale(scaleWidth, scaleHeight);
Bitmap bitmap = Bitmap.createBitmap(srcBitmap, 0, 0, width, height, matrix, true);
if(bitmap != null) {
return bitmap;
}else {
return srcBitmap;
}
} /**将drawable对象转成bitmap对象*/
public static Bitmap drawableToBitmap(Drawable drawable) {
int width = drawable.getIntrinsicWidth();
int height = drawable.getIntrinsicHeight();
Bitmap.Config config = drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888 : Bitmap.Config.RGB_565;
Bitmap bitmap = Bitmap.createBitmap(width, height, config);
Canvas canvas = new Canvas(bitmap);
drawable.setBounds(0, 0, width, height);
drawable.draw(canvas);
return bitmap;
} /**将drawable对象转成bitmap对象*/
public static Bitmap drawableToBitmap2(Drawable drawable) {
BitmapDrawable bd = (BitmapDrawable) drawable;
Bitmap bm= bd.getBitmap();
return bm;
} /**将bitmap对象保存成图片到sd卡中*/
public static void saveBitmapToSDCard(Bitmap bitmap, String path) { File file = new File(path);
if(file.exists()) {
file.delete();
}
try {
FileOutputStream fileOutputStream = new FileOutputStream(file);
bitmap.compress(Bitmap.CompressFormat.PNG, 100, ((OutputStream)fileOutputStream));//设置PNG的话,透明区域不会变成黑色 fileOutputStream.close();
System.out.println("----------save success-------------------");
}
catch(Exception v0) {
v0.printStackTrace();
} }
/**从sd卡中获取图片的bitmap对象*/
public static Bitmap getBitmapFromSDCard(String path) { Bitmap bitmap = null;
try {
FileInputStream fileInputStream = new FileInputStream(path);
if(fileInputStream != null) {
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 2; //当图片资源太大的适合,会出现内存溢出。图片宽高都为原来的二分之一,即图片为原来的四分一
bitmap = BitmapFactory.decodeStream(((InputStream) fileInputStream), null, options);
}
} catch(Exception e) {
return null;
} return bitmap;
} }

在AndroidMainfest.xml文件中声明权限

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.why.project.bitmaputildemo"> <!-- =================BitmapUtil用到的权限========================== -->
<!-- 允许程序读取外部存储文件 -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<!-- 允许程序写入外部存储,如SD卡上写文件 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission> <application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
</application> </manifest>

添加运行时权限的处理(本demo中采用的是修改targetSDKVersion=22)

三、使用方法

本Demo搭配《AppDir【创建缓存目录】》使用

package com.why.project.bitmaputildemo;

import android.graphics.Bitmap;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView; import com.why.project.bitmaputildemo.utils.AppDir;
import com.why.project.bitmaputildemo.utils.BitmapUtil; import java.io.File; public class MainActivity extends AppCompatActivity { private ImageView img_source;
private ImageView img_scale1;
private ImageView img_scale2; private Button btn_save;
private Button btn_show;
private ImageView img_show; private String pngFilePath; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); initViews();
initDatas();
initEvents();
} private void initViews() {
img_source = (ImageView) findViewById(R.id.img_source);
img_scale1 = (ImageView) findViewById(R.id.img_scale1);
img_scale2 = (ImageView) findViewById(R.id.img_scale2); btn_save = (Button) findViewById(R.id.btn_save);
btn_show = (Button) findViewById(R.id.btn_show);
img_show = (ImageView) findViewById(R.id.img_show);
} private void initDatas() {
img_source.setImageResource(R.mipmap.ic_launcher); Bitmap sourceBitmap = BitmapUtil.drawableToBitmap(getResources().getDrawable(R.mipmap.ic_launcher));
Bitmap sacleBitmap1 = BitmapUtil.bitmapZoomByHeight(sourceBitmap,200);
img_scale1.setImageBitmap(sacleBitmap1); Bitmap sacleBitmap2 = BitmapUtil.bitmapZoomByScale(sourceBitmap,2,1);
img_scale2.setImageBitmap(sacleBitmap2);
} private void initEvents() {
btn_save.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
pngFilePath = AppDir.getInstance(MainActivity.this).IMAGE + File.separator + System.currentTimeMillis() + ".png";
Bitmap sourceBitmap = BitmapUtil.drawableToBitmap(getResources().getDrawable(R.mipmap.ic_launcher));
BitmapUtil.saveBitmapToSDCard(sourceBitmap,pngFilePath);
}
}); btn_show.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String pngPath = pngFilePath;
Bitmap pngBitmap = BitmapUtil.getBitmapFromSDCard(pngPath);
img_show.setImageBitmap(pngBitmap);
}
});
}
}

混淆配置

参考资料

Android常用的Drawable和Bitmap之间的转化方法

项目demo下载地址

https://github.com/haiyuKing/BitmapUtilDemo

BitmapUtil【缩放bitmap以及将bitmap保存成图片到SD卡中】的更多相关文章

  1. C# 图片缩放,拖拽后保存成图片的功能

    窗体界面部分如下: 鼠标的缩放功能需要手动在 OpertaionImg.Designer.cs 文件里面添加一句代码,具体代码如下: //picturePhoto显示图片的控件 this.pictur ...

  2. android 文件保存到应用和sd卡中

    <span style="font-size:18px;">1.权限添加 <uses-permission android:name="android. ...

  3. 如何把Excel中的单元格等对象保存成图片

    对于Excel中的很多对象,比如单元格(Cell),图形(shape),图表(chart)等等,有时需要将它们保存成一张图片.就像截图一样. 最近做一个Excel相关的项目,项目中遇到一个很变态的需求 ...

  4. javacpp-opencv图像处理之1:实时视频添加文字水印并截取视频图像保存成图片,实现文字水印的字体、位置、大小、粗度、翻转、平滑等操作

    欢迎大家积极开心的加入讨论群 群号:371249677 (点击这里进群) javaCV图像处理系列: javaCV图像处理之1:实时视频添加文字水印并截取视频图像保存成图片,实现文字水印的字体.位置. ...

  5. OpenGL中的深度、深度缓存、深度测试及保存成图片

    1.深度 所谓深度,就是在openGL坐标系中,像素点Z坐标距离摄像机的距离.摄像机可能放在坐标系的任何位置,那么,就不能简单的说Z数值越大或越小,就是越靠近摄像机. 2.深度缓冲区 深度缓冲区原理就 ...

  6. 修改css的(屏蔽)overflow: hidden;实现浏览器能把网页全图保存成图片

    摘要: 1.项目需要,需要对网页内容“下载”保存成全图片 2.QQ浏览器等主流浏览器都支持这种下载保存功能 3.项目需要场景:编写好的项目维护文档,放在服务器上.如果是txt不能带图片可视化,如果wo ...

  7. Java 将 PPT 形状(表格、文本框、心形、图表等)保存成图片

    MS PowerPoint中的表格.文本框.心形.图表.图片等均可以称为形状,将这些形状保存成图片,便可分类储存,方便日后查找,再利用. 本文将介绍如何使用 Spire.Presentation fo ...

  8. 如何实现批量截取整个网页完整长截图,批量将网页保存成图片web2pic/webshot/screencapture/html2picture

    如何实现批量截取整个网页完整长截图,批量将网页保存成图片web2pic/webshot/screencapture [困扰?疑问?]: 您是否正受到:如何将网页保存为图片的困扰?网页很高很长截图截不全 ...

  9. c# 将byte数组保存成图片

    将byte数组保存成图片: 方式一:System.IO.File.WriteAllBytes(@"c:\test.jpg", bytes); 方式二:MemoryStream ms ...

随机推荐

  1. Ubuntu配置SecureCRT登录

    1. 命令行切换到root用户 备注:ubuntu默认root用户没有设置密码,切换需要首先设置密码 sudo passwd root 按照提示输入当前用户密码 按照提示输入要设置的root用户密码 ...

  2. java 中 一个int类型的num,num&1

    n&1 把n与1按位与,因为1除了最低位,其他位都为0,所以按位与结果取决于n最后一位,如果n最后一位是1,则结果为1.反之结果为0.(n&1)==1: 判断n最后一位是不是1(可能用 ...

  3. java函数式编程之Consumer

    参考https://blog.csdn.net/z345434645/article/details/53794724 https://blog.csdn.net/chuji2012/article/ ...

  4. 获得指定数据库中指定块表中所有实体的id

    该函数也使用外部指定图纸中的数据库中的块 Int getIdsByDwgBlkName(AcDbDatabase *pDwg, CString strBlkName, AcDbObjectIdArra ...

  5. BZOJ_4653_[Noi2016]区间_线段树+离散化+双指针

    BZOJ_4653_[Noi2016]区间_线段树+离散化+双指针 Description 在数轴上有 n个闭区间 [l1,r1],[l2,r2],...,[ln,rn].现在要从中选出 m 个区间, ...

  6. BZOJ_1101_[POI2007]Zap_莫比乌斯反演

    题意:FGD正在破解一段密码,他需要回答很多类似的问题:对于给定的整数a,b和d,有多少正整数对x,y,满足x<=a ,y<=b,并且gcd(x,y)=d.作为FGD的同学,FGD希望得到 ...

  7. P2P综述

    原文参见:http://www.lotushy.com/?p=113 [TOC] 什么是P2P P2P全称是Peer-to-peer.P2P计算或P2P网络是一种分布式应用架构.它将任务或负载分发给P ...

  8. C++实现离散数学的关系类,支持传递闭包运算

    #include <vector> #include <cassert> #include <iostream> using namespace std; clas ...

  9. [Hyperledger] Fabric系统中 peer模块的 gossip服务详解

    最近一直在看fabric系统中的核心模块之一——peer模块.在看peer的配置文件core.yaml的信息时,对其中的gossip配置选项很感兴趣.看了一上午,还是不能明白这个选项到底什么意思呢?表 ...

  10. 为什么VUE注册组件命名时不能用大写的?

    这段时间一直在弄vue,当然也遇到很多问题,这里就来跟大家分享一些注册自定义模板组件的心得 首先"VUE注册组件命名时不能用大写"其实这句话是不对的,但我们很多人开始都觉得是对的, ...