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 {
// 這是安卓當(dāng)中處理圖片的一個(gè)工具類(lèi)
public static Bitmap compassBitmap(Bitmap bitmap, int size) {
/*實(shí)現(xiàn)圖片壓縮的到固指定大小內(nèi)的一個(gè)方法*/
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);//質(zhì)量壓縮發(fā)100代表沒(méi)有進(jìn)行壓縮
int options = 100;
while (baos.toByteArray().length / 1024 > size) {
//判斷當(dāng)前的圖片是否否和壓縮的標(biāo)準(zhǔn)大小 不符合繼續(xù)壓縮
baos.reset();//清空
bitmap.compress(Bitmap.CompressFormat.JPEG, options, baos);//這里是壓縮到options% 將壓縮后的數(shù)據(jù)放置到baos里面
options -= 5;//每次壓縮質(zhì)量漸5
}
ByteArrayInputStream inputStream = new ByteArrayInputStream(baos.toByteArray());//將壓縮后得到的數(shù)據(jù)放置到響應(yīng)的輸入流里面
//生成想要的大小的圖片并且返回
Bitmap bitmap1 = BitmapFactory.decodeStream(inputStream, null, null);
return bitmap1;
}
public Bitmap covertGeryImg(Bitmap img, int redsize, int greensize, int bluesize) {
/*根據(jù)紅綠藍(lán)所占的比例合理的構(gòu)建一張灰度的圖像*/
int width = img.getWidth();//獲取到位圖的寬和高
int height = img.getHeight();
/*通過(guò)位圖的大小我們需要?jiǎng)?chuàng)建像素點(diǎn)的數(shù)組*/
int[] pixels = new int[width * height];
img.getPixels(pixels, 0, width, 0, 0, width, height);//pixels是用來(lái)接收的數(shù)組 0開(kāi)始寫(xiě)到數(shù)組的啥位置 第三個(gè)值必須大于或者等于width 開(kāi)始讀的位置 讀多少行和列
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;//構(gòu)建了一個(gè)32位的圖像 透明度是8位 紅綠藍(lán)的話(huà)各占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) {
/*實(shí)現(xiàn)了水平鏡像 垂直鏡像 90度 180度 270度 360度的旋轉(zhuǎn)*/
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) {
/*通過(guò)URL生成圖片并且按照一定的要求進(jìn)行縮放*/
/*通過(guò)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();
}
/*對(duì)相應(yīng)的位圖進(jìn)行縮放*/
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){
//方便實(shí)現(xiàn)從資源文件中加載圖片的方法
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){
/*從圖片中截取其中的一部分為一個(gè)新的圖片*/
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());//獲取源圖片的像素存儲(chǔ)到指定的數(shù)組里面里
number=number*255/100;
for (int i=0;i<argb.length;i++){
argb[i]=((number << 24)|(argb[i] & 0x00FFFFFF));//修改最高兩位的值 因?yàn)樽罡邇晌痪褪峭该鞫? }
sourceImg=Bitmap.createBitmap(argb,sourceImg.getWidth(),sourceImg.getHeight(), Bitmap.Config.ARGB_8888);
return sourceImg;
}
public static Bitmap getRoundConerBitmap(Bitmap bitmap,float roundPx){
/*傳入一張位圖圖像 并且傳入圓角的半徑的大小 構(gòu)建一張圓角的圖片*/
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);//設(shè)置剛鋸齒的一種方式
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){
/傳入位圖圖像 構(gòu)建倒影/
final int reflectionGap=4;
int width=bitmap.getWidth();
int height=bitmap.getHeight();
Matrix matrix=new Matrix();//構(gòu)建我們的變換變換矩陣
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){
/*利用原圖和水印標(biāo)志生成水印圖片*/
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);//創(chuàng)建新的位圖圖像用來(lái)承載要返回的位圖
Canvas cv=new Canvas(newbitmap);
//將原圖畫(huà)入新的位圖圖像當(dāng)中
cv.drawBitmap(src,0,0,null);
//在新位圖圖像的右下角畫(huà)入水印圖像標(biāo)志
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);//過(guò)濾一些
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;
}
/--------------------------------------調(diào)用系統(tǒng)的相機(jī)或者相冊(cè)獲取圖片--------------------------------/
public static void getImageFormAlbum(Activity ac,int actionCode){
// //利用Intent調(diào)用系統(tǒng)的相冊(cè)
// Intent intent=new Intent(Intent.ACTION_PICK);
// intent.setType("image/");//相片類(lèi)型
// ac.startActivityForResult(intent,actionCode);
}
public static void openCamer(Activity ac,int actionCode){
// /開(kāi)啟相機(jī)*/
//
// //Intent getImageByCamera = new Intent(“Android.media.action.IMAGE_CAPTURE”); 獲取高清大圖時(shí)候使用
// 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(), "請(qǐng)確認(rèn)已經(jīng)插入SD卡", Toast.LENGTH_LONG).show();
}
}
/**
* 獲取存儲(chǔ)路徑,可以寫(xiě)在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) {
//拿去從相機(jī)返回的相片
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;
}
/--------------------------------------調(diào)用系統(tǒng)的相機(jī)或者相冊(cè)獲取圖片--------------------------------/
public static Bitmap getCircleImage(Bitmap resource,int min){
/*該方法傳入一張普通圖片 生成一張固定大小的 原形圖片*/
final Paint paint=new Paint();
paint.setAntiAlias(true);//設(shè)置抗鋸齒的效果
Bitmap target=Bitmap.createBitmap(min,min, Bitmap.Config.ARGB_8888);
/*產(chǎn)生一個(gè)同樣大小的畫(huà)布*/
Canvas cav=new Canvas(target);
/*首先繪制原形*/
cav.drawCircle(min/2,min/2,min/2,paint);
/*設(shè)置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) {
/*實(shí)現(xiàn)多張圖片的順序拼接圖片實(shí)現(xiàn)拼接*/
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;
}
}