zl程序教程

您现在的位置是:首页 >  移动开发

当前栏目

Android Bitmap 图片处理工具类详解手机开发

Android工具手机开发 详解 处理 图片 bitmap
2023-06-13 09:20:07 时间
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(CompressFormat.JPEG, 80, output); 

 if (needRecycle) { 

 bmp.recycle(); 

 byte[] result = output.toByteArray(); 

 try { 

 output.close(); 

 } catch (Exception e) { 

 e.printStackTrace(); 

 return result; 

将图片存储到sdcard中
 public static void storeImageToSDCARD(Bitmap colorImage, String ImageName, 

 String path) { 

 File file = new File(path); 

 if (!file.exists()) { 

 file.mkdir(); 

 File imagefile = new File(file, ImageName + ".jpg"); 

 try { 

 imagefile.createNewFile(); 

 FileOutputStream fos = new FileOutputStream(imagefile); 

 colorImage.compress(Bitmap.CompressFormat.JPEG, 100, fos); 

 fos.flush(); 

 fos.close(); 

 } catch (FileNotFoundException e) { 

 e.printStackTrace(); 

 } catch (IOException e) { 

 e.printStackTrace(); 

 }

sdcard取图片
 public static Bitmap getImg(String path,String picName) { 

 if (!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { 

 return null; 

 try { 

 File file = new File(path, picName + ".png"); 

 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 getImageByNet(String urlpath) throws Exception { 

 URL url = new URL(urlpath); 

 HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 

 conn.setRequestMethod("GET"); 

 conn.setConnectTimeout(5 * 1000); 

 Bitmap bitmap = null; 

 if (conn.getResponseCode() == 200) { 

 InputStream inputStream = conn.getInputStream(); 

 bitmap = BitmapFactory.decodeStream(inputStream); 

 return bitmap; 

 }

将两个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(), 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(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, 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, 

 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; 

 }
等比例压缩图片
 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); 

 }

以最省内存的方式读取本地资源的图片

 public static Bitmap ReadBitmapById(Context context, int drawableId, int screenWidth, int screenHight) { BitmapFactory.Options options = new BitmapFactory.Options(); options.inPreferredConfig = 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); }

原创文章,作者:Maggie-Hunter,如若转载,请注明出处:https://blog.ytso.com/3239.html

服务器部署程序员系统优化网站设置运维