package com.jiuqi.njt.util; 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.text.SimpleDateFormat; import java.util.Date; import android.content.ContentResolver; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.graphics.Bitmap; import android.graphics.Bitmap.Config; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.LinearGradient; import android.graphics.Matrix; import android.graphics.Paint; import android.graphics.PixelFormat; import android.graphics.PorterDuff.Mode; import android.graphics.PorterDuffXfermode; import android.graphics.Rect; import android.graphics.RectF; import android.graphics.Shader.TileMode; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.media.ExifInterface; import android.net.Uri; import android.provider.MediaStore; import android.provider.MediaStore.Audio.Media; /** * * 图片操作工具类 * @author * */ public final class ImageTools { public static int computeSampleSize(BitmapFactory.Options options, int minSideLength, int maxNumOfPixels) { int initialSize = computeInitialSampleSize(options, minSideLength, maxNumOfPixels); int roundedSize; if (initialSize <= 8) { roundedSize = 1; while (roundedSize < initialSize) { roundedSize <<= 1; } } else { roundedSize = (initialSize + 7) / 8 * 8; } return roundedSize; } private static int computeInitialSampleSize(BitmapFactory.Options options, int minSideLength, int maxNumOfPixels) { double w = options.outWidth; double h = options.outHeight; int lowerBound = (maxNumOfPixels == -1) ? 1 : (int) Math.ceil(Math .sqrt(w * h / maxNumOfPixels)); int upperBound = (minSideLength == -1) ? 128 : (int) Math.min( Math.floor(w / minSideLength), Math.floor(h / minSideLength)); if (upperBound < lowerBound) { return lowerBound; } if ((maxNumOfPixels == -1) && (minSideLength == -1)) { return 1; } else if (minSideLength == -1) { return lowerBound; } else { return upperBound; } } /** * Transfer drawable to bitmap * * @param drawable * @return */ public static Bitmap drawableToBitmap(Drawable drawable) { int w = drawable.getIntrinsicWidth(); int h = drawable.getIntrinsicHeight(); Bitmap.Config config = drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888 : Bitmap.Config.RGB_565; Bitmap bitmap = Bitmap.createBitmap(w, h, config); Canvas canvas = new Canvas(bitmap); drawable.setBounds(0, 0, w, h); drawable.draw(canvas); return bitmap; } /** * Bitmap to drawable * * @param bitmap * @return */ public static Drawable bitmapToDrawable(Bitmap bitmap) { return new BitmapDrawable(bitmap); } /** * Input stream to bitmap * * @param inputStream * @return * @throws Exception */ public static Bitmap inputStreamToBitmap(InputStream inputStream) throws Exception { return BitmapFactory.decodeStream(inputStream); } /** * Byte transfer to bitmap * * @param byteArray * @return */ public static Bitmap byteToBitmap(byte[] byteArray) { if (byteArray != null && byteArray.length != 0) { return BitmapFactory .decodeByteArray(byteArray, 0, byteArray.length); } else { return null; } } /** * Byte transfer to drawable * * @param byteArray * @return */ public static Drawable byteToDrawable(byte[] byteArray) { ByteArrayInputStream ins = null; if (byteArray != null) { ins = new ByteArrayInputStream(byteArray); } return Drawable.createFromStream(ins, null); } /** * Bitmap transfer to bytes * * @param byteArray * @return */ public static byte[] bitmapToBytes(Bitmap bm) { byte[] bytes = null; if (bm != null) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); bm.compress(Bitmap.CompressFormat.PNG, 100, baos); bytes = baos.toByteArray(); } return bytes; } /** * Drawable transfer to bytes * * @param drawable * @return */ public static byte[] drawableToBytes(Drawable drawable) { BitmapDrawable bitmapDrawable = (BitmapDrawable) drawable; Bitmap bitmap = bitmapDrawable.getBitmap(); byte[] bytes = bitmapToBytes(bitmap); ; return bytes; } /** * Base64 to byte[] // */ // public static byte[] base64ToBytes(String base64) throws IOException { // byte[] bytes = Base64.decode(base64); // return bytes; // } // // /** // * Byte[] to base64 // */ // public static String bytesTobase64(byte[] bytes) { // String base64 = Base64.encode(bytes); // return base64; // } /** * Create reflection images * * @param bitmap * @return */ public static Bitmap createReflectionImageWithOrigin(Bitmap bitmap) { final int reflectionGap = 4; int w = bitmap.getWidth(); int h = bitmap.getHeight(); Matrix matrix = new Matrix(); matrix.preScale(1, -1); Bitmap reflectionImage = Bitmap.createBitmap(bitmap, 0, h / 2, w, h / 2, matrix, false); Bitmap bitmapWithReflection = Bitmap.createBitmap(w, (h + h / 2), Config.ARGB_8888); Canvas canvas = new Canvas(bitmapWithReflection); canvas.drawBitmap(bitmap, 0, 0, null); Paint deafalutPaint = new Paint(); canvas.drawRect(0, h, w, h + reflectionGap, deafalutPaint); canvas.drawBitmap(reflectionImage, 0, h + reflectionGap, null); Paint paint = new Paint(); LinearGradient shader = new LinearGradient(0, bitmap.getHeight(), 0, bitmapWithReflection.getHeight() + reflectionGap, 0x70ffffff, 0x00ffffff, TileMode.CLAMP); paint.setShader(shader); // Set the Transfer mode to be porter duff and destination in paint.setXfermode(new PorterDuffXfermode(Mode.DST_IN)); // Draw a rectangle using the paint with our linear gradient canvas.drawRect(0, h, w, bitmapWithReflection.getHeight() + reflectionGap, paint); return bitmapWithReflection; } /** * Get rounded corner images * * @param bitmap * @param roundPx * 5 10 * @return */ public static Bitmap getRoundedCornerBitmap(Bitmap bitmap, float roundPx) { int w = bitmap.getWidth(); int h = bitmap.getHeight(); Bitmap output = Bitmap.createBitmap(w, h, Config.ARGB_8888); Canvas canvas = new Canvas(output); final int color = 0xff424242; final Paint paint = new Paint(); final Rect rect = new Rect(0, 0, w, h); final RectF rectF = new RectF(rect); paint.setAntiAlias(true); canvas.drawARGB(0, 0, 0, 0); paint.setColor(color); canvas.drawRoundRect(rectF, roundPx, roundPx, paint); paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN)); canvas.drawBitmap(bitmap, rect, rect, paint); return output; } /** * Resize the bitmap * * @param bitmap * @param width * @param height * @return */ public static Bitmap zoomBitmap(Bitmap bitmap, int width, int height) { int w = bitmap.getWidth(); int h = bitmap.getHeight(); Matrix matrix = new Matrix(); float scaleWidth = ((float) width / w); float scaleHeight = ((float) height / h); matrix.postScale(scaleWidth, scaleHeight); Bitmap newbmp = Bitmap.createBitmap(bitmap, 0, 0, w, h, matrix, true); return newbmp; } /** * Resize the drawable * * @param drawable * @param w * @param h * @return */ public static Drawable zoomDrawable(Drawable drawable, int w, int h) { int width = drawable.getIntrinsicWidth(); int height = drawable.getIntrinsicHeight(); Bitmap oldbmp = drawableToBitmap(drawable); Matrix matrix = new Matrix(); float sx = ((float) w / width); float sy = ((float) h / height); matrix.postScale(sx, sy); Bitmap newbmp = Bitmap.createBitmap(oldbmp, 0, 0, width, height, matrix, true); return new BitmapDrawable(newbmp); } /** * Get images from SD card by path and the name of image * * @param photoName * @return */ public static Bitmap getPhotoFromSDCard(String path, String photoName) { Bitmap photoBitmap = BitmapFactory.decodeFile(path + "/" + photoName + ".png"); if (photoBitmap == null) { return null; } else { return photoBitmap; } } /** * Get images from SD card by path and the name of image * * @param photoName * @return */ public static Bitmap getPhotoFromSDCard(String pathName) { Bitmap photoBitmap = BitmapFactory.decodeFile(pathName); if (photoBitmap == null) { return null; } else { return photoBitmap; } } /** * * Description: 保存图片 Title: saveBitmap * * @param bitmap * @throws IOException * void */ public static String saveBitmap(Bitmap bitmap, Context context) throws IOException { String imagePath_new = "";// 图片保存路径 SimpleDateFormat timeStampFormat = new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss"); String filename = timeStampFormat.format(new Date()); ContentValues values = new ContentValues(); values.put(Media.TITLE, filename); Uri photoUri = context.getContentResolver().insert( MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values); imagePath_new = getRealPathFromURI(photoUri, context.getContentResolver()); File file = new File(imagePath_new); System.out.println("路径: " + imagePath_new); FileOutputStream out; try { out = new FileOutputStream(file); if (bitmap.compress(Bitmap.CompressFormat.JPEG, 80, out)) { out.flush(); out.close(); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } if (new File(imagePath_new).length() == 0) { // 判断图片是否保存 imagePath_new = ""; } return imagePath_new; } // 获得图片保存的路径 public static String getRealPathFromURI(Uri uri, ContentResolver resolver) { String[] proj = { MediaStore.Images.Media.DATA }; Cursor cursor = resolver.query(uri, proj, null, null, null); int column_index = cursor .getColumnIndexOrThrow(MediaStore.Images.Media.DATA); cursor.moveToFirst(); String str = cursor.getString(column_index); cursor.close(); return str; } /** * Check the SD card * * @return */ public static boolean checkSDCardAvailable() { return android.os.Environment.getExternalStorageState().equals( android.os.Environment.MEDIA_MOUNTED); } /** * Get image from SD card by path and the name of image * * @param fileName * @return */ public static boolean findPhotoFromSDCard(String path, String photoName) { boolean flag = false; if (checkSDCardAvailable()) { File dir = new File(path); if (dir.exists()) { File folders = new File(path); File photoFile[] = folders.listFiles(); for (int i = 0; i < photoFile.length; i++) { String fileName = photoFile[i].getName().split("\\.")[0]; if (fileName.equals(photoName)) { flag = true; } } } else { flag = false; } // File file = new File(path + "/" + photoName + ".jpg" ); // if (file.exists()) { // flag = true; // }else { // flag = false; // } } else { flag = false; } return flag; } /** * Save image to the SD card * * @param photoBitmap * @param photoName * @param path */ public static void savePhotoToSDCard(Bitmap photoBitmap, String path, String photoName) { if (checkSDCardAvailable()) { File dir = new File(path); if (!dir.exists()) { dir.mkdirs(); } File photoFile = new File(path, photoName); FileOutputStream fileOutputStream = null; try { fileOutputStream = new FileOutputStream(photoFile); if (photoBitmap != null) { if (photoBitmap.compress(Bitmap.CompressFormat.JPEG, 100, fileOutputStream)) { fileOutputStream.flush(); // fileOutputStream.close(); } } } catch (FileNotFoundException e) { photoFile.delete(); e.printStackTrace(); } catch (IOException e) { photoFile.delete(); e.printStackTrace(); } finally { try { fileOutputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } } /** * Delete the image from SD card * * @param context * @param path * file:///sdcard/temp.jpg */ public static void deleteAllPhoto(String path) { if (checkSDCardAvailable()) { File folder = new File(path); File[] files = folder.listFiles(); for (int i = 0; i < files.length; i++) { files[i].delete(); } } } public static void deletePhoto(String filePath) { File f = new File(filePath); // 输入要删除的文件位置 if (f.exists()) f.delete(); } public static void deletePhotoAtPathAndName(String path, String fileName) { if (checkSDCardAvailable()) { File folder = new File(path); File[] files = folder.listFiles(); for (int i = 0; i < files.length; i++) { if (files[i].getName().split("\\.")[0].equals(fileName)) { files[i].delete(); } } } } /** * 根据图片实际角度,旋转图片 * * @param photpath * 图片实际路径 * @param bm * 要旋转的图片 * @return */ public static Bitmap RotateBitmap(String photpath, Bitmap bm) { ExifInterface exifInterface = null; try { exifInterface = new ExifInterface(photpath); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); return null; } int tag = exifInterface.getAttributeInt(ExifInterface.TAG_ORIENTATION, -1); int degree = 0; if (tag == ExifInterface.ORIENTATION_ROTATE_90) { degree = 90; } else if (tag == ExifInterface.ORIENTATION_ROTATE_180) { degree = 180; } else if (tag == ExifInterface.ORIENTATION_ROTATE_270) { degree = 270; } return RotateBitmap(degree, bm); } /** * 根据输入旋转角度,旋转图片 * * @param degree * 旋转角度 * @param bm * 要旋转的图片 * @return */ public static Bitmap RotateBitmap(int degree, Bitmap bm) { Matrix m = new Matrix(); if (degree != 0 && bm != null) { m.setRotate(degree, (float) bm.getWidth() / 2, (float) bm.getHeight() / 2); } // 旋转图片 Bitmap bmp = Bitmap.createBitmap(bm, 0, 0, bm.getWidth(), bm.getHeight(), m, true); return bmp; } // Bitmap → byte[] public static byte[] Bitmap2Bytes(Bitmap bm) { if(bm==null){ return null; } ByteArrayOutputStream baos = new ByteArrayOutputStream(); bm.compress(Bitmap.CompressFormat.PNG, 100, baos); return baos.toByteArray(); } // byte[] → Bitmap public static Bitmap Bytes2Bimap(byte[] b) { if (b.length != 0) { return BitmapFactory.decodeByteArray(b, 0, b.length); } else { return null; } } }