android中图片的处理(绘制圆形,圆角||缩略图)

来源:互联网 发布:传奇数据库编辑器 编辑:程序博客网 时间:2024/05/09 16:07
    /**     * 圆角处理     *      * @param bitmap     *            原图     * @param roundPx     *            角度     * @return     */    public static Bitmap getCornerBitmap(Bitmap bitmap, float roundPx) {        if (bitmap == null)            return null;        // todo:to prevent memory overflow, suspend the processing of fillet        // 创建一个指定宽度和高度的空位图对象        Bitmap output = Bitmap.createBitmap(bitmap.getWidth(),                bitmap.getHeight(), Config.ARGB_8888);        // 用该位图创建画布        Canvas canvas = new Canvas(output);        // 画笔对象        final Paint paint = new Paint();        // 画笔的颜色        final int color = 0xff424242;        // 矩形区域对象        final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());        // 未知        final RectF rectF = new RectF(rect);        // 拐角的半径        roundPx = roundPx == 0 ? (bitmap.getWidth() + bitmap.getHeight()) / 4                : roundPx;        // 消除锯齿        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);        // 最终在画布上呈现的就是该圆角矩形图片,然后我们返回该Bitmap对象        return output;    }--------------------------------------------------------------------------    /**     * 圆形处理     *      * @param bitmap     *            原图     * @return     */    public static Bitmap getRoundBitmap(Bitmap bitmap) {          int width = bitmap.getWidth();          int height = bitmap.getHeight();          float roundPx;          float left, top, right, bottom, dst_left, dst_top, dst_right, dst_bottom;          if (width <= height) {              roundPx = width / 2;              left = 0;              top = 0;              right = width;              bottom = width;              height = width;              dst_left = 0;              dst_top = 0;              dst_right = width;              dst_bottom = width;          } else {              roundPx = height / 2;              float clip = (width - height) / 2;              left = clip;              right = width - clip;              top = 0;              bottom = height;              width = height;              dst_left = 0;              dst_top = 0;              dst_right = height;              dst_bottom = height;          }          Bitmap output = Bitmap.createBitmap(width, height, Config.ARGB_8888);          Canvas canvas = new Canvas(output);          final Paint paint = new Paint();          final Rect src = new Rect((int) left, (int) top, (int) right, (int) bottom);          final Rect dst = new Rect((int) dst_left, (int) dst_top, (int) dst_right, (int) dst_bottom);          final RectF rectF = new RectF(dst);          paint.setAntiAlias(true);// 设置画笔无锯齿          canvas.drawARGB(0, 0, 0, 0); // 填充整个Canvas          // 以下有两种方法画圆,drawRounRect和drawCircle          canvas.drawRoundRect(rectF, roundPx, roundPx, paint);// 画圆角矩形,第一个参数为图形显示区域,第二个参数和第三个参数分别是水平圆角半径和垂直圆角半径。          // canvas.drawCircle(roundPx, roundPx, roundPx, paint);          paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));// 设置两张图片相交时的模式,参考http://www.cnblogs.com/rayray/p/3670120.html          canvas.drawBitmap(bitmap, src, dst, paint); // 以Mode.SRC_IN模式合并bitmap和已经draw了的Circle          return output;      }  -------------------------------------------------------------------------------0    /**     * 缩略图     *      * @param bitmap     *            原图     * @param thumbnailWidth     *            压缩宽     * @param thumbnailHeight     *            压缩高     * @return     */    public static final Bitmap cropBitmap(final Bitmap bitmap,            final int thumbnailWidth, final int thumbnailHeight) {        if (bitmap == null)            return null;        final int width = bitmap.getWidth();        final int height = bitmap.getHeight();        int focusX = width / 2;        int focusY = height / 2;        int cropX;        int cropY;        int cropWidth;        int cropHeight;        float scaleFactor;        if (thumbnailWidth * height < thumbnailHeight * width) {            // Vertically constrained.            cropWidth = thumbnailWidth * height / thumbnailHeight;            cropX = Math.max(0,                    Math.min(focusX - cropWidth / 2, width - cropWidth));            cropY = 0;            cropHeight = height;            scaleFactor = (float) thumbnailHeight / height;        } else {            // Horizontally constrained.            cropHeight = thumbnailHeight * width / thumbnailWidth;            cropY = Math.max(0,                    Math.min(focusY - cropHeight / 2, height - cropHeight));            cropX = 0;            cropWidth = width;            scaleFactor = (float) thumbnailWidth / width;        }        final Bitmap finalBitmap = Bitmap.createBitmap(thumbnailWidth,                thumbnailHeight, Bitmap.Config.RGB_565);        final Canvas canvas = new Canvas(finalBitmap);        final Paint paint = new Paint();        paint.setDither(true);        paint.setFilterBitmap(true);        canvas.drawColor(0);        canvas.drawBitmap(bitmap, new Rect(cropX, cropY, cropX + cropWidth,                cropY + cropHeight), new Rect(0, 0, thumbnailWidth,                thumbnailHeight), paint);        bitmap.recycle();        // Store (long thumbnailId, short focusX, short focusY, JPEG data).        final ByteArrayOutputStream cacheOutput = new ByteArrayOutputStream(                16384);        final DataOutputStream dataOutput = new DataOutputStream(cacheOutput);        // byte[] retVal = null;        try {            dataOutput.writeShort((int) ((focusX - cropX) * scaleFactor));            dataOutput.writeShort((int) ((focusY - cropY) * scaleFactor));            dataOutput.flush();            finalBitmap.compress(Bitmap.CompressFormat.JPEG, 80, cacheOutput);            // retVal = cacheOutput.toByteArray();            cacheOutput.close();            // finalBitmap.recycle();        } catch (Exception e) {            ;        }        return finalBitmap;    }
0 0
原创粉丝点击