Android图片处理工具类

/**

 * 图片处理工具

 * 

 * 

 */

public class BitmapTools {

    /**

     * 将Bitmap转换成文件

     * 

     * @param bmp

     * @param filename

     * @return

     */

    public boolean saveBitmap2File(Bitmap bmp, File filename) {

        CompressFormat format = Bitmap.CompressFormat.JPEG;

        int quality = 100;

        OutputStream stream = null;

        try {

            stream = new FileOutputStream(filename);

        } catch (FileNotFoundException e) {

            e.printStackTrace();

        }


        return bmp.compress(format, quality, stream);

    }

    

    /**

     * 将File转换成Bitmap

     * @param filename

     * @return

     */

    public Bitmap getBitmapFromFile(File filename){

        return BitmapFactory.decodeFile(filename.getPath());

    }


    /**

     * 压缩图片

     * 

     * @param bitmap

     *            源图片

     * @param width

     *            想要的宽度

     * @param height

     *            想要的高度

     * @param isAdjust

     *            是否自动调整尺寸, true图片就不会拉伸,false严格按照你的尺寸压缩

     * @return Bitmap

     */

    public Bitmap reduce(Bitmap bitmap, int width, int height, boolean isAdjust) {

        // 如果想要的宽度和高度都比源图片小,就不压缩了,直接返回原图

        if (bitmap.getWidth() < width && bitmap.getHeight() < height) {

            return bitmap;

        }

        // 根据想要的尺寸精确计算压缩比例, 方法详解:public BigDecimal divide(BigDecimal divisor,

        // int scale, int roundingMode);

        // scale表示要保留的小数位, roundingMode表示如何处理多余的小数位,BigDecimal.ROUND_DOWN表示自动舍弃

        float sx = new BigDecimal(width).divide(

                new BigDecimal(bitmap.getWidth()), 4, BigDecimal.ROUND_DOWN)

                .floatValue();

        float sy = new BigDecimal(height).divide(

                new BigDecimal(bitmap.getHeight()), 4, BigDecimal.ROUND_DOWN)

                .floatValue();

        if (isAdjust) {// 如果想自动调整比例,不至于图片会拉伸

            sx = (sx < sy ? sx : sy);

            sy = sx;// 哪个比例小一点,就用哪个比例

        }

        Matrix matrix = new Matrix();

        matrix.postScale(sx, sy);// 调用api中的方法进行压缩,就大功告成了

        return Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(),

                bitmap.getHeight(), matrix, true);

    }


    /**

     * 旋转图片

     * 

     * @param bitmap

     *            源图片

     * @param angle

     *            旋转角度(90为顺时针旋转,-90为逆时针旋转)

     * @return Bitmap

     */

    public Bitmap rotate(Bitmap bitmap, float angle) {

        Matrix matrix = new Matrix();

        matrix.postRotate(angle);

        return Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(),

                bitmap.getHeight(), matrix, true);

    }


    /**

     * 放大或缩小图片

     * 

     * @param bitmap

     *            源图片

     * @param ratio

     *            放大或缩小的倍数,大于1表示放大,小于1表示缩小

     * @return Bitmap

     */

    public Bitmap zoom(Bitmap bitmap, float ratio) {

        if (ratio < 0f) {

            return bitmap;

        }

        Matrix matrix = new Matrix();

        matrix.postScale(ratio, ratio);

        return Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(),

                bitmap.getHeight(), matrix, true);

    }


    /**

     * 在图片上印字

     * 

     * @param bitmap

     *            源图片

     * @param text

     *            印上去的字

     * @param param

     *            字体参数分别为:颜色,大小,是否加粗,起点x,起点y; 比如:{color : 0xFF000000, size : 30,

     *            bold : true, x : 20, y : 20}

     * @return Bitmap

     */

    public Bitmap printWord(Bitmap bitmap, String text,

            Map<String, Object> param) {

        if (TextUtils.isEmpty(text) || null == param) {

            return bitmap;

        }

        Bitmap newBitmap = Bitmap.createBitmap(bitmap.getWidth(),

                bitmap.getHeight(), Config.ARGB_8888);

        Canvas canvas = new Canvas(newBitmap);

        canvas.drawBitmap(bitmap, 0, 0, null);

        canvas.save(Canvas.ALL_SAVE_FLAG);

        canvas.restore();

        Paint paint = new Paint();

        paint.setColor(null != param.get("color") ? (Integer) param

                .get("color") : Color.BLACK);

        paint.setTextSize(null != param.get("size") ? (Integer) param

                .get("size") : 20);

        paint.setFakeBoldText(null != param.get("bold") ? (Boolean) param

                .get("bold") : false);

        canvas.drawText(text, null != param.get("x") ? (Integer) param.get("x")

                : 0, null != param.get("y") ? (Integer) param.get("y") : 0,

                paint);

        canvas.save(Canvas.ALL_SAVE_FLAG);

        canvas.restore();

        return newBitmap;

    }


    /**

     * 创建logo(给图片加水印),

     * 

     * @param bitmaps

     *            原图片和水印图片

     * @param left

     *            左边起点坐标

     * @param top

     *            顶部起点坐标t

     * @return Bitmap

     */

    public Bitmap createLogo(Bitmap[] bitmaps, int left, int top) {

        Bitmap newBitmap = Bitmap.createBitmap(bitmaps[0].getWidth(),

                bitmaps[0].getHeight(), Config.ARGB_8888);

        Canvas canvas = new Canvas(newBitmap);

        for (int i = 0; i < bitmaps.length; i++) {

            if (i == 0) {

                canvas.drawBitmap(bitmaps[0], 0, 0, null);

            } else {

                canvas.drawBitmap(bitmaps[i], left, top, null);

            }

            canvas.save(Canvas.ALL_SAVE_FLAG);

            canvas.restore();

        }

        return newBitmap;

    }


    private int width = 140, height = 40, codeLen = 4;

    private String checkCode = "";

    private Random random = new Random();


    /**

     * 产生一个4位随机数字的图片验证码

     * 

     * @return Bitmap

     */

    public Bitmap createCode() {

        checkCode = "";

        String[] chars = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" };

        for (int i = 0; i < codeLen; i++) {

            checkCode += chars[random.nextInt(chars.length)];

        }

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

        Canvas canvas = new Canvas(bitmap);

        canvas.drawColor(Color.WHITE);

        Paint paint = new Paint();

        paint.setTextSize(30);

        paint.setColor(Color.BLUE);

        for (int i = 0; i < checkCode.length(); i++) {

            paint.setColor(randomColor(1));

            paint.setFakeBoldText(random.nextBoolean());

            float skewX = random.nextInt(11) / 10;

            paint.setTextSkewX(random.nextBoolean() ? skewX : -skewX);

            int x = width / codeLen * i + random.nextInt(10);

            canvas.drawText(String.valueOf(checkCode.charAt(i)), x, 28, paint);

        }

        for (int i = 0; i < 3; i++) {

            drawLine(canvas, paint);

        }

        for (int i = 0; i < 255; i++) {

            drawPoints(canvas, paint);

        }

        canvas.save(Canvas.ALL_SAVE_FLAG);

        canvas.restore();

        return bitmap;

    }


    /**

     * 获得一个随机的颜色

     * 

     * @param rate

     * @return

     */

    public int randomColor(int rate) {

        int red = random.nextInt(256) / rate, green = random.nextInt(256)

                / rate, blue = random.nextInt(256) / rate;

        return Color.rgb(red, green, blue);

    }


    /**

     * 画随机线条

     * 

     * @param canvas

     * @param paint

     */

    public void drawLine(Canvas canvas, Paint paint) {

        int startX = random.nextInt(width), startY = random.nextInt(height);

        int stopX = random.nextInt(width), stopY = random.nextInt(height);

        paint.setStrokeWidth(1);

        paint.setColor(randomColor(1));

        canvas.drawLine(startX, startY, stopX, stopY, paint);

    }


    /**

     * 画随机干扰点

     * 

     * @param canvas

     * @param paint

     */

    public void drawPoints(Canvas canvas, Paint paint) {

        int stopX = random.nextInt(width), stopY = random.nextInt(height);

        paint.setStrokeWidth(1);

        paint.setColor(randomColor(1));

        canvas.drawPoint(stopX, stopY, paint);

    }


    /**

     * 返回真实验证码字符串

     * 

     * @return String

     */

    public String getCheckCode() {

        return checkCode;

    }

}

转载于:https://my.oschina.net/hjwsun/blog/507729

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值