美文网首页
bitmaputil

bitmaputil

作者: echoSuny | 来源:发表于2019-01-04 10:59 被阅读0次

@SuppressWarnings({"WeakerAccess","unused"})

public class BitmapUtil {

private static final StringTAG = BitmapUtil.class.getSimpleName();

/**

* convert Bitmap to byte array

*/

    public static byte[] bitmapToByte(Bitmap b) {

ByteArrayOutputStream o =new ByteArrayOutputStream();

b.compress(Bitmap.CompressFormat.PNG,100, o);

return o.toByteArray();

}

/**

* convert byte array to Bitmap

*/

    public static Bitmap byteToBitmap(byte[] b) {

return (b ==null || b.length ==0) ?null : BitmapFactory.decodeByteArray(b,0, b.length);

}

/**

* 把bitmap转换成Base64编码String

*/

    public static String bitmapToString(Bitmap bitmap) {

return Base64.encodeToString(bitmapToByte(bitmap), Base64.DEFAULT);

}

/**

* convert Drawable to Bitmap

*/

    public static Bitmap drawableToBitmap(Drawable drawable) {

return drawable ==null ?null : ((BitmapDrawable) drawable).getBitmap();

}

/**

* convert Bitmap to Drawable

*/

    public static Drawable bitmapToDrawable(Bitmap bitmap) {

return bitmap ==null ?null :new BitmapDrawable(bitmap);

}

/**

* scale image

*/

    public static Bitmap scaleImageTo(Bitmap org,int newWidth,int newHeight) {

return scaleImage(org, (float) newWidth / org.getWidth(), (float) newHeight / org.getHeight());

}

/**

* scale image

*/

    public static Bitmap scaleImage(Bitmap org,float scaleWidth,float scaleHeight) {

if (org ==null) {

return null;

}

Matrix matrix =new Matrix();

matrix.postScale(scaleWidth, scaleHeight);

return Bitmap.createBitmap(org,0,0, org.getWidth(), org.getHeight(), matrix,true);

}

public static Bitmap toRoundCorner(Bitmap bitmap) {

int height = bitmap.getHeight();

int width = bitmap.getHeight();

Bitmap output = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);

Canvas canvas =new Canvas(output);

final Paint paint =new Paint();

final Rect rect =new Rect(0,0, width, height);

paint.setAntiAlias(true);

canvas.drawARGB(0,0,0,0);

// paint.setColor(0xff424242);

        paint.setColor(Color.TRANSPARENT);

canvas.drawCircle(width /2, height /2, width /2, paint);

paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));

canvas.drawBitmap(bitmap, rect, rect, paint);

return output;

}

public static Bitmap createBitmapThumbnail(Bitmap bitMap,boolean needRecycle,int newHeight,int newWidth) {

int width = bitMap.getWidth();

int height = bitMap.getHeight();

// 计算缩放比例

        float scaleWidth = ((float) newWidth) / width;

float scaleHeight = ((float) newHeight) / height;

// 取得想要缩放的matrix参数

        Matrix matrix =new Matrix();

matrix.postScale(scaleWidth, scaleHeight);

// 得到新的图片

        Bitmap newBitMap = Bitmap.createBitmap(bitMap,0,0, width, height, matrix,true);

if (needRecycle)

bitMap.recycle();

return newBitMap;

}

public static boolean saveBitmap(Bitmap bitmap, File file) {

if (bitmap ==null)

return false;

FileOutputStream fos =null;

try {

fos =new FileOutputStream(file);

bitmap.compress(Bitmap.CompressFormat.PNG,100, fos);

fos.flush();

return true;

}catch (Exception e) {

e.printStackTrace();

}finally {

if (fos !=null) {

try {

fos.close();

}catch (IOException e) {

e.printStackTrace();

}

}

}

return false;

}

public static boolean saveBitmap(Bitmap bitmap, String absPath) {

return saveBitmap(bitmap,new File(absPath));

}

public static Intent buildImageGetIntent(Uri saveTo,int outputX,int outputY,boolean returnData) {

return buildImageGetIntent(saveTo,1,1, outputX, outputY, returnData);

}

public static Intent buildImageGetIntent(Uri saveTo,int aspectX,int aspectY,int outputX,int outputY,

boolean returnData) {

Log.i(TAG,"Build.VERSION.SDK_INT : " + Build.VERSION.SDK_INT);

Intent intent =new Intent();

if (Build.VERSION.SDK_INT <19) {

intent.setAction(Intent.ACTION_GET_CONTENT);

}else {

intent.setAction(Intent.ACTION_OPEN_DOCUMENT);

intent.addCategory(Intent.CATEGORY_OPENABLE);

}

intent.setType("image/*");

intent.putExtra("output", saveTo);

intent.putExtra("aspectX", aspectX);

intent.putExtra("aspectY", aspectY);

intent.putExtra("outputX", outputX);

intent.putExtra("outputY", outputY);

intent.putExtra("scale",true);

intent.putExtra("return-data", returnData);

intent.putExtra("outputFormat", Bitmap.CompressFormat.PNG.toString());

return intent;

}

public static Intent buildImageCropIntent(Uri uriFrom, Uri uriTo,int outputX,int outputY,boolean returnData) {

return buildImageCropIntent(uriFrom, uriTo,1,1, outputX, outputY, returnData);

}

public static Intent buildImageCropIntent(Uri uriFrom, Uri uriTo,int aspectX,int aspectY,int outputX,

int outputY,boolean returnData) {

Intent intent =new Intent("com.android.camera.action.CROP");

intent.setDataAndType(uriFrom,"image/*");

intent.putExtra("crop","true");

intent.putExtra("output", uriTo);

intent.putExtra("aspectX", aspectX);

intent.putExtra("aspectY", aspectY);

intent.putExtra("outputX", outputX);

intent.putExtra("outputY", outputY);

intent.putExtra("scale",true);

intent.putExtra("return-data", returnData);

intent.putExtra("outputFormat", Bitmap.CompressFormat.PNG.toString());

return intent;

}

public static Intent buildImageCaptureIntent(Uri uri) {

Intent intent =new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);

return intent;

}

public static int calculateInSampleSize(BitmapFactory.Options options,int reqWidth,int reqHeight) {

int h = options.outHeight;

int w = options.outWidth;

int inSampleSize =0;

if (h > reqHeight || w > reqWidth) {

float ratioW = (float) w / reqWidth;

float ratioH = (float) h / reqHeight;

inSampleSize = (int) Math.min(ratioH, ratioW);

}

inSampleSize = Math.max(1, inSampleSize);

return inSampleSize;

}

public static Bitmap getSmallBitmap(String filePath,int reqWidth,int reqHeight) {

BitmapFactory.Options options =new BitmapFactory.Options();

options.inJustDecodeBounds =true;

BitmapFactory.decodeFile(filePath, options);

options.inSampleSize =calculateInSampleSize(options, reqWidth, reqHeight);

options.inJustDecodeBounds =false;

return BitmapFactory.decodeFile(filePath, options);

}

public static byte[] compressBitmapToBytes(String filePath,int reqWidth,int reqHeight,int quality) {

Logs.i("ImageTest","02-start getSmallBitmap : " + System.currentTimeMillis());

Bitmap bitmap =getSmallBitmap(filePath, reqWidth, reqHeight);

Logs.i("ImageTest","03-start rotateBitmapByDegree : " + System.currentTimeMillis());

//根据图片的角度信息,旋转图片。否则,在三星手机上,拍照的图片,是横的

        int imgDegree =getPictureDegree(filePath);

if (imgDegree !=0) {

bitmap =rotateBitmapByDegree(bitmap, imgDegree);

}

Logs.i("ImageTest","04-start compress : " + System.currentTimeMillis());

if (null != bitmap) {

final ByteArrayOutputStream baos =new ByteArrayOutputStream();

bitmap.compress(Bitmap.CompressFormat.JPEG, quality, baos);

Logs.i("ImageTest","05-end compress : " + System.currentTimeMillis());

byte[] bytes = baos.toByteArray();

Logs.i("ImageTest","06-start recycle : " + System.currentTimeMillis());

if (!bitmap.isRecycled()) {

bitmap.recycle();

}

try {

baos.close();

}catch (IOException e) {

e.printStackTrace();

}

Logs.i("ImageTest","07-end recycle : " + System.currentTimeMillis());

return bytes;

}

return null;

}

public byte[] compressBitmapSmallTo(String filePath,int reqWidth,int reqHeight,int maxLenth) {

int quality =100;

byte[] bytes =compressBitmapToBytes(filePath, reqWidth, reqHeight, quality);

while (null != bytes && bytes.length > maxLenth && quality >0) {

quality = quality /2;

bytes =compressBitmapToBytes(filePath, reqWidth, reqHeight, quality);

}

return bytes;

}

public byte[] compressBitmapQuikly(String filePath) {

return compressBitmapToBytes(filePath,480,800,50);

}

public byte[] compressBitmapQuiklySmallTo(String filePath,int maxLenth) {

return compressBitmapSmallTo(filePath,480,800, maxLenth);

}

/**

* 读取图片属性:旋转的角度

    * @param path 图片绝对路径

    * @return degree旋转的角度

    * @author yangrui09

*/

    public static int getPictureDegree(String path) {

if (TextUtils.isEmpty(path))

return 0;

int degree =0;

try {

ExifInterface exifInterface =new ExifInterface(path);

int orientation = exifInterface.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL);

switch (orientation) {

case ExifInterface.ORIENTATION_ROTATE_90:

degree =90;

break;

case ExifInterface.ORIENTATION_ROTATE_180:

degree =180;

break;

case ExifInterface.ORIENTATION_ROTATE_270:

degree =270;

break;

}

}catch (Exception e) {

e.printStackTrace();

}

return degree;

}

/**

* 将图片按照某个角度进行旋转

*

    * @param bm    需要旋转的图片

    * @param degree 旋转角度

    * @return 旋转后的图片

*/

    public static Bitmap rotateBitmapByDegree(Bitmap bm,int degree) {

if (null == bm) {

return null;

}

Bitmap returnBm =null;

// 根据旋转角度,生成旋转矩阵

        Matrix matrix =new Matrix();

matrix.postRotate(degree);

try {

// 将原始图片按照旋转矩阵进行旋转,并得到新的图片

            returnBm = Bitmap.createBitmap(bm,0,0, bm.getWidth(), bm.getHeight(), matrix,true);

}catch (OutOfMemoryError e) {

}

if (returnBm ==null) {

returnBm = bm;

}

if (bm != returnBm) {

bm.recycle();

}

return returnBm;

}

}

相关文章

网友评论

      本文标题:bitmaputil

      本文链接:https://www.haomeiwen.com/subject/farhrqtx.html