安卓当中自己处理图片的一些方法

package com.m520it.www.androidimagetest;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.LinearGradient;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.graphics.Rect;
import android.graphics.RectF;
import android.graphics.Shader;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.widget.Toast;

import java.io.BufferedOutputStream;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;

/**

  • @author 乔石
  • @time 2016/8/20 19:33
  • @desc ${TODD}
    */
    public class ImageUtil {
    // 这是安卓当中处理图片的一个工具类
public static Bitmap compassBitmap(Bitmap bitmap, int size) {
    /*实现图片压缩的到固指定大小内的一个方法*/
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);//质量压缩发100代表没有进行压缩
    int options = 100;
    while (baos.toByteArray().length / 1024 > size) {
        //判断当前的图片是否否和压缩的标准大小  不符合继续压缩
        baos.reset();//清空
        bitmap.compress(Bitmap.CompressFormat.JPEG, options, baos);//这里是压缩到options% 将压缩后的数据放置到baos里面
        options -= 5;//每次压缩质量渐5
    }
    ByteArrayInputStream inputStream = new ByteArrayInputStream(baos.toByteArray());//将压缩后得到的数据放置到响应的输入流里面
    //生成想要的大小的图片并且返回
    Bitmap bitmap1 = BitmapFactory.decodeStream(inputStream, null, null);
    return bitmap1;
}


public Bitmap covertGeryImg(Bitmap img, int redsize, int greensize, int bluesize) {
    /*根据红绿蓝所占的比例合理的构建一张灰度的图像*/
    int width = img.getWidth();//获取到位图的宽和高
    int height = img.getHeight();

    /*通过位图的大小我们需要创建像素点的数组*/
    int[] pixels = new int[width * height];
    img.getPixels(pixels, 0, width, 0, 0, width, height);//pixels是用来接收的数组  0开始写到数组的啥位置 第三个值必须大于或者等于width 开始读的位置  读多少行和列
    int alpha = 0xFF << 24;
    for (int i = 0; i < height; i++) {
        for (int j = 0; j < width; j++) {
            int grey = pixels[width * i + j];
            int red = ((grey & 0x00ff0000) >> 16);
            int green = ((grey & 0x00ff0000) >> 8);
            int blue = ((grey & 0x00ff0000));
            grey = (int) ((float) red * redsize + (float) green * greensize + (float) blue * bluesize);
            grey = alpha | (grey << 16) | (grey << 8) | grey;//构建了一个32位的图像   透明度是8位  红绿蓝的话各占8位
            pixels[width * i + j] = grey;
        }
    }
    Bitmap result = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);
    return result;
}

public Bitmap getMirrorImage(Bitmap image_src, int mirrorType) {
    /*实现了水平镜像  垂直镜像  90度 180度  270度 360度的旋转*/
    final int VeticalMirror = 1;
    final int HroitalMirror = 2;
    final int RotationMirror90 = 3;
    final int RotationMirror180 = 4;
    final int RotationMirror270 = 5;
    final int RotationMirror360 = 6;
    int width = image_src.getWidth();
    int height = image_src.getHeight();
    Bitmap result = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
    Canvas cv = new Canvas(result);
    Matrix matrix = new Matrix();
    switch (mirrorType) {
        case VeticalMirror:
            matrix.postScale(1, -1);
            break;
        case HroitalMirror:
            matrix.postScale(-1, 1);
            break;
        case RotationMirror90:
            matrix.postRotate(90);
            break;
        case RotationMirror180:
            matrix.postRotate(180);
            break;
        case RotationMirror270:
            matrix.postRotate(270);
            break;
        case RotationMirror360:
            matrix.postRotate(360);
            break;
        default:
            break;
    }
    Bitmap newbitmap = Bitmap.createBitmap(image_src, 0, 0, width, height, matrix, true);
    cv.drawBitmap(newbitmap, new Rect(0, 0, newbitmap.getWidth(), newbitmap.getHeight()), new Rect(0, 0, width, height), null);
    return result;
}


public Bitmap getScaleBitmapByUrl(String url, int width, int height) {
    /*通过URL生成图片并且按照一定的要求进行缩放*/
    /*通过url获取生成位图*/
    URL mFileUrl = null;
    Bitmap bitmap = null;
    try {
        mFileUrl = new URL(url);
    } catch (MalformedURLException e) {
        e.printStackTrace();
    }
    try {
        HttpURLConnection conn = (HttpURLConnection) mFileUrl.openConnection();
        conn.setDoInput(true);
        conn.connect();
        InputStream inputStream = conn.getInputStream();
        Bitmap bitmap1 = BitmapFactory.decodeStream(inputStream);
        inputStream.close();
    } catch (IOException e) {
        e.printStackTrace();
    }

    /*对相应的位图进行缩放*/
    int getwidth = bitmap.getWidth();
    int getheight = bitmap.getHeight();
    float scalewidth = ((float) getwidth / width);
    float scaleheight = ((float) getheight / height);

    Matrix matrix = new Matrix();
    matrix.postScale(scalewidth, scaleheight);
    //生成新的位图
    Bitmap resizeBitmap = Bitmap.createBitmap(bitmap, 0, 0, width, height, matrix, true);
    return resizeBitmap;
}


public static  Bitmap getBitmaopFromSrc(Context context,int bitAdress){
    //方便实现从资源文件中加载图片的方法
    Bitmap bitmap=null;
    bitmap=BitmapFactory.decodeResource(context.getResources(),bitAdress);
    return  bitmap;
}

public  final  void cuteImage(Canvas cav, Paint paint,Bitmap imgBit,int x,
                              int y,int w,int h,int line,int row){
    /*从图片中截取其中的一部分为一个新的图片*/
    cav.clipRect(x,y,x+2,y+h);
    cav.drawBitmap(imgBit,x-line*w,y-row*h,paint);
    cav.restore();
}

public  static  Bitmap setImageAlpha(Bitmap sourceImg,int number){
    /*获取到指定的透明度的图片*/
    int[] argb=new int[sourceImg.getWidth()*sourceImg.getHeight()];
    sourceImg.getPixels(argb,0,sourceImg.getWidth(),0,0,sourceImg.getWidth(),sourceImg.getHeight());//获取源图片的像素存储到指定的数组里面里
    number=number*255/100;
    for (int i=0;i<argb.length;i++){
        argb[i]=((number << 24)|(argb[i] & 0x00FFFFFF));//修改最高两位的值  因为最高两位就是透明度
    }
    sourceImg=Bitmap.createBitmap(argb,sourceImg.getWidth(),sourceImg.getHeight(), Bitmap.Config.ARGB_8888);
    return sourceImg;
}


    public  static  Bitmap getRoundConerBitmap(Bitmap bitmap,float roundPx){
        /*传入一张位图图像  并且传入圆角的半径的大小  构建一张圆角的图片*/
        Bitmap output=Bitmap.createBitmap(bitmap.getWidth(),bitmap.getHeight(), Bitmap.Config.ARGB_8888);
        Canvas cav=new Canvas(output);
        final  int color=0xff424242;
        final Paint paint=new Paint();
        final Rect rect=new Rect(0,0,bitmap.getWidth(),bitmap.getHeight());
        final  RectF rectf=new RectF(rect);
        paint.setAntiAlias(true);//设置刚锯齿的一种方式
        cav.drawARGB(0,0,0,0);
        paint.setColor(color);
        cav.drawRoundRect(rectf,roundPx,roundPx,paint);
        paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
        cav.drawBitmap(bitmap,rect,rect,paint);
        return output;
    }

public static Bitmap createRefelctionBitmapWithOriginBitmap(Bitmap bitmap){
/传入位图图像 构建倒影/
final int reflectionGap=4;
int width=bitmap.getWidth();
int height=bitmap.getHeight();
Matrix matrix=new Matrix();//构建我们的变换变换矩阵
matrix.preScale(1,-1);
Bitmap reflectionImage=Bitmap.createBitmap(bitmap,0,height/2,width,height/2,matrix,false);
Bitmap bitmapWithReflection=Bitmap.createBitmap(width,(height+height/2), Bitmap.Config.ARGB_8888);
Canvas cav=new Canvas(bitmapWithReflection);
cav.drawBitmap(bitmap,0,0,null);
Paint defaultPaint=new Paint();
cav.drawRect(0,height,width,height+reflectionGap,defaultPaint);
cav.drawBitmap(reflectionImage,0,height+reflectionGap,null);
Paint paint=new Paint();
LinearGradient shader=new LinearGradient(0,bitmap.getHeight(),0,bitmap.getHeight()+reflectionGap,0x70ffffff,0x00ffffff, Shader.TileMode.CLAMP);
paint.setShader(shader);
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));
cav.drawRect(0,height,width,bitmapWithReflection.getHeight()+reflectionGap,paint);
return bitmapWithReflection;
}

private  Bitmap createWaterMaskImage(Context getContext,Bitmap src,Bitmap watermark){
    /*利用原图和水印标志生成水印图片*/
    if(src==null) {
        return null;
    }
    int width=src.getWidth();
    int height=src.getHeight();
    int markwidth=watermark.getWidth();
    int markheight=watermark.getHeight();
    Bitmap newbitmap=Bitmap.createBitmap(width,height, Bitmap.Config.ARGB_8888);//创建新的位图图像用来承载要返回的位图
    Canvas cv=new Canvas(newbitmap);
    //将原图画入新的位图图像当中
    cv.drawBitmap(src,0,0,null);
    //在新位图图像的右下角画入水印图像标志
    cv.drawBitmap(watermark,20,20,null);
    cv.save(Canvas.ALL_SAVE_FLAG);
    cv.restore();
    return newbitmap;
}

 public  Bitmap drwaTextToBitmap(Context gcontext,int gResId,String gText){
     /*为我们的图片添加文字水印*/
     Resources resources = gcontext.getResources();
     float density = resources.getDisplayMetrics().density;
     Bitmap bitmap=BitmapFactory.decodeResource(resources,gResId);
     Matrix matrix=new Matrix();
     matrix.postScale(300*density,300*density);
     Bitmap newbitmap=Bitmap.createBitmap(bitmap,0,0,bitmap.getWidth(),bitmap.getHeight(),matrix,true);
     Canvas cav=new Canvas(bitmap);
     Paint paint=new Paint(Paint.ANTI_ALIAS_FLAG);//消除锯齿
     paint.setColor(Color.RED);
     paint.setTextSize((int)(18*density));
     paint.setDither(true);//获取清晰的图片采样
     paint.setFilterBitmap(true);//过滤一些
     Rect bounds=new Rect();
     paint.getTextBounds(gText,0,gText.length(),bounds);
     int x=30;int y=30;
     cav.drawText(gText,x*density,y*density,paint);
     return bitmap;
 }

/--------------------------------------调用系统的相机或者相册获取图片--------------------------------/
public static void getImageFormAlbum(Activity ac,int actionCode){
// //利用Intent调用系统的相册
// Intent intent=new Intent(Intent.ACTION_PICK);
// intent.setType("image/");//相片类型
// ac.startActivityForResult(intent,actionCode);
}
public static void openCamer(Activity ac,int actionCode){
// /
开启相机*/
//
// //Intent getImageByCamera = new Intent(“Android.media.action.IMAGE_CAPTURE”); 获取高清大图时候使用
// ac.startActivityForResult(getImageByCamera,actionCode);
String state = Environment.getExternalStorageState();
if (state.equals(Environment.MEDIA_MOUNTED)) {
Intent getImageByCamera = new Intent("android.media.action.IMAGE_CAPTURE");
// Intent getImageByCamera=new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
//获取保存的路径
//给成员变量赋值
File sdDir=null;
boolean sdCardExist=Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED);
if(sdCardExist) {
sdDir=Environment.getExternalStorageDirectory();
}
String capturePath = sdDir + "/" + System.currentTimeMillis() + ".jpg";
if (!sdDir.exists()) {
sdDir.mkdirs();
}

         getImageByCamera.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(capturePath)));
         getImageByCamera.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1);
         ac.startActivityForResult(getImageByCamera, actionCode);
     } else {
         Toast.makeText(ac.getApplicationContext(), "请确认已经插入SD卡", Toast.LENGTH_LONG).show();
     }
 }
/**
 * 获取存储路径,可以写在FileUtils中
 */
public String getSDPath() {
    File sdDir = null;
    boolean sdCardExist = Environment.getExternalStorageState()
            .equals(android.os.Environment.MEDIA_MOUNTED);//判断sd卡是否存在
    if (sdCardExist) {
        sdDir = Environment.getExternalStorageDirectory();//获取跟目录
    }
    return sdDir.toString();
}

 public static void doActivityResult(Activity ac,int requestcode,int resultCode,Intent data,String spath) {
     //拿去从相机返回的相片
 Uri uri=data.getData();
     if(uri==null) {
         Bundle bundle=data.getExtras();
         if(bundle!=null) {
             Bitmap photo=(Bitmap) bundle.get("data");
             saveImage(photo,spath);
         }else {
             Toast.makeText(ac.getApplicationContext(), "err", Toast.LENGTH_SHORT).show();
         }
     }
 }
public  static boolean saveImage(Bitmap bitmap,String spath){
    try {
        /*将获取到的图片保存在指定的位置*/
        BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream(spath,false));
        bitmap.compress(Bitmap.CompressFormat.JPEG,100,bos);
        bos.flush();
        bos.close();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
        return false;
    } catch (IOException e) {
        e.printStackTrace();
        return false;
    }
    return true;
}

/--------------------------------------调用系统的相机或者相册获取图片--------------------------------/

public  static  Bitmap getCircleImage(Bitmap resource,int min){
    /*该方法传入一张普通图片 生成一张固定大小的 原形图片*/
    final Paint paint=new Paint();
    paint.setAntiAlias(true);//设置抗锯齿的效果
    Bitmap target=Bitmap.createBitmap(min,min, Bitmap.Config.ARGB_8888);
    /*产生一个同样大小的画布*/
    Canvas cav=new Canvas(target);
    /*首先绘制原形*/
    cav.drawCircle(min/2,min/2,min/2,paint);
    /*设置SRC_IN模式*/
    paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));
    /*绘制图片*/
    cav.drawBitmap(resource,0,0,paint);
    return target;
}


public Bitmap add2Bitmap(Bitmap first, ArrayList<Bitmap>  Bitmaps) {
    /*实现多张图片的顺序拼接图片实现拼接*/
    int width =first.getWidth();
    int height = first.getHeight();
    for(int i=0;i<Bitmaps.size();i++){
        width+=Bitmaps.get(i).getWidth();
        height=Math.max(height,Bitmaps.get(i).getHeight());
    }
    Bitmap result = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
    Canvas canvas = new Canvas(result);
    canvas.drawBitmap(first, 0, 0, null);
    int startwidth=first.getWidth();
    for (int i=0;i<Bitmaps.size();i++){
        canvas.drawBitmap(Bitmaps.get(i), startwidth, 0, null);
        startwidth+=Bitmaps.get(i).getWidth();
    }
    return result;
}

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 162,306评论 4 370
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,657评论 2 307
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 111,928评论 0 254
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,688评论 0 220
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 53,105评论 3 295
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 41,024评论 1 225
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,159评论 2 318
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,937评论 0 212
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,689评论 1 250
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,851评论 2 254
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,325评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,651评论 3 263
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,364评论 3 244
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,192评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,985评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,154评论 2 285
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,955评论 2 279

推荐阅读更多精彩内容

  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 6,219评论 0 17
  • ¥开启¥ 【加群QQ聊天源码】 〖2017-08-25 15:24:36〗 《import "android.ne...
    小菜c阅读 4,166评论 0 5
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 170,598评论 25 707
  • 山不见了,云不见了; 花不见了,树不见了! 睁眼闭眼都一样了! 天黑了,孩子睡了; 狗眠了,老牛开始打鼾了! 诗人...
    繁星如梦阅读 79评论 0 2
  • 思路: 1.设置友盟推送相关内容 // 友盟推送相关内容设置 - (void)setUMengPushMessag...
    崔又淇阅读 6,009评论 0 3