zoukankan      html  css  js  c++  java
  • Android之多种Bitmap效果

    1. 将图片变为圆角

    2. 获取缩略图图片

    3. LOMO特效

    4. 旧时光特效

    5. 暖意特效

    6. 根据饱和度、色相、亮度调整图片

    7. 添加图片外边框

    8. 添加内边框

    9. 创建一个缩放的图片

    /**
     * 图片工具类
     * 
     * @author rendongwei
     * 
     */
    public class PhotoUtil {
        /**
         * 将图片变为圆角
         * 
         * @param bitmap
         *            原Bitmap图片
         * @param pixels
         *            图片圆角的弧度(单位:像素(px))
         * @return 带有圆角的图片(Bitmap 类型)
         */
        public static Bitmap toRoundCorner(Bitmap bitmap, int pixels) {
    
            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);
            final float roundPx = pixels;
    
            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;
        }
    
        public static boolean saveToSDCard(Bitmap bitmap) {
            if (!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
                return false;
            }
            FileOutputStream fileOutputStream = null;
            File file = new File("/sdcard/KaiXin/Download/");
            if (!file.exists()) {
                file.mkdirs();
            }
            String fileName = UUID.randomUUID().toString() + ".jpg";
            String filePath = "/sdcard/KaiXin/Download/" + fileName;
            File f = new File(filePath);
            if (!f.exists()) {
                try {
                    f.createNewFile();
                    fileOutputStream = new FileOutputStream(filePath);
                    bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fileOutputStream);
                } catch (IOException e) {
                    return false;
                } finally {
                    try {
                        fileOutputStream.flush();
                        fileOutputStream.close();
                    } catch (IOException e) {
                        return false;
                    }
                }
            }
            return true;
        }
    
        /**
         * 保存图片到本地(JPG)
         * 
         * @param bm
         *            保存的图片
         * @return 图片路径
         */
        public static String saveToLocal(Bitmap bm) {
            if (!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
                return null;
            }
            FileOutputStream fileOutputStream = null;
            File file = new File("/sdcard/KaiXin/Images/");
            if (!file.exists()) {
                file.mkdirs();
            }
            String fileName = UUID.randomUUID().toString() + ".jpg";
            String filePath = "/sdcard/KaiXin/Images/" + fileName;
            File f = new File(filePath);
            if (!f.exists()) {
                try {
                    f.createNewFile();
                    fileOutputStream = new FileOutputStream(filePath);
                    bm.compress(Bitmap.CompressFormat.JPEG, 100, fileOutputStream);
                } catch (IOException e) {
                    return null;
                } finally {
                    try {
                        fileOutputStream.flush();
                        fileOutputStream.close();
                    } catch (IOException e) {
                        return null;
                    }
                }
            }
            return filePath;
        }
    
        /**
         * 保存图片到本地(PNG)
         * 
         * @param bm
         *            保存的图片
         * @return 图片路径
         */
        public static String saveToLocalPNG(Bitmap bm) {
            if (!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
                return null;
            }
            FileOutputStream fileOutputStream = null;
            File file = new File("/sdcard/KaiXin/Images/");
            if (!file.exists()) {
                file.mkdirs();
            }
            String fileName = UUID.randomUUID().toString() + ".png";
            String filePath = "/sdcard/KaiXin/Images/" + fileName;
            File f = new File(filePath);
            if (!f.exists()) {
                try {
                    f.createNewFile();
                    fileOutputStream = new FileOutputStream(filePath);
                    bm.compress(Bitmap.CompressFormat.PNG, 100, fileOutputStream);
                } catch (IOException e) {
                    return null;
                } finally {
                    try {
                        fileOutputStream.flush();
                        fileOutputStream.close();
                    } catch (IOException e) {
                        return null;
                    }
                }
            }
            return filePath;
        }
    
        /**
         * 获取缩略图图片
         * 
         * @param imagePath
         *            图片的路径
         * @param width
         *            图片的宽度
         * @param height
         *            图片的高度
         * @return 缩略图图片
         */
        public static Bitmap getImageThumbnail(String imagePath, int width, int height) {
            Bitmap bitmap = null;
            BitmapFactory.Options options = new BitmapFactory.Options();
            options.inJustDecodeBounds = true;
            // 获取这个图片的宽和高,注意此处的bitmap为null
            bitmap = BitmapFactory.decodeFile(imagePath, options);
            options.inJustDecodeBounds = false; // 设为 false
            // 计算缩放比
            int h = options.outHeight;
            int w = options.outWidth;
            int beWidth = w / width;
            int beHeight = h / height;
            int be = 1;
            if (beWidth < beHeight) {
                be = beWidth;
            } else {
                be = beHeight;
            }
            if (be <= 0) {
                be = 1;
            }
            options.inSampleSize = be;
            // 重新读入图片,读取缩放后的bitmap,注意这次要把options.inJustDecodeBounds 设为 false
            bitmap = BitmapFactory.decodeFile(imagePath, options);
            // 利用ThumbnailUtils来创建缩略图,这里要指定要缩放哪个Bitmap对象
            bitmap = ThumbnailUtils.extractThumbnail(bitmap, width, height, ThumbnailUtils.OPTIONS_RECYCLE_INPUT);
            return bitmap;
        }
    
        /**
         * LOMO特效
         * 
         * @param bitmap
         *            原图片
         * @return LOMO特效图片
         */
        public static Bitmap lomoFilter(Bitmap bitmap) {
            int width = bitmap.getWidth();
            int height = bitmap.getHeight();
            int dst[] = new int[width * height];
            bitmap.getPixels(dst, 0, width, 0, 0, width, height);
    
            int ratio = width > height ? height * 32768 / width : width * 32768 / height;
            int cx = width >> 1;
            int cy = height >> 1;
            int max = cx * cx + cy * cy;
            int min = (int) (max * (1 - 0.8f));
            int diff = max - min;
    
            int ri, gi, bi;
            int dx, dy, distSq, v;
    
            int R, G, B;
    
            int value;
            int pos, pixColor;
            int newR, newG, newB;
            for (int y = 0; y < height; y++) {
                for (int x = 0; x < width; x++) {
                    pos = y * width + x;
                    pixColor = dst[pos];
                    R = Color.red(pixColor);
                    G = Color.green(pixColor);
                    B = Color.blue(pixColor);
    
                    value = R < 128 ? R : 256 - R;
                    newR = (value * value * value) / 64 / 256;
                    newR = (R < 128 ? newR : 255 - newR);
    
                    value = G < 128 ? G : 256 - G;
                    newG = (value * value) / 128;
                    newG = (G < 128 ? newG : 255 - newG);
    
                    newB = B / 2 + 0x25;
    
                    // ==========边缘黑暗==============//
                    dx = cx - x;
                    dy = cy - y;
                    if (width > height)
                        dx = (dx * ratio) >> 15;
                    else
                        dy = (dy * ratio) >> 15;
    
                    distSq = dx * dx + dy * dy;
                    if (distSq > min) {
                        v = ((max - distSq) << 8) / diff;
                        v *= v;
    
                        ri = newR * v >> 16;
                        gi = newG * v >> 16;
                        bi = newB * v >> 16;
    
                        newR = ri > 255 ? 255 : (ri < 0 ? 0 : ri);
                        newG = gi > 255 ? 255 : (gi < 0 ? 0 : gi);
                        newB = bi > 255 ? 255 : (bi < 0 ? 0 : bi);
                    }
                    // ==========边缘黑暗end==============//
    
                    dst[pos] = Color.rgb(newR, newG, newB);
                }
            }
    
            Bitmap acrossFlushBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);
            acrossFlushBitmap.setPixels(dst, 0, width, 0, 0, width, height);
            return acrossFlushBitmap;
        }
    
        /**
         * 旧时光特效
         * 
         * @param bmp
         *            原图片
         * @return 旧时光特效图片
         */
        public static Bitmap oldTimeFilter(Bitmap bmp) {
            int width = bmp.getWidth();
            int height = bmp.getHeight();
            Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);
            int pixColor = 0;
            int pixR = 0;
            int pixG = 0;
            int pixB = 0;
            int newR = 0;
            int newG = 0;
            int newB = 0;
            int[] pixels = new int[width * height];
            bmp.getPixels(pixels, 0, width, 0, 0, width, height);
            for (int i = 0; i < height; i++) {
                for (int k = 0; k < width; k++) {
                    pixColor = pixels[width * i + k];
                    pixR = Color.red(pixColor);
                    pixG = Color.green(pixColor);
                    pixB = Color.blue(pixColor);
                    newR = (int) (0.393 * pixR + 0.769 * pixG + 0.189 * pixB);
                    newG = (int) (0.349 * pixR + 0.686 * pixG + 0.168 * pixB);
                    newB = (int) (0.272 * pixR + 0.534 * pixG + 0.131 * pixB);
                    int newColor = Color.argb(255, newR > 255 ? 255 : newR, newG > 255 ? 255 : newG, newB > 255 ? 255
                            : newB);
                    pixels[width * i + k] = newColor;
                }
            }
    
            bitmap.setPixels(pixels, 0, width, 0, 0, width, height);
            return bitmap;
        }
    
        /**
         * 暖意特效
         * 
         * @param bmp
         *            原图片
         * @param centerX
         *            光源横坐标
         * @param centerY
         *            光源纵坐标
         * @return 暖意特效图片
         */
        public static Bitmap warmthFilter(Bitmap bmp, int centerX, int centerY) {
            final int width = bmp.getWidth();
            final int height = bmp.getHeight();
            Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);
    
            int pixR = 0;
            int pixG = 0;
            int pixB = 0;
    
            int pixColor = 0;
    
            int newR = 0;
            int newG = 0;
            int newB = 0;
            int radius = Math.min(centerX, centerY);
    
            final float strength = 150F; // 光照强度 100~150
            int[] pixels = new int[width * height];
            bmp.getPixels(pixels, 0, width, 0, 0, width, height);
            int pos = 0;
            for (int i = 1, length = height - 1; i < length; i++) {
                for (int k = 1, len = width - 1; k < len; k++) {
                    pos = i * width + k;
                    pixColor = pixels[pos];
    
                    pixR = Color.red(pixColor);
                    pixG = Color.green(pixColor);
                    pixB = Color.blue(pixColor);
    
                    newR = pixR;
                    newG = pixG;
                    newB = pixB;
    
                    // 计算当前点到光照中心的距离,平面座标系中求两点之间的距离
                    int distance = (int) (Math.pow((centerY - i), 2) + Math.pow(centerX - k, 2));
                    if (distance < radius * radius) {
                        // 按照距离大小计算增加的光照值
                        int result = (int) (strength * (1.0 - Math.sqrt(distance) / radius));
                        newR = pixR + result;
                        newG = pixG + result;
                        newB = pixB + result;
                    }
    
                    newR = Math.min(255, Math.max(0, newR));
                    newG = Math.min(255, Math.max(0, newG));
                    newB = Math.min(255, Math.max(0, newB));
    
                    pixels[pos] = Color.argb(255, newR, newG, newB);
                }
            }
    
            bitmap.setPixels(pixels, 0, width, 0, 0, width, height);
            return bitmap;
        }
    
        /**
         * 根据饱和度、色相、亮度调整图片
         * 
         * @param bm
         *            原图片
         * @param saturation
         *            饱和度
         * @param hue
         *            色相
         * @param lum
         *            亮度
         * @return 处理后的图片
         */
        public static Bitmap handleImage(Bitmap bm, int saturation, int hue, int lum) {
            Bitmap bmp = Bitmap.createBitmap(bm.getWidth(), bm.getHeight(), Bitmap.Config.ARGB_8888);
            Canvas canvas = new Canvas(bmp);
            Paint paint = new Paint();
            paint.setAntiAlias(true);
            ColorMatrix mLightnessMatrix = new ColorMatrix();
            ColorMatrix mSaturationMatrix = new ColorMatrix();
            ColorMatrix mHueMatrix = new ColorMatrix();
            ColorMatrix mAllMatrix = new ColorMatrix();
            float mSaturationValue = saturation * 1.0F / 127;
            float mHueValue = hue * 1.0F / 127;
            float mLumValue = (lum - 127) * 1.0F / 127 * 180;
            mHueMatrix.reset();
            mHueMatrix.setScale(mHueValue, mHueValue, mHueValue, 1);
    
            mSaturationMatrix.reset();
            mSaturationMatrix.setSaturation(mSaturationValue);
            mLightnessMatrix.reset();
    
            mLightnessMatrix.setRotate(0, mLumValue);
            mLightnessMatrix.setRotate(1, mLumValue);
            mLightnessMatrix.setRotate(2, mLumValue);
    
            mAllMatrix.reset();
            mAllMatrix.postConcat(mHueMatrix);
            mAllMatrix.postConcat(mSaturationMatrix);
            mAllMatrix.postConcat(mLightnessMatrix);
    
            paint.setColorFilter(new ColorMatrixColorFilter(mAllMatrix));
            canvas.drawBitmap(bm, 0, 0, paint);
            return bmp;
        }
    
        /**
         * 添加图片外边框
         * 
         * @param context
         *            上下文
         * @param bm
         *            原图片
         * @param frameName
         *            边框名称
         * @return 带有边框的图片
         */
        public static Bitmap combinateFrame(Context context, Bitmap bm, String frameName) {
            // 原图片的宽高
            int imageWidth = bm.getWidth();
            int imageHeight = bm.getHeight();
    
            // 边框
            Bitmap leftUp = decodeBitmap(context, frameName, 0);
            Bitmap leftDown = decodeBitmap(context, frameName, 2);
            Bitmap rightDown = decodeBitmap(context, frameName, 4);
            Bitmap rightUp = decodeBitmap(context, frameName, 6);
            Bitmap top = decodeBitmap(context, frameName, 7);
            Bitmap down = decodeBitmap(context, frameName, 3);
            Bitmap left = decodeBitmap(context, frameName, 1);
            Bitmap right = decodeBitmap(context, frameName, 5);
    
            Bitmap newBitmap = null;
            Canvas canvas = null;
    
            // 判断大小图片的宽高
            int judgeWidth = 0;
            int judgeHeight = 0;
            if ("frame7".equals(frameName)) {
                judgeWidth = leftUp.getWidth() + rightUp.getWidth() + top.getWidth() * 5;
                judgeHeight = leftUp.getHeight() + leftDown.getHeight() + left.getHeight() * 5;
            } else if ("frame10".equals(frameName)) {
                judgeWidth = leftUp.getWidth() + rightUp.getWidth() + top.getWidth() * 5;
                judgeHeight = leftUp.getHeight() + leftDown.getHeight() + left.getHeight() * 10;
            } else {
                judgeWidth = leftUp.getWidth() + rightUp.getWidth() + top.getWidth();
                judgeHeight = leftUp.getHeight() + leftDown.getHeight() + left.getHeight();
            }
            // 内边框
            if (imageWidth > judgeWidth && imageHeight > judgeHeight) {
                // 重新定义一个bitmap
                newBitmap = Bitmap.createBitmap(imageWidth, imageHeight, Config.ARGB_8888);
                canvas = new Canvas(newBitmap);
                Paint paint = new Paint();
                // 画原图
                canvas.drawBitmap(bm, 0, 0, paint);
                // 上空余宽度
                int topWidth = imageWidth - leftUp.getWidth() - rightUp.getWidth();
                // 上空余填充个数
                int topCount = (int) Math.ceil(topWidth * 1.0f / top.getWidth());
                for (int i = 0; i < topCount; i++) {
                    canvas.drawBitmap(top, leftUp.getWidth() + top.getWidth() * i, 0, paint);
                }
                // 下空余宽度
                int downWidth = imageWidth - leftDown.getWidth() - rightDown.getWidth();
                // 下空余填充个数
                int downCount = (int) Math.ceil(downWidth * 1.0f / down.getWidth());
                for (int i = 0; i < downCount; i++) {
                    canvas.drawBitmap(down, leftDown.getWidth() + down.getWidth() * i, imageHeight - down.getHeight(),
                            paint);
                }
                // 左空余高度
                int leftHeight = imageHeight - leftUp.getHeight() - leftDown.getHeight();
                // 左空余填充个数
                int leftCount = (int) Math.ceil(leftHeight * 1.0f / left.getHeight());
                for (int i = 0; i < leftCount; i++) {
                    canvas.drawBitmap(left, 0, leftUp.getHeight() + left.getHeight() * i, paint);
                }
                // 右空余高度
                int rightHeight = imageHeight - rightUp.getHeight() - rightDown.getHeight();
                // 右空余填充个数
                int rightCount = (int) Math.ceil(rightHeight * 1.0f / right.getHeight());
                for (int i = 0; i < rightCount; i++) {
                    canvas.drawBitmap(right, imageWidth - right.getWidth(), rightUp.getHeight() + right.getHeight() * i,
                            paint);
                }
                // 画左上角
                canvas.drawBitmap(leftUp, 0, 0, paint);
                // 画左下角
                canvas.drawBitmap(leftDown, 0, imageHeight - leftDown.getHeight(), paint);
                // 画右下角
                canvas.drawBitmap(rightDown, imageWidth - rightDown.getWidth(), imageHeight - rightDown.getHeight(), paint);
                // 画右上角
                canvas.drawBitmap(rightUp, imageWidth - rightUp.getWidth(), 0, paint);
    
            } else {
                if ("frame7".equals(frameName)) {
                    imageWidth = leftUp.getWidth() + top.getWidth() * 5 + rightUp.getWidth();
                    imageHeight = leftUp.getHeight() + left.getHeight() * 5 + leftDown.getHeight();
                } else if ("frame10".equals(frameName)) {
                    imageWidth = leftUp.getWidth() + top.getWidth() * 5 + rightUp.getWidth();
                    imageHeight = leftUp.getHeight() + left.getHeight() * 10 + leftDown.getHeight();
                } else {
                    imageWidth = leftUp.getWidth() + top.getWidth() + rightUp.getWidth();
                    imageHeight = leftUp.getHeight() + left.getHeight() + leftDown.getHeight();
                }
                newBitmap = Bitmap.createBitmap(imageWidth, imageHeight, Config.ARGB_8888);
                canvas = new Canvas(newBitmap);
                Paint paint = new Paint();
                int newImageWidth = imageWidth - left.getWidth() - right.getWidth() + 5;
                int newImageHeight = imageHeight - top.getHeight() - down.getHeight() + 5;
                bm = Bitmap.createScaledBitmap(bm, newImageWidth, newImageHeight, true);
                canvas.drawBitmap(bm, left.getWidth(), top.getHeight(), paint);
                if ("frame7".equals(frameName)) {
    
                    for (int i = 0; i < 5; i++) {
                        canvas.drawBitmap(top, leftUp.getWidth() + top.getWidth() * i, 0, paint);
                    }
    
                    for (int i = 0; i < 5; i++) {
                        canvas.drawBitmap(left, 0, leftUp.getHeight() + left.getHeight() * i, paint);
                    }
    
                    for (int i = 0; i < 5; i++) {
                        canvas.drawBitmap(right, imageWidth - right.getWidth(),
                                rightUp.getHeight() + right.getHeight() * i, paint);
                    }
    
                    for (int i = 0; i < 5; i++) {
                        canvas.drawBitmap(down, leftDown.getWidth() + down.getWidth() * i, imageHeight - down.getHeight(),
                                paint);
                    }
                    canvas.drawBitmap(leftUp, 0, 0, paint);
                    canvas.drawBitmap(rightUp, leftUp.getWidth() + top.getWidth() * 5, 0, paint);
                    canvas.drawBitmap(leftDown, 0, leftUp.getHeight() + left.getHeight() * 5, paint);
                    canvas.drawBitmap(rightDown, imageWidth - rightDown.getWidth(), rightUp.getHeight() + right.getHeight()
                            * 5, paint);
    
                } else if ("frame10".equals(frameName)) {
                    for (int i = 0; i < 5; i++) {
                        canvas.drawBitmap(top, leftUp.getWidth() + top.getWidth() * i, 0, paint);
                    }
    
                    for (int i = 0; i < 10; i++) {
                        canvas.drawBitmap(left, 0, leftUp.getHeight() + left.getHeight() * i, paint);
                    }
    
                    for (int i = 0; i < 10; i++) {
                        canvas.drawBitmap(right, imageWidth - right.getWidth(),
                                rightUp.getHeight() + right.getHeight() * i, paint);
                    }
    
                    for (int i = 0; i < 5; i++) {
                        canvas.drawBitmap(down, leftDown.getWidth() + down.getWidth() * i, imageHeight - down.getHeight(),
                                paint);
                    }
                    canvas.drawBitmap(leftUp, 0, 0, paint);
                    canvas.drawBitmap(rightUp, leftUp.getWidth() + top.getWidth() * 5, 0, paint);
                    canvas.drawBitmap(leftDown, 0, leftUp.getHeight() + left.getHeight() * 10, paint);
                    canvas.drawBitmap(rightDown, imageWidth - rightDown.getWidth(), rightUp.getHeight() + right.getHeight()
                            * 10, paint);
                } else {
                    canvas.drawBitmap(leftUp, 0, 0, paint);
                    canvas.drawBitmap(top, leftUp.getWidth(), 0, paint);
                    canvas.drawBitmap(rightUp, leftUp.getWidth() + top.getWidth(), 0, paint);
                    canvas.drawBitmap(left, 0, leftUp.getHeight(), paint);
                    canvas.drawBitmap(leftDown, 0, leftUp.getHeight() + left.getHeight(), paint);
                    canvas.drawBitmap(right, imageWidth - right.getWidth(), rightUp.getHeight(), paint);
                    canvas.drawBitmap(rightDown, imageWidth - rightDown.getWidth(),
                            rightUp.getHeight() + right.getHeight(), paint);
                    canvas.drawBitmap(down, leftDown.getWidth(), imageHeight - down.getHeight(), paint);
                }
            }
            // 回收
            leftUp.recycle();
            leftUp = null;
            leftDown.recycle();
            leftDown = null;
            rightDown.recycle();
            rightDown = null;
            rightUp.recycle();
            rightUp = null;
            top.recycle();
            top = null;
            down.recycle();
            down = null;
            left.recycle();
            left = null;
            right.recycle();
            right = null;
            canvas.save(Canvas.ALL_SAVE_FLAG);
            canvas.restore();
            return newBitmap;
        }
    
        /**
         * 获取边框图片
         * 
         * @param context
         *            上下文
         * @param frameName
         *            边框名称
         * @param position
         *            边框的类型
         * @return 边框图片
         */
        private static Bitmap decodeBitmap(Context context, String frameName, int position) {
            try {
                switch (position) {
                case 0:
                    return BitmapFactory.decodeStream(context.getAssets().open("frames/" + frameName + "/leftup.png"));
                case 1:
                    return BitmapFactory.decodeStream(context.getAssets().open("frames/" + frameName + "/left.png"));
                case 2:
                    return BitmapFactory.decodeStream(context.getAssets().open("frames/" + frameName + "/leftdown.png"));
                case 3:
                    return BitmapFactory.decodeStream(context.getAssets().open("frames/" + frameName + "/down.png"));
                case 4:
                    return BitmapFactory.decodeStream(context.getAssets().open("frames/" + frameName + "/rightdown.png"));
                case 5:
                    return BitmapFactory.decodeStream(context.getAssets().open("frames/" + frameName + "/right.png"));
                case 6:
                    return BitmapFactory.decodeStream(context.getAssets().open("frames/" + frameName + "/rightup.png"));
                case 7:
                    return BitmapFactory.decodeStream(context.getAssets().open("frames/" + frameName + "/up.png"));
                default:
                    return null;
                }
            } catch (IOException e) {
                e.printStackTrace();
                return null;
            }
        }
    
        /**
         * 添加内边框
         * 
         * @param bm
         *            原图片
         * @param frame
         *            内边框图片
         * @return 带有边框的图片
         */
        public static Bitmap addBigFrame(Bitmap bm, Bitmap frame) {
            Bitmap newBitmap = Bitmap.createBitmap(bm.getWidth(), bm.getHeight(), Config.ARGB_8888);
            Canvas canvas = new Canvas(newBitmap);
            Paint paint = new Paint();
            canvas.drawBitmap(bm, 0, 0, paint);
            frame = Bitmap.createScaledBitmap(frame, bm.getWidth(), bm.getHeight(), true);
            canvas.drawBitmap(frame, 0, 0, paint);
            canvas.save(Canvas.ALL_SAVE_FLAG);
            canvas.restore();
            return newBitmap;
    
        }
    
        /**
         * 创建一个缩放的图片
         * 
         * @param path
         *            图片地址
         * @param w
         *            图片宽度
         * @param h
         *            图片高度
         * @return 缩放后的图片
         */
        public static Bitmap createBitmap(String path, int w, int h) {
            try {
                BitmapFactory.Options opts = new BitmapFactory.Options();
                opts.inJustDecodeBounds = true;
                // 这里是整个方法的关键,inJustDecodeBounds设为true时将不为图片分配内存。
                BitmapFactory.decodeFile(path, opts);
                int srcWidth = opts.outWidth;// 获取图片的原始宽度
                int srcHeight = opts.outHeight;// 获取图片原始高度
                int destWidth = 0;
                int destHeight = 0;
                // 缩放的比例
                double ratio = 0.0;
                if (srcWidth < w || srcHeight < h) {
                    ratio = 0.0;
                    destWidth = srcWidth;
                    destHeight = srcHeight;
                } else if (srcWidth > srcHeight) {// 按比例计算缩放后的图片大小,maxLength是长或宽允许的最大长度
                    ratio = (double) srcWidth / w;
                    destWidth = w;
                    destHeight = (int) (srcHeight / ratio);
                } else {
                    ratio = (double) srcHeight / h;
                    destHeight = h;
                    destWidth = (int) (srcWidth / ratio);
                }
                BitmapFactory.Options newOpts = new BitmapFactory.Options();
                // 缩放的比例,缩放是很难按准备的比例进行缩放的,目前我只发现只能通过inSampleSize来进行缩放,其值表明缩放的倍数,SDK中建议其值是2的指数值
                newOpts.inSampleSize = (int) ratio + 1;
                // inJustDecodeBounds设为false表示把图片读进内存中
                newOpts.inJustDecodeBounds = false;
                // 设置大小,这个一般是不准确的,是以inSampleSize的为准,但是如果不设置却不能缩放
                newOpts.outHeight = destHeight;
                newOpts.outWidth = destWidth;
                // 获取缩放后图片
                return BitmapFactory.decodeFile(path, newOpts);
            } catch (Exception e) {
                // TODO: handle exception
                return null;
            }
        }
    
        public static Bitmap createBitmap2(Context context, int id, int w, int h) {
            try {
                BitmapFactory.Options opts = new BitmapFactory.Options();
                opts.inJustDecodeBounds = true;
                // 这里是整个方法的关键,inJustDecodeBounds设为true时将不为图片分配内存。
                BitmapFactory.decodeResource(context.getResources(), id, opts);
                int srcWidth = opts.outWidth;// 获取图片的原始宽度
                int srcHeight = opts.outHeight;// 获取图片原始高度
                int destWidth = 0;
                int destHeight = 0;
                // 缩放的比例
                double ratio = 0.0;
                if (srcWidth < w || srcHeight < h) {
                    ratio = 0.0;
                    destWidth = srcWidth;
                    destHeight = srcHeight;
                } else if (srcWidth > srcHeight) {// 按比例计算缩放后的图片大小,maxLength是长或宽允许的最大长度
                    ratio = (double) srcWidth / w;
                    destWidth = w;
                    destHeight = (int) (srcHeight / ratio);
                } else {
                    ratio = (double) srcHeight / h;
                    destHeight = h;
                    destWidth = (int) (srcWidth / ratio);
                }
                BitmapFactory.Options newOpts = new BitmapFactory.Options();
                // 缩放的比例,缩放是很难按准备的比例进行缩放的,目前我只发现只能通过inSampleSize来进行缩放,其值表明缩放的倍数,SDK中建议其值是2的指数值
                newOpts.inSampleSize = (int) ratio + 1;
                // inJustDecodeBounds设为false表示把图片读进内存中
                newOpts.inJustDecodeBounds = false;
                // 设置大小,这个一般是不准确的,是以inSampleSize的为准,但是如果不设置却不能缩放
                newOpts.outHeight = destHeight;
                newOpts.outWidth = destWidth;
                // 获取缩放后图片
                // return BitmapFactory.decodeFile(path, newOpts);
                return BitmapFactory.decodeResource(context.getResources(), id, newOpts);
            } catch (Exception e) {
                // TODO: handle exception
                return null;
            }
        }
    }
  • 相关阅读:
    DS博客作业06--图
    DS博客作业05--树
    DS博客作业04--树大作业说明
    DS博客作业02--栈和队列
    DS博客作业01--线性表
    DS博客作业01--日期抽象数据类型设计与实现
    C语言博客作业06--结构体&文件
    DEVC怎么建工程
    C语言博客05--指针
    201771010110孔维滢《面向对象程序设计(java)》第十二周学习总结
  • 原文地址:https://www.cnblogs.com/lee0oo0/p/3461392.html
Copyright © 2011-2022 走看看