文档章节

Android:实用的图片处理(压缩、旋转、放大或缩小、图片上印字、加水印、图片验证码)

ForingY
 ForingY
发布于 2016/08/01 14:32
字数 987
阅读 37
收藏 0
点赞 0
评论 0

这些天一直为android程序如何压缩图片烦恼,上网找了很多资料,整理了一下,经过测试,都是可用的,

/** 
     * 压缩图片 
     * @param bitmap 源图片 
     * @param width 想要的宽度 
     * @param height 想要的高度 
     * @param isAdjust 是否自动调整尺寸, true图片就不会拉伸,false严格按照你的尺寸压缩 
     * @return Bitmap 
     */  
    public Bitmap reduce(Bitmap bitmap, int width, int height, boolean isAdjust) {  
        // 如果想要的宽度和高度都比源图片小,就不压缩了,直接返回原图  
        if (bitmap.getWidth() < width && bitmap.getHeight() < height) {return bitmap;}  
        // 根据想要的尺寸精确计算压缩比例, 方法详解:public BigDecimal divide(BigDecimal divisor, int scale, int roundingMode);  
        // scale表示要保留的小数位, roundingMode表示如何处理多余的小数位,BigDecimal.ROUND_DOWN表示自动舍弃  
        float sx = new BigDecimal(width).divide(new BigDecimal(bitmap.getWidth()), 4, BigDecimal.ROUND_DOWN).floatValue();  
        float sy = new BigDecimal(height).divide(new BigDecimal(bitmap.getHeight()), 4, BigDecimal.ROUND_DOWN).floatValue();  
        if (isAdjust) {// 如果想自动调整比例,不至于图片会拉伸  
            sx = (sx < sy ? sx : sy);sy = sx;// 哪个比例小一点,就用哪个比例  
        }  
        Matrix matrix = new Matrix();  
        matrix.postScale(sx, sy);// 调用api中的方法进行压缩,就大功告成了  
        return Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);  

旋转图片:

/** 
     * 旋转图片 
     * @param bitmap 源图片 
     * @param angle 旋转角度(90为顺时针旋转,-90为逆时针旋转) 
     * @return Bitmap 
     */  
    public Bitmap rotate(Bitmap bitmap, float angle) {  
        Matrix matrix = new Matrix();    
        matrix.postRotate(angle);  
        return Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);  
    }  

放大或缩小图片:

/** 
     * 放大或缩小图片 
     * @param bitmap 源图片 
     * @param ratio 放大或缩小的倍数,大于1表示放大,小于1表示缩小 
     * @return Bitmap 
     */  
    public Bitmap zoom(Bitmap bitmap, float ratio) {  
        if (ratio < 0f) {return bitmap;}  
        Matrix matrix = new Matrix();  
        matrix.postScale(ratio, ratio);  
        return Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);  
    }  

在图片上印字:

/** 
     * 在图片上印字 
     * @param bitmap 源图片 
     * @param text 印上去的字 
     * @param param 字体参数分别为:颜色,大小,是否加粗,起点x,起点y; 比如:{color : 0xFF000000, size : 30, bold : true, x : 20, y : 20} 
     * @return Bitmap 
     */  
    public Bitmap printWord(Bitmap bitmap, String text, Map<String, Object> param) {  
        if (ToolUtil.get().isBlank(text) || null == param) {return bitmap;}  
        Bitmap newBitmap = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Config.ARGB_8888);  
        Canvas canvas = new Canvas(newBitmap);  
        canvas.drawBitmap(bitmap, 0, 0, null);canvas.save(Canvas.ALL_SAVE_FLAG);canvas.restore();  
        Paint paint = new Paint();  
        paint.setColor(null != param.get("color") ? (Integer) param.get("color") : Color.BLACK);  
        paint.setTextSize(null != param.get("size") ? (Integer) param.get("size") : 20);  
        paint.setFakeBoldText(null != param.get("bold") ? (Boolean) param.get("bold") : false);  
        canvas.drawText(text, null != param.get("x") ? (Integer) param.get("x") : 0, null != param.get("y") ? (Integer) param.get("y") : 0, paint);  
        canvas.save(Canvas.ALL_SAVE_FLAG);canvas.restore();  
        return newBitmap;  
    }  

创建logo(给图片加水印), :

/** 
     * 创建logo(给图片加水印),  
     * @param bitmaps 原图片和水印图片 
     * @param left 左边起点坐标 
     * @param top 顶部起点坐标t 
     * @return Bitmap 
     */  
    public Bitmap createLogo(Bitmap[] bitmaps, int left, int top) {  
        Bitmap newBitmap = Bitmap.createBitmap(bitmaps[0].getWidth(), bitmaps[0].getHeight(), Config.ARGB_8888);  
        Canvas canvas = new Canvas(newBitmap);  
        for (int i = 0; i < bitmaps.length; i++) {  
            if (i == 0) {  
                canvas.drawBitmap(bitmaps[0], 0, 0, null);  
            } else {  
                canvas.drawBitmap(bitmaps[i], left, top, null);  
            }  
            canvas.save(Canvas.ALL_SAVE_FLAG);canvas.restore();  
        }  
        return newBitmap;  
    }  

产生一个4位随机数字的图片验证码:

private int width = 140, height = 40, codeLen = 4;  
    private String checkCode = "";  
    private Random random = new Random();  
      
    /** 
     * 产生一个4位随机数字的图片验证码 
     * @return Bitmap 
     */  
    public Bitmap createCode() {  
        checkCode = "";  
        String[] chars = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" };  
        for (int i = 0; i < codeLen; i++) {checkCode += chars[random.nextInt(chars.length)];}  
        Bitmap bitmap = Bitmap.createBitmap(width, height, Config.ARGB_8888);  
        Canvas canvas = new Canvas(bitmap);canvas.drawColor(Color.WHITE);  
        Paint paint = new Paint();paint.setTextSize(30);paint.setColor(Color.BLUE);  
        for (int i = 0; i < checkCode.length(); i++) {  
            paint.setColor(randomColor(1));paint.setFakeBoldText(random.nextBoolean());  
            float skewX = random.nextInt(11) / 10;  
            paint.setTextSkewX(random.nextBoolean() ? skewX : -skewX);  
            int x = width / codeLen * i + random.nextInt(10);  
            canvas.drawText(String.valueOf(checkCode.charAt(i)), x, 28, paint);  
        }  
        for (int i = 0; i < 3; i++) {drawLine(canvas, paint);}  
        for (int i = 0; i < 255; i++) {drawPoints(canvas, paint);}  
        canvas.save(Canvas.ALL_SAVE_FLAG);canvas.restore();  
        return bitmap;  
    }  
      
    /** 
     * 获得一个随机的颜色 
     * @param rate 
     * @return  
     */  
    public int randomColor(int rate) {  
        int red = random.nextInt(256) / rate, green = random.nextInt(256) / rate, blue = random.nextInt(256) / rate;  
        return Color.rgb(red, green, blue);  
    }  
  
    /** 
     * 画随机线条 
     * @param canvas 
     * @param paint 
     */  
    public void drawLine(Canvas canvas, Paint paint) {  
        int startX = random.nextInt(width), startY = random.nextInt(height);  
        int stopX = random.nextInt(width), stopY = random.nextInt(height);  
        paint.setStrokeWidth(1);paint.setColor(randomColor(1));  
        canvas.drawLine(startX, startY, stopX, stopY, paint);  
    }  
  
    /** 
     * 画随机干扰点 
     * @param canvas 
     * @param paint 
     */  
    public void drawPoints(Canvas canvas, Paint paint) {  
        int stopX = random.nextInt(width), stopY = random.nextInt(height);  
        paint.setStrokeWidth(1);  
        paint.setColor(randomColor(1));  
        canvas.drawPoint(stopX, stopY, paint);  
    }  
      
    /** 
     * 返回真实验证码字符串 
     * @return String 
     */  
    public String getCheckCode() {  
        return checkCode;  
    }  

本文转载自:http://blog.csdn.net/s478853630/article/details/14226873#

共有 人打赏支持
ForingY
粉丝 23
博文 252
码字总数 156129
作品 0
杭州
程序员
OpenGL实现物体动画和视频特效

OpenGL实现视频的水印、滤镜?OpenGL实现视频的剪裁、旋转? 2D/3D物体的 旋转,平移,缩放? OpenGL图片滤镜与视频滤镜? 矩阵(Matrix)是一个按照长方阵列排列的复数或实数集合,最早来自于方...

shareus ⋅ 04/24 ⋅ 0

IOS,UITextField比较全的实用的属性功能

//初始化textfield并设置位置及大小 UITextField *text = [[UITextField alloc]initWithFrame:CGRectMake(20, 20, 130, 30)]; //设置边框样式,只有设置了才会显示边框样式 text.borderStyle...

曹江涛 ⋅ 2016/01/18 ⋅ 0

文章创作必备的超实用图片处理神器们

前言 作为一个博主或者媒体工作者、公众号编辑、网站站长、平台作者等内容创作者,写文章时经常要和图片素材打交道。 为了使文章具有更好的阅读体验和可读性,让读者不仅看得懂还要看得爽,经...

己立 ⋅ 2017/12/14 ⋅ 0

Android实现CoverFlow效果

先上一张效果图: 上代码,看了代码什么都明白 CoverFlow从Gallery继承过来 package com.coverflow; import android.content.Context;import android.graphics.Camera;import android.graphi......

迷途d书童 ⋅ 2012/02/28 ⋅ 25

thumbnailator图片处理:缩放、水印、剪切等

项目地址:https://github.com/coobird/thumbnailator本篇介绍基本使用 加载图片源 缩放 质量压缩 剪切 根据宽度来缩放 在调整尺寸时保持比例 根据宽度和高度进行缩放 将图片放入内存 加水印...

ouhoo ⋅ 2016/08/18 ⋅ 0

图片处理工具--xice7-imageKit

xice7-imageKit是基于java语言实现的简单的图片处理工具。 使用简单, API采用易用的管道流设计。 工程很小,且不依赖第三方Jar文件。 支持多种图片效果处理,如: 图片压缩 -支持各种类型的图片...

不愿透露姓名的Mr成 ⋅ 2017/05/17 ⋅ 2

I3Io88I88oo狸窝全能视频转换器 4.2.0.2 官方免费版www540633com

狸窝全能视频转换器(视频格式转换器)是一款功能强大,界面友好的全能型音视频转换及编辑工具。有了狸窝全能视频转换器,您可以在几乎所有流行的视频格式之间,任意相互转换。如:RM、RMVB、V...

万花从中过 ⋅ 06/02 ⋅ 0

基于URL的图片处理库--EvaThumber

EvaThumber 是一个基于URL的轻量级图片处理库,支持缩放/旋转/截取/滤镜等多种常用图片处理,支持设置水印/二维码,并且可以进行面部识别以及PNG优化压缩,所有处理仅仅需要通过更改图片的U...

AlloVince ⋅ 2013/03/05 ⋅ 3

Android超大图片不缩小要怎样处理。

android里面有个类似指南针的程序要做,但要加载一幅超大图片,3000x3000,不能让他失真,要有放大和缩小功能,最大能放到和原图一样的大小,最小是刚刚能现在满屏幕,而且要根据方向图片不断...

tukiyuki ⋅ 2014/02/26 ⋅ 1

Android开发_拖动效果,旋转效果,两点放大缩小的实现

最近在做一个项目,需要用到拖动图片,旋转效果,两点放大缩小。 首先拖动图片 布局,主要就是一个button做测试 package com.oppo.examples; import android.app....

zhangty0223 ⋅ 2013/07/20 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

JAVA RMI

什么是JAVA RMI Java RMI (Remote Method Invocation) 远程方法调用,能够让客户端像使用本地调用一样调用服务端 Java 虚拟机中的对象方法。RMI 是面向对象语言领域对 RPC (Remote Proced...

saulc ⋅ 18分钟前 ⋅ 0

Linux系统工程狮养成记

如今的社会,随着时代的发展,出现了很多职业,像电子类,计算机类的专业,出现了各种各样的工程师,有算法工程师,java工程师,前端工程师,后台工程师,Linux工程师,运维工程师等等,不同...

linux-tao ⋅ 28分钟前 ⋅ 0

进入编辑模式 vim命令模式 vim实践

1.

oschina130111 ⋅ 28分钟前 ⋅ 0

mysql用户管理、常用sql语句、mysql数据库备份恢复

1. mysql用户管理 mysql默认有一个root超级管理员账户,实际工作环境中不可能每个人都用此root权限,防止误操作、误删除,可以给单独的用户进行授权。 Mysql创建用户以及授权: grant all on...

laoba ⋅ 28分钟前 ⋅ 0

类型后面三个点(String...)和数组(String[])的区别

类型后面三个点(String…),是从Java 5开始,Java语言对方法参数支持一种新写法,叫可变长度参数列表,其语法就是类型后跟…,表示此处接受的参数为0到多个Object类型的对象,或者是一个Obj...

流氓兔- ⋅ 34分钟前 ⋅ 0

JEPLUS表格组件之表格合并——JEPLUS软件快速开发平台

JEPLUS表格组件之表格合并 我们在列表配置时会遇见这样的一种情况,需要对个人的数据进行统一化,对一些数据进行归类,这样展示出来美观又直观,在这篇笔记中我来给大家介绍下如何配置出来专...

JEPLUS ⋅ 35分钟前 ⋅ 0

golang 并发中全局唯一操作

package main// go 携程共享 数据// 加锁解锁操作// 同步锁import ("sync""fmt")// 创建Once结构var once = sync.Once{}func computed(data *int, lock *sync.Mut...

304158 ⋅ 36分钟前 ⋅ 0

Mobx入门之二:asynchronous actions

这一节主要看mobx怎么实现asynchronous actions 1 要实现的demo功能 输入地名,查询天气,利用openweathermap api 2 思想 observable观察数据:location地点、temperature温度 observer响应式...

pengqinmm ⋅ 38分钟前 ⋅ 0

【2018.0620学习笔记】【linux高级知识 13.4-13.6】

13.4 mysql用户管理 创建用户并授权: grant all on *.* to '用户名'@'ip' identified by '密码' //all是操作权限,*.*是库.表,指定格式是'用户名'@'localhost'才能用socket登录本地 gra...

lgsxp ⋅ 今天 ⋅ 0

Java强弱引用示例

package jdk;import java.lang.ref.PhantomReference;import java.lang.ref.ReferenceQueue;import java.lang.ref.SoftReference;import java.lang.ref.WeakReference;public ......

月下狼 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部