BitmapUtil【缩放bitmap以及将bitmap保存成图片到SD卡中】
版权声明:本文为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卡中】的更多相关文章
- C# 图片缩放,拖拽后保存成图片的功能
窗体界面部分如下: 鼠标的缩放功能需要手动在 OpertaionImg.Designer.cs 文件里面添加一句代码,具体代码如下: //picturePhoto显示图片的控件 this.pictur ...
- android 文件保存到应用和sd卡中
<span style="font-size:18px;">1.权限添加 <uses-permission android:name="android. ...
- 如何把Excel中的单元格等对象保存成图片
对于Excel中的很多对象,比如单元格(Cell),图形(shape),图表(chart)等等,有时需要将它们保存成一张图片.就像截图一样. 最近做一个Excel相关的项目,项目中遇到一个很变态的需求 ...
- javacpp-opencv图像处理之1:实时视频添加文字水印并截取视频图像保存成图片,实现文字水印的字体、位置、大小、粗度、翻转、平滑等操作
欢迎大家积极开心的加入讨论群 群号:371249677 (点击这里进群) javaCV图像处理系列: javaCV图像处理之1:实时视频添加文字水印并截取视频图像保存成图片,实现文字水印的字体.位置. ...
- OpenGL中的深度、深度缓存、深度测试及保存成图片
1.深度 所谓深度,就是在openGL坐标系中,像素点Z坐标距离摄像机的距离.摄像机可能放在坐标系的任何位置,那么,就不能简单的说Z数值越大或越小,就是越靠近摄像机. 2.深度缓冲区 深度缓冲区原理就 ...
- 修改css的(屏蔽)overflow: hidden;实现浏览器能把网页全图保存成图片
摘要: 1.项目需要,需要对网页内容“下载”保存成全图片 2.QQ浏览器等主流浏览器都支持这种下载保存功能 3.项目需要场景:编写好的项目维护文档,放在服务器上.如果是txt不能带图片可视化,如果wo ...
- Java 将 PPT 形状(表格、文本框、心形、图表等)保存成图片
MS PowerPoint中的表格.文本框.心形.图表.图片等均可以称为形状,将这些形状保存成图片,便可分类储存,方便日后查找,再利用. 本文将介绍如何使用 Spire.Presentation fo ...
- 如何实现批量截取整个网页完整长截图,批量将网页保存成图片web2pic/webshot/screencapture/html2picture
如何实现批量截取整个网页完整长截图,批量将网页保存成图片web2pic/webshot/screencapture [困扰?疑问?]: 您是否正受到:如何将网页保存为图片的困扰?网页很高很长截图截不全 ...
- c# 将byte数组保存成图片
将byte数组保存成图片: 方式一:System.IO.File.WriteAllBytes(@"c:\test.jpg", bytes); 方式二:MemoryStream ms ...
随机推荐
- [爬虫]BeautifulSoup4
1.Beautiful Soup的简介 Beautiful Soup是python的一个库,最主要的功能是从网页抓取数据.官方解释如下: Beautiful Soup提供一些简单的.python式的函 ...
- dirlock_windows.go
package dirlock type DirLock struct { dir string } func New(dir string) *DirLock { return &a ...
- rename.go
{ if err != nil { return err } return syscall.EINVAL } r ...
- multiWriter.go
package blog4go import ( "errors" "fmt" ) var ( // ErrFilePathNotFound 文件路径找不到 E ...
- CentOS7 docker试水
CentOS 7.0,无外网直接访问权限,有一台代理服务器. 首先安装docker-ce,参考http://blog.51cto.com/aaronsa/2056882 除非特殊说明,以下操作都用ro ...
- Flask导入静态文件问题
然而如果使用flask开发web,并且需要在本地导入已经写好的css js 文件或者image一系列,这些文件是静态文件,需要另外建一个文件夹static;并且在html文件修改导入方法,exampl ...
- 基于SpringBoot从零构建博客网站 - 整合lombok和mybatis-plus提高开发效率
在上一章节中<技术选型和整合开发环境>,确定了开发的技术,但是如果直接这样用的话,可能开发效率会不高,为了提高开发的效率,这里再整合lombok和mybatis-plus两个组件. 1.l ...
- ASP.Net Core MVC 发生二次请求
Bug回忆录 昨天搭建新框架的时候,遇到一个很奇怪的“Bug”,每次请求都会触发两次Aciton,举例子吧,Demo: _Layout.cshtml <!DOCTYPE html> < ...
- React + TypeScript:元素引用的传递
React 中需要操作元素时,可通过 findDOMNode() 或通过 createRef() 创建对元素的引用来实现.前者官方不推荐,所以这里讨论后者及其与 TypeScript 结合时如何工作. ...
- 我的Lambda的学习笔记
前述 Lambda表达式是 Java 8 的新特性.许多语言都有 Lambda 的特性. 因此使用的 Java 环境一定要 8 以上的环境. Lambda 到底什么是 Lambda 表达式呢? Lam ...