BitmapUtil(高效压缩不失真)

package com.changim.patient.app.utils;

import android.app.Activity;
import android.content.ContentResolver;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.graphics.Rect;
import android.graphics.RectF;
import android.net.Uri;
import android.provider.MediaStore;
import android.view.Gravity;
import android.widget.Toast;

import java.io.File;

/**
 * Created by zzw on 2016/2/23 0023.
 */
public class ImageUtils {

    /**
     * 根据图片的Uri得到它的路径
     *
     * @param activity
     * @param imageUri
     * @return 返回null表示不能找到此图片
     */
    public static String getImagePathFromImageUri(Activity activity, Uri imageUri) {

        String[] filePathColumn = {MediaStore.Images.Media.DATA};
        Cursor cursor = activity.getContentResolver().query(imageUri, filePathColumn, null, null, null);

        if (cursor != null) {
            cursor.moveToFirst();
            int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
            String imagePath = cursor.getString(columnIndex);
            cursor.close();

            if (imagePath == null || imagePath.equals("null")) {
                Toast toast = Toast.makeText(activity, "不能发现图片", Toast.LENGTH_SHORT);
                toast.setGravity(Gravity.CENTER, 0, 0);
                toast.show();
                return null;
            }

            return imagePath;
        } else {
            File file = new File(imageUri.getPath());
            if (!file.exists()) {
                Toast toast = Toast.makeText(activity, "不能发现图片", Toast.LENGTH_SHORT);
                toast.setGravity(Gravity.CENTER, 0, 0);
                toast.show();
                return null;
            }
            return file.getAbsolutePath();
        }
    }

    /**
     * 根据图片的路径得到图片资源(压缩后)
     * 如果targetW或者targetH为0就自动压缩
     *
     * @param path
     * @param
     * @return 压缩后的图片
     */
    public static Bitmap getYaSuoBitmapFromImagePath(String path, int targetW, int targetH) {
        BitmapFactory.Options options = new BitmapFactory.Options();
        options.inJustDecodeBounds = true;
        BitmapFactory.decodeFile(path, options);
        int height = options.outHeight;
        int width = options.outWidth;
        int inSampleSize = calculateInSampleSize(options);
        options.inSampleSize = inSampleSize;
        options.inJustDecodeBounds = false;
        Bitmap src = BitmapFactory.decodeFile(path, options);

        if (src == null) {
            return null;
        }
        Bitmap bitmap = null;

        if (targetH == 0 || targetW == 0) {
            bitmap = Bitmap.createScaledBitmap(src, width / inSampleSize, height / inSampleSize, false);
        } else {
            bitmap = Bitmap.createScaledBitmap(src, targetW, targetH, false);
        }

        if (src != bitmap) {
            src.recycle();
        }

        return bitmap;
    }

    /**
     * 计算压缩比
     *
     * @param options
     * @return
     */
    public static int calculateInSampleSize(BitmapFactory.Options options) {
        int height = options.outHeight;
        int width = options.outWidth;

        int min = height > width ? width : height;
        int inSampleSize = min / 400;

        if (inSampleSize == 0)

            return 1;

        return inSampleSize;
    }

    /**
     * 根据图片的路径得到该图片在表中的ID
     *
     * @param cr
     * @param fileName
     * @return
     */
    public static String getImageIdFromPath(ContentResolver cr, String fileName) {

        //select condition.
        String whereClause = MediaStore.Images.Media.DATA + " = ‘" + fileName + "‘";

        //colection of results.
        Cursor cursor = cr.query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, new String[]{MediaStore.Images.Media._ID}, whereClause, null, null);
        if (cursor == null || cursor.getCount() == 0) {
            if (cursor != null)
                cursor.close();
            return null;
        }
        cursor.moveToFirst();
        //imageView id in imageView table.
        String imageId = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media._ID));
        cursor.close();
        if (imageId == null) {
            return null;
        }
        return imageId;
    }

    /**
     * 根据图片的ID得到缩略图
     *
     * @param cr
     * @param imageId
     * @return
     */
    public static Bitmap getThumbnailsFromImageId(ContentResolver cr, String imageId) {
        if (imageId == null || imageId.equals(""))
            return null;

        Bitmap bitmap = null;
        BitmapFactory.Options options = new BitmapFactory.Options();
        options.inDither = false;
        options.inPreferredConfig = Bitmap.Config.ARGB_8888;

        long imageIdLong = Long.parseLong(imageId);
        //via imageid get the bimap type thumbnail in thumbnail table.
        bitmap = MediaStore.Images.Thumbnails.getThumbnail(cr, imageIdLong, MediaStore.Images.Thumbnails.MINI_KIND, options);

        return bitmap;
    }

    /**
     * 获得圆角图片的方法
     *
     * @param bitmap 源Bitmap
     * @param roundPx 圆角大小
     * @return 期望Bitmap
     */
    public static Bitmap getRoundedCornerBitmap(Bitmap bitmap, float roundPx) {

        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;
    }
}
时间: 2024-11-05 19:25:23

BitmapUtil(高效压缩不失真)的相关文章

Druid(准)实时分析统计数据库——列存储+高效压缩

Druid是一个开源的.分布式的.列存储系统,特别适用于大数据上的(准)实时分析统计.且具有较好的稳定性(Highly Available). 其相对比较轻量级,文档非常完善,也比较容易上手. Druid vs 其他系统 Druid vs Impala/Shark Druid和Impala.Shark 的比较基本上可以归结为需要设计什么样的系统 Druid被设计用于: 一直在线的服务 获取实时数据 处理slice-n-dice式的即时查询 查询速度不同: Druid是列存储方式,数据经过压缩加入

vue图片压缩(不失真)

1.在index.html中引入mobileBUGFix.min.js // mobileBUGFix.min.js内容见最下面附件 2.在build/webpack.base.conf.js文件中增加: module.exports = { externals: { 'MegaPixImage': 'MegaPixImage', 'JPEGEncoder': 'JPEGEncoder' } } 3.新建compressImage.js,内容如下: import MegaPixImage fro

各种音视频编解码学习详解

各种音视频编解码学习详解 媒体业务是网络的主要业务之间.尤其移动互联网业务的兴起,在运营商和应用开发商中,媒体业务份量极重,其中媒体的编解码服务涉及需求分析.应用开发.释放license收费等等.最近因为项目的关系,需要理清媒体的codec,比较搞的是,在豆丁网上看运营商的规范 标准,同一运营商同样的业务在不同文档中不同的要求,而且有些要求就我看来应当是历史的延续,也就是现在已经很少采用了.所以豆丁上看不出所以然,从 wiki上查.中文的wiki信息量有限,很短,而wiki的英文内容内多,删减版

视频编解码

所谓视频编码方式就是指通过特定的压缩技术,将某个视频格式的文件转换成另一种视频格式文件的方式.视频流传输中最为重要的编解码标准有国际电联的H.261.H.263.H.264,运动静止图像专家组的M-JPEG和国际标准化组织运动图像专家组的MPEG系列标准,此外在互联网上被广泛应用的还有Real-Networks的RealVideo.微软公司的WMV以及Apple公司的QuickTime等. 中文名 视频编码 外文名 Video Encoding 分    类 H.26x系列,MPEG系列,AVS

新旧摄像头的区别

网络摄像头简称WEBCAM ,英文全称为WEB CAMERA,是一种结合传统摄像机与网络技术所产生的新一代摄像机,它可以将影像透过网络传至地球另一端,且远端的浏览者不需用任何专业软件,只要标准的网络浏览器(如"Microsoft IE 或Netscape),即可监视其影像. 网络摄像头是传统摄像机与网络视频技术相结合的新一代产品,除了具备一般传统摄像机所有的图像捕捉功能外,机内还内置了数字化压缩控制器和基于WEB的操作系统,使得视频数据经压缩加密后,通过局域网,internet或无线网络送至终端

无损数据压缩算法的历史

引言 有两种主要的压缩算法: 有损和无损.有损压缩算法通过移除在保真情形下需要大量的数据去存储的小细节,从而使文件变小.在有损压缩里,因某些必要数据的移除,恢复原文件是不可能的.有损压缩主要用来存储图像和音频文件,同时通过移除数据可以达到一个比较高的压缩率,不过本文不讨论无损压缩.无损压缩,也使文件变小,但对应的解压缩功能可以精确的恢复原文件,不丢失任何数据.无损数据压缩被广泛的应用在计算机领域,从节省你个人电脑的空间,到通过web发送数据.使用Secure Shell交流,查看PNG或GIF图

HEVC算法和体系结构:预测编码之帧间预测

预测编码之帧间预测(Inter-Picture Prediction) 帧间预测是指利用视频时间域相关性,使用临近已编码图像像素预测当前图像的像素,以达到有效去除视频时域冗余的目的.由于视频序列通常包括较强的时域相关性,因此预测残差值接近于0,将残差信号作为后续模块的输入进行变换.量化.扫描及熵编码,可实现对视频信号的高效压缩. 一.帧间预测编码原理 目前主要的视频编码标准帧间预测部分都采用了基于块的运动补偿技术,如下图所示,其基本原理为:当前图像的每个像素块在之前已编码图像中寻找一个最佳匹配块

音视频编码基础知识

本文转载自 http://blog.csdn.net/ljzcom/article/details/7336258 ,如有需要,请移步查看. Technorati 标签: 音视频 编码 基础知识 --------------------------------分割线开始----------------------------------------------- 编解码学习笔记(一):基本概念 媒体业务是网络的主要业务之间.尤其移动互联网业务的兴起,在运营商和应用开发商中,媒体业务份量极重,其中

iOS音频技术的研究-音频格式

**什么是音频格式** 这个问题我也是查了很久才弄明白的.音频格式其实是指容器的类型,在通俗一点就是声音文件的类型,比如说"我爱你中国.mp3",这个声音文件的音频格式就是MP3. 这里稍微引入一些音频编码的东西.很多第一次涉及这个领域的(比如说我哈),很容易弄不清音频格式和音频编码的区别和联系,比如音频格式中有MP3格式,音频编码中有MP3编码,这时候多数人就不明白了. 音频编码本质是一种算法,我们拿到声音的原始数据之后,总不能直接就放到文件中用,我们需要根据不同的用途对于这些数据进