Android 图片处理 常用代码快

/**
 * 按照大小裁剪图片的中间部分(常用于生成缩略图)
 * @param bitmap 要裁剪的图片
 * @param thumbSize 缩略图的的大小:thumbSize*thumbSize
 * @return
 */
	public Bitmap clipThumb(Bitmap bitmap,int thumbSize){
		Bitmap thumbBitmap = null; 
		if(thumbSize > 0 && bitmap != null){
			int width = bitmap.getWidth();
			int height = bitmap.getHeight();
			Rect src = new Rect();
			if(width < height){
				src.set(0,(height - width)/2,width,(height - width)/2 + width);
			}else{
				src.set((width - height)/2,0,(width - height)/2 + height,height);
			}
			if(thumbSize >src.width()){
				thumbSize = src.width();
			}
			thumbBitmap = Bitmap.createBitmap(thumbSize,thumbSize,Config.RGB_565);
			Canvas canvas = new Canvas(thumbBitmap);
			canvas.setDrawFilter(new PaintFlagsDrawFilter(0, Paint.ANTI_ALIAS_FLAG | Paint.FILTER_BITMAP_FLAG));
			canvas.drawBitmap(bitmap, src, new Rect(0,0,thumbSize,thumbSize),null);
		}
			return thumbBitmap;
	}
/**
	 * 在指定位图上画虚线框
	 * @param rect
	 * @param bitmap
	 */
	  private void drawTextBound(RectF rect,Bitmap bitmap){
	    	Canvas canvas = new Canvas(bitmap);
	    	Paint paint = new Paint();
	    	paint.setStyle(Paint.Style.STROKE); 
	    	paint.setColor(Color.WHITE);
	    	paint.setStrokeWidth(5);
	    	PathEffect effects = new DashPathEffect(new float[]{5,5,5,5},1);  
	    	paint.setPathEffect(effects);
	    	canvas.drawRect(rect,paint);
	    }
/**
	 * 得到手机内图片的旋转角度
	 * @param imagePath 图片的完整路径
	 * @return
	 */
	public static int getJpgRotation(String imagePath)
	{
		if(imagePath == null)
			return 0;
		if(imagePath.endsWith(".jpg") == false && imagePath.endsWith(".JPG") ==  false && imagePath.endsWith(".dat") == false && imagePath.endsWith(".dat") == false)
			return 0;
		ExifInterface exif;
		try {
			exif = new ExifInterface(imagePath);
			String r = exif.getAttribute(ExifInterface.TAG_ORIENTATION);
			if(r != null && r.length() > 0)
			{
				int ori =  Integer.parseInt(r);
				switch(ori)
				{
				case ExifInterface.ORIENTATION_ROTATE_90:
					return 90;
				case ExifInterface.ORIENTATION_ROTATE_180:
					return 180;
				case ExifInterface.ORIENTATION_ROTATE_270:
					return 270;
				}
			}
		} catch (Exception e) {
		}
		return 0;
	}



package com.example.circleimageview;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.BitmapShader;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.RectF;
import android.graphics.Shader;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.util.Log;
import android.widget.ImageView;
/**
 * 圆形边框的圆形ImageView
 *
 */
public class CircleImageView extends ImageView {

    private static final ScaleType SCALE_TYPE = ScaleType.CENTER_CROP;

    private static final Bitmap.Config BITMAP_CONFIG = Bitmap.Config.ARGB_8888;
    private static final int COLORDRAWABLE_DIMENSION = 1;

    private static final int DEFAULT_BORDER_WIDTH = 0;
    private static final int DEFAULT_BORDER_COLOR = Color.BLACK;

    private final RectF mDrawableRect = new RectF();
    private final RectF mBorderRect = new RectF();

    private final Matrix mShaderMatrix = new Matrix();
    private final Paint mBitmapPaint = new Paint();
    private final Paint mBorderPaint = new Paint();

    private int mBorderColor = DEFAULT_BORDER_COLOR;
    private int mBorderWidth = DEFAULT_BORDER_WIDTH;

    private Bitmap mBitmap;
    private BitmapShader mBitmapShader;//??
    private int mBitmapWidth;
    private int mBitmapHeight;

    private float mDrawableRadius;
    private float mBorderRadius;

    private boolean mReady;//??
    private boolean mSetupPending;//??

    public CircleImageView(Context context) {
        super(context);
    }

    public CircleImageView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public CircleImageView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        super.setScaleType(SCALE_TYPE);

//        TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.CircleImageView, defStyle, 0);

//        mBorderWidth = a.getDimensionPixelSize(R.styleable.CircleImageView_border_width, DEFAULT_BORDER_WIDTH);
//        mBorderColor = a.getColor(R.styleable.CircleImageView_border_color, DEFAULT_BORDER_COLOR);
//
//        a.recycle();
        
        mBorderWidth = 52;//圆框的厚度

        mReady = true;

        if (mSetupPending) {
            setup();
            mSetupPending = false;
        }
    }

    @Override
    public ScaleType getScaleType() {
        return SCALE_TYPE;
    }

    @Override
    public void setScaleType(ScaleType scaleType) {
        if (scaleType != SCALE_TYPE) {
            throw new IllegalArgumentException(String.format("ScaleType %s not supported.", scaleType));
        }
    }

    @Override
    protected void onDraw(Canvas canvas) {
        if (getDrawable() == null) {
            return;
        }

        canvas.drawCircle(getWidth() / 2, getHeight() / 2, mDrawableRadius, mBitmapPaint);
        if(mBorderWidth != 0){
          canvas.drawCircle(getWidth() / 2, getHeight() / 2, mBorderRadius, mBorderPaint);
        }
    }

    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);
        setup();
    }

    public int getBorderColor() {
        return mBorderColor;
    }

    public void setBorderColor(int borderColor) {
        if (borderColor == mBorderColor) {
            return;
        }

        mBorderColor = borderColor;
        mBorderPaint.setColor(mBorderColor);
        invalidate();
    }

    public int getBorderWidth() {
        return mBorderWidth;
    }

    public void setBorderWidth(int borderWidth) {
        if (borderWidth == mBorderWidth) {
            return;
        }

        mBorderWidth = borderWidth;
        setup();
    }

    @Override
    public void setImageBitmap(Bitmap bm) {
        super.setImageBitmap(bm);
        mBitmap = bm;
        setup();
    }

    @Override
    public void setImageDrawable(Drawable drawable) {
        super.setImageDrawable(drawable);
        mBitmap = getBitmapFromDrawable(drawable);
        setup();
    }

    @Override
    public void setImageResource(int resId) {
        super.setImageResource(resId);
        mBitmap = getBitmapFromDrawable(getDrawable());
        setup();
    }

    private Bitmap getBitmapFromDrawable(Drawable drawable) {
        if (drawable == null) {
            return null;
        }

        if (drawable instanceof BitmapDrawable) {
            return ((BitmapDrawable) drawable).getBitmap();
        }

        try {
            Bitmap bitmap;

            if (drawable instanceof ColorDrawable) {
                bitmap = Bitmap.createBitmap(COLORDRAWABLE_DIMENSION, COLORDRAWABLE_DIMENSION, BITMAP_CONFIG);
            } else {
                bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), BITMAP_CONFIG);
            }

            Canvas canvas = new Canvas(bitmap);
            drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
            drawable.draw(canvas);
            return bitmap;
        } catch (OutOfMemoryError e) {
            return null;
        }
    }

    private void setup() {
        if (!mReady) {
            mSetupPending = true;
            return;
        }

        if (mBitmap == null) {
            return;
        }
        mBitmapShader = new BitmapShader(mBitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);

        mBitmapPaint.setAntiAlias(true);
        mBitmapPaint.setShader(mBitmapShader);

        mBorderPaint.setStyle(Paint.Style.STROKE);//设画笔为空心
        mBorderPaint.setAntiAlias(true);
        mBorderPaint.setColor(mBorderColor);
        mBorderPaint.setStrokeWidth(mBorderWidth);

        mBitmapHeight = mBitmap.getHeight();
        mBitmapWidth = mBitmap.getWidth();

        mBorderRect.set(0, 0, getWidth(), getHeight());
        mBorderRadius = Math.min((mBorderRect.height() - mBorderWidth) / 2, (mBorderRect.width() - mBorderWidth) / 2);//画圆形边框的半径

        mDrawableRect.set(mBorderWidth, mBorderWidth, mBorderRect.width() - mBorderWidth, mBorderRect.height() - mBorderWidth);
        mDrawableRadius = Math.min(mDrawableRect.height() / 2, mDrawableRect.width() / 2);//画圆心位图的半径

        updateShaderMatrix();
        invalidate();
    }

    private void updateShaderMatrix() {
        float scale;
        float dx = 0;
        float dy = 0;

        mShaderMatrix.set(null);
        //根据已定义好的位图区域,按比例对原图缩放
        if (mBitmapWidth * mDrawableRect.height() > mDrawableRect.width() * mBitmapHeight) {
            scale = mDrawableRect.height() / (float) mBitmapHeight;
            dx = (mDrawableRect.width() - mBitmapWidth * scale) * 0.5f;
        } else {
            scale = mDrawableRect.width() / (float) mBitmapWidth;
            dy = (mDrawableRect.height() - mBitmapHeight * scale) * 0.5f;
        }

        mShaderMatrix.setScale(scale, scale);//x和y轴上的缩放系数
        mShaderMatrix.postTranslate((int) (dx + 0.5f) + mBorderWidth, (int) (dy + 0.5f) + mBorderWidth);//位图居中,留一点空间给边框

        mBitmapShader.setLocalMatrix(mShaderMatrix);
    }

}

package com.example.gifview;

import android.annotation.TargetApi;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Movie;
import android.os.Build;
import android.util.AttributeSet;
import android.view.View;

/**
 * 用于显示gif的View
 * 用法:在XML或代码里面定义,需要在代码里面调用setGifResource方法设置gif资源ID
 * 有bug:未对原gif进行压缩,较大gif会出现oom
 * @author ebirdfighter
 *
 */
public class GifView extends View {
    private Movie mMovie;
    private long startTime;
    private  int gifDuration;
    private boolean isBeginPlay=true;
	public GifView(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);
		init();
	}

	public GifView(Context context, AttributeSet attrs) {
		super(context, attrs);
		init();
	}

	public GifView(Context context) {
		super(context);
		init();
	}
	
	@TargetApi(Build.VERSION_CODES.HONEYCOMB)
	private void init(){
		mMovie = Movie.decodeStream(getResources().openRawResource(R.drawable.test));
		gifDuration= mMovie.duration();
		/**
		 * Starting from HONEYCOMB have to turn off HW acceleration to draw
		 * Movie on Canvas.
		 */
		if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
			setLayerType(View.LAYER_TYPE_SOFTWARE, null);
		}
	}
	
	public void setGifResource(int resId){
		mMovie = Movie.decodeStream(getResources().openRawResource(resId));
		gifDuration= mMovie.duration();
	}
	
	@Override
	protected void onDraw(Canvas canvas) {
		super.onDraw(canvas);
		// 从开机到现在的毫秒(不包括手机睡眠的时间在内)
		long currrentTime = android.os.SystemClock.uptimeMillis();
		if (isBeginPlay) {
			startTime = currrentTime;
			isBeginPlay = false;
		}

		int playTime = (int) ((currrentTime - startTime) % gifDuration);
		mMovie.setTime(playTime);
		mMovie.draw(canvas, 0, 0);
		invalidate();
	}

}

 
/**
	 * 保存指定大小(kb)的位图
	 * @param bitmapData 位图的字节数组
	 * @param bitmapLimitSize 限制位图的大小 以kb为单位
	 * @param bitmapSavePath 位图的保存路径
	 */
	public void saveBitmap(byte[] bitmapData,int bitmapLimitSize,String bitmapSavePath){
		BitmapFactory.Options options = new BitmapFactory.Options();
		options.inJustDecodeBounds = true;
		options.inPreferredConfig = Config.ARGB_8888;//declare each pixel is stored on 4 bytes
		BitmapFactory.decodeByteArray(bitmapData, 0, bitmapData.length,options);
		int bitmapMemSize = options.outHeight * options.outWidth * 4 / 8/ 1024;
		int sampleSize = 1;
		while(bitmapMemSize / (sampleSize * sampleSize) > bitmapLimitSize){
			sampleSize++;
		}
		options.inJustDecodeBounds = false;
		options.inSampleSize = sampleSize;
		Bitmap bitmap = BitmapFactory.decodeByteArray(bitmapData, 0, bitmapData.length,options);
		File file = new File(bitmapSavePath);
		try {
			BufferedOutputStream bos = new BufferedOutputStream(
					new FileOutputStream(file));
			bitmap.compress(Bitmap.CompressFormat.JPEG, 100, bos);
			bos.flush();
			bos.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

/**
	 *	按指定角度将位图旋转
	 * @param src 源位图
	 * @param degrees 要旋转的角度
	 * @return
	 */
	private Bitmap rotateBitmap(Bitmap src,int degrees){
<span style="white-space:pre">	</span>  Matrix matrix = new Matrix();
          matrix.reset();
          matrix.setRotate(degrees);
          Bitmap dstBitmap = Bitmap.createBitmap(src,0,0, src.getWidth(), src.getHeight(),matrix, true);
          src.recycle();
          return dstBitmap;
<span style="white-space:pre">	</span>}



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值