Android工具类之Bitmap图片处理
2015-10-01 08:55
489 查看
/** * @author Guan * @file cn...utils * @date 2015/2016 * @Version 1.0 */ public class BitmapUtil { /** * 将图片存储到sdcard中 */ public static void storeImageToSDCARD(Bitmap bitmap, String imageName, String imageFilePath) { File file = new File(imageFilePath); if (!file.exists()) { file.mkdir(); } File imagefile = new File(file, imageName + ".jpg"); try { imagefile.createNewFile(); FileOutputStream fos = new FileOutputStream(imagefile); bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos); fos.flush(); fos.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } /** * 将图片存储到sdcard中,并插入到系统图库 */ public static boolean saveBitmap(Bitmap bitmap, String dir, String name, boolean isShowPhotos) { File path = new File(dir); if (!path.exists()) { path.mkdirs(); } File file = new File(path + "/" + name); if (file.exists()) { file.delete(); } if (!file.exists()) { try { file.createNewFile(); } catch (Exception e) { e.printStackTrace(); return false; } } else { return true; } FileOutputStream fileOutputStream = null; try { fileOutputStream = new FileOutputStream(file); bitmap.compress(Bitmap.CompressFormat.PNG, 100, fileOutputStream); fileOutputStream.flush(); } catch (Exception e) { e.printStackTrace(); return false; } finally { try { fileOutputStream.close(); } catch (Exception e) { e.printStackTrace(); } } // 其次把文件插入到系统图库 if (isShowPhotos) { try { MediaStore.Images.Media.insertImage(MyApplication.getIntstance().getContentResolver(), file.getAbsolutePath(), name, null); } catch (FileNotFoundException e) { e.printStackTrace(); } // 最后通知图库更新 MyApplication.getIntstance().sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse("file://" + file))); } return true; } /** * sdcard取图片 */ public static Bitmap getBitmapBySDCARD(String imageFilePath, String picName) { if (!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { return null; } try { File file = new File(imageFilePath, picName + ".jpg"); FileInputStream inputStream = new FileInputStream(file); byte[] b = new byte[inputStream.available()]; inputStream.read(b); Bitmap bitmap = BitmapFactory.decodeByteArray(b, 0, b.length); return bitmap; } catch (Exception e) { return null; } } /** * 以最省内存的方式读取本地资源的图片 */ public static Bitmap readBitmapById(Context context, int drawableId, int screenWidth, int screenHight) { BitmapFactory.Options options = new BitmapFactory.Options(); options.inPreferredConfig = Bitmap.Config.ARGB_8888; options.inInputShareable = true; options.inPurgeable = true; InputStream stream = context.getResources().openRawResource(drawableId); Bitmap bitmap = BitmapFactory.decodeStream(stream, null, options); return getBitmap(bitmap, screenWidth, screenHight); } /** * 等比例压缩图片 */ public static Bitmap getBitmap(Bitmap bitmap, int screenWidth, int screenHight) { int w = bitmap.getWidth(); int h = bitmap.getHeight(); Matrix matrix = new Matrix(); float scale = (float) screenWidth / w; float scale2 = (float) screenHight / h; //取比例小的值 可以把图片完全缩放在屏幕内 scale = scale < scale2 ? scale : scale2; // 都按照宽度scale 保证图片不变形.根据宽度来确定高度 matrix.postScale(scale, scale); // w,h是原图的属性. return Bitmap.createBitmap(bitmap, 0, 0, w, h, matrix, true); } /** * 将Drawable转为Bitmap */ public static Bitmap drawableToBitmap(Drawable drawable) { Bitmap bitmap = Bitmap .createBitmap( drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888 : Bitmap.Config.RGB_565); Canvas canvas = new Canvas(bitmap); // canvas.setBitmap(bitmap); drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight()); drawable.draw(canvas); return bitmap; } /** * 将Bitmap转为btye[] */ public static byte[] bmpToByteArray(final Bitmap bmp, final boolean needRecycle) { ByteArrayOutputStream output = new ByteArrayOutputStream(); bmp.compress(Bitmap.CompressFormat.JPEG, 80, output); if (needRecycle) { bmp.recycle(); } byte[] result = output.toByteArray(); try { output.close(); } catch (Exception e) { e.printStackTrace(); } return result; } /** * 网络取图片 getImage (inputStream –> byte –> bitmap)(最佳方法) */ public Bitmap getImage(String path) throws Exception { URL url = new URL(path); HttpURLConnection conn = (HttpURLConnection)url.openConnection(); conn.setReadTimeout(10 * 1000); conn.setConnectTimeout(10 * 1000); conn.setRequestMethod("GET"); InputStream in = null; if(conn.getResponseCode() == HttpURLConnection.HTTP_OK) { in = conn.getInputStream(); } else { in = null; } if (in == null){ throw new RuntimeException("stream is null"); } else { try { // 调用getBytes(in)方法 byte[] data = getBytes(in); if(data!=null){ Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length); return bitmap; } } catch (Exception e) { e.printStackTrace(); } in.close(); return null; } } /** * 在getImage()中调用 */ public static byte[] getBytes(InputStream inStream) throws Exception{ ByteArrayOutputStream outStream = new ByteArrayOutputStream(); byte[] buffer = new byte[1024]; int len = 0; while( (len=inStream.read(buffer)) != -1){ outStream.write(buffer, 0, len); } outStream.close(); inStream.close(); return outStream.toByteArray(); } /** * 网络取图片 inputStream --> drawable */ private Drawable loadDrawableImage(String imageUrl) { Drawable drawable = null; try { // 可以在这里通过文件名来判断,是否本地有此图片 drawable = Drawable.createFromStream( new URL(imageUrl).openStream(), "image.jpg"); } catch (IOException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } return drawable; } /** * 将两个bitmap对象整合并保存为一张图片 */ public Bitmap combineBitmap(Bitmap background, Bitmap foreground) { //第一张图片的宽高 int bgWidth = background.getWidth(); int bgHeight = background.getHeight(); //第二章图片的宽高 int fgWidth = foreground.getWidth(); int fgHeight = foreground.getHeight(); //创建一个新的bitmao 高度等于两张高度的总和 用来竖列拼接 Bitmap newmap = Bitmap.createBitmap(bgWidth, bgHeight + fgHeight, android.graphics.Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(newmap); //画上第一张图片 canvas.drawBitmap(background, 0, 0, null); //从第一张图片的下边开始画入第二张图片 canvas.drawBitmap(foreground, 0, bgHeight, null); return newmap; } /** * Bitmap旋转一定角度 */ public static Bitmap rotate(Bitmap b, int degrees) { if (degrees != 0 && b != null) { Matrix m = new Matrix(); m.setRotate(degrees, (float) b.getWidth() / 2, (float) b.getHeight() / 2); try { Bitmap b2 = Bitmap.createBitmap(b, 0, 0, b.getWidth(), b.getHeight(), m, true); return b2;// 正常情况下返回旋转角度的图 } catch (OutOfMemoryError ex) { return b;// 内存溢出返回原图 } finally { b.recycle();// 释放资源 } } return b; } /** * Bitmap画一个圆角图 */ public static Bitmap getRoundedCornerBitmap(Bitmap bitmap, float roundPx) { if (bitmap == null) { return bitmap; } try { Bitmap output = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Bitmap.Config.ARGB_8888); Canvas canvas = 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); canvas.drawARGB(0, 0, 0, 0); paint.setColor(color); canvas.drawRoundRect(rectF, roundPx, roundPx, paint); paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN)); canvas.drawBitmap(bitmap, rect, rect, paint); return output; } catch (OutOfMemoryError e) { // TODO: handle exception System.gc(); return null; } } /** * 从view 得到图片 */ public static Bitmap getBitmapFromView(View view) { view.destroyDrawingCache(); view.measure(View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED), View.MeasureSpec .makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED)); view.layout(0, 0, view.getMeasuredWidth(), view.getMeasuredHeight()); view.setDrawingCacheEnabled(true); Bitmap bitmap = view.getDrawingCache(true); return bitmap; } /** * 添加水印 */ public static Bitmap watermarkBitmap(Bitmap src, Bitmap watermark, String title) { if (src == null) { return null; } int w = src.getWidth(); int h = src.getHeight(); // 需要处理图片太大造成的内存超过的问题,这里我的图片很小所以不写相应代码了 Bitmap newb = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);// 创建一个新的和SRC长度宽度一样的位图 Canvas cv = new Canvas(newb); cv.drawBitmap(src, 0, 0, null);// 在 0,0坐标开始画入src Paint paint = new Paint(); // 加入图片 if (watermark != null) { int ww = watermark.getWidth(); int wh = watermark.getHeight(); paint.setAlpha(50); cv.drawBitmap(watermark, w - ww + 5, h - wh + 5, paint);// 在src的右下角画入水印 } // 加入文字 if (title != null) { String familyName = "宋体"; Typeface font = Typeface.create(familyName, Typeface.BOLD); TextPaint textPaint = new TextPaint(); textPaint.setColor(Color.RED); textPaint.setTypeface(font); textPaint.setTextSize(22); // 这里是自动换行的 StaticLayout layout = new StaticLayout(title, textPaint, w, Layout.Alignment.ALIGN_NORMAL, 1.0F, 0.0F, true); layout.draw(cv); // 文字就加左上角算了 // cv.drawText(title,0,40,paint); } cv.save(Canvas.ALL_SAVE_FLAG);// 保存 cv.restore();// 存储 return newb; } }
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories