package com.fxy.baselibrary.util;

import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.Rect;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;

import static com.fxy.baselibrary.util.Tools.getScreenHeight;
import static com.fxy.baselibrary.util.Tools.getScreenWidth;


/**
 * 图片工具类
 * 
 * @author PeggyTong
 *
 */
public class ImageUtil {

	/**
	 * 设置水印图片在左上角
	 * 
	 * @param context
	 * @param src
	 * @param watermark
	 * @param paddingLeft
	 * @param paddingTop
	 * @return
	 */
	public static Bitmap createWaterMaskLeftTop(Context context, Bitmap src, Bitmap watermark, int paddingLeft, int paddingTop ) {

		return createWaterMaskBitmap( src, watermark, dp2px(context, paddingLeft ), dp2px( context,paddingTop ) );
	}
	/**
	 * 〈一句话功能简述〉截取Scrollview等ViewGroup里面的内容，常用于生成长微博，效果可参照简书的生成图片分享。
	 * 〈功能详细描述〉
	 * @param
	 * @return
	 * @exception/throws
	 */
	public static Bitmap snapShotForViewGroup(ViewGroup view) {
		int totalHeight = 0;
		// 获取ViewGroup实际高度
		for (int i = 0; i < view.getChildCount(); i++) {
			totalHeight += view.getChildAt(i).getHeight();
			view.getChildAt(i).setBackgroundColor(0xfff1f1f1);//这里可以设置背景颜色，以免背景透明看不出效果
		}
		Bitmap bitmap= Bitmap.createBitmap(view.getWidth(), totalHeight,
				Config.RGB_565);
		Canvas canvas = new Canvas(bitmap);
		view.draw(canvas);
		return bitmap;
	}
	/**
	 * 〈一句话功能简述〉获取当前屏幕截图，不包含状态栏以及标题栏（ActionBar）
	 * 〈功能详细描述〉
	 * @param
	 * @return
	 * @exception/throws
	 */
	public static Bitmap snapShotWithoutStatusBarAndTitle(Activity activity) {
		View view = activity.getWindow().getDecorView();
		view.setDrawingCacheEnabled(true);
		view.buildDrawingCache();
		Bitmap bitmap= view.getDrawingCache();
		Rect frame = new Rect();
		activity.getWindow().getDecorView().getWindowVisibleDisplayFrame(frame);
		int statusBarHeight = frame.top;//获取状态栏的高
		int titleBarHeight = activity.getWindow().findViewById(Window.ID_ANDROID_CONTENT).getTop();//获取标题栏的高
		int width = getScreenWidth(activity);//获取屏幕的宽
		int height = getScreenHeight(activity);//获取屏幕的高
		int totalBarHeight=titleBarHeight+statusBarHeight;
		Bitmap bm= Bitmap.createBitmap(bitmap, 0, totalBarHeight , width, height - totalBarHeight);
		view.destroyDrawingCache();
		return bm;
	}
	/**
	 * 〈一句话功能简述〉获取当前屏幕截图，不包含状态栏
	 * 〈功能详细描述〉
	 * @param
	 * @return
	 * @exception/throws
	 */
	public static Bitmap snapShotWithoutStatusBar(Activity activity) {
		View view = activity.getWindow().getDecorView();
		view.setDrawingCacheEnabled(true);
		view.buildDrawingCache();
		Bitmap bitmap= view.getDrawingCache();
		Rect frame = new Rect();
		activity.getWindow().getDecorView().getWindowVisibleDisplayFrame(frame);
		int statusBarHeight = frame.top;//获取状态栏的高
		int width = getScreenWidth(activity);//获取屏幕的宽
		int height = getScreenHeight(activity);//获取屏幕的高
		Bitmap bm = Bitmap.createBitmap(bitmap, 0, statusBarHeight, width, height - statusBarHeight);
		view.destroyDrawingCache();
		return bm;

	}
	private static Bitmap createWaterMaskBitmap(Bitmap src, Bitmap watermark, int paddingLeft, int paddingTop ) {

		if( src == null ) {
			return null;
		}
		int width = src.getWidth();
		int height = src.getHeight();
		// 创建一个bitmap
		Bitmap newb = Bitmap.createBitmap( width, height, Config.ARGB_8888 );// 创建一个新的和SRC长度宽度一样的位图
		// 将该图片作为画布
		Canvas canvas = new Canvas( newb );
		// 在画布 0，0坐标上开始绘制原始图片
		canvas.drawBitmap( src, 0, 0, null );
		// 在画布上绘制水印图片
		canvas.drawBitmap( watermark, paddingLeft, paddingTop, null );
		// 保存
		canvas.save( Canvas.ALL_SAVE_FLAG );
		// 存储
		canvas.restore();
		return newb;
	}


	/**
	 * 设置水印图片在右下角
	 * 
	 * @param context
	 * @param src
	 * @param watermark
	 * @param paddingRight
	 * @param paddingBottom
	 * @return
	 */
	public static Bitmap createWaterMaskRightBottom(Context context, Bitmap src, Bitmap watermark, int paddingRight, int paddingBottom ) {

		return createWaterMaskBitmap( src, watermark, src.getWidth() - watermark.getWidth() - dp2px(context, paddingRight ), src.getHeight() - watermark.getHeight()
				- dp2px(context, paddingBottom ) );
	}


	/**
	 * 设置水印图片到右上角
	 * 
	 * @param context
	 * @param src
	 * @param watermark
	 * @param paddingRight
	 * @param paddingTop
	 * @return
	 */
	public static Bitmap createWaterMaskRightTop(Context context, Bitmap src, Bitmap watermark, int paddingRight, int paddingTop ) {

		return createWaterMaskBitmap( src, watermark, src.getWidth() - watermark.getWidth() - dp2px(context, paddingRight ), dp2px(context, paddingTop ) );
	}


	/**
	 * 设置水印图片到左下角
	 * 
	 * @param context
	 * @param src
	 * @param watermark
	 * @param paddingLeft
	 * @param paddingBottom
	 * @return
	 */
	public static Bitmap createWaterMaskLeftBottom(Context context, Bitmap src, Bitmap watermark, int paddingLeft, int paddingBottom ) {

		return createWaterMaskBitmap( src, watermark, dp2px(context, paddingLeft ), src.getHeight() - watermark.getHeight() - dp2px(context, paddingBottom ) );
	}


	/**
	 * 设置水印图片到中间
	 * 
	 * @param src
	 * @param watermark
	 * @return
	 */
	public static Bitmap createWaterMaskCenter(Bitmap src, Bitmap watermark ) {

		return createWaterMaskBitmap( src, watermark, ( src.getWidth() - watermark.getWidth() ) / 2, ( src.getHeight() - watermark.getHeight() ) / 2 );
	}


	/**
	 * 给图片添加文字到左上角
	 * 
	 * @param context
	 * @param bitmap
	 * @param text
	 * @return
	 */
	public static Bitmap drawTextToLeftTop(Context context, Bitmap bitmap, String text, int size, int color, int paddingLeft, int paddingTop ) {

		Paint paint = new Paint( Paint.ANTI_ALIAS_FLAG );
		paint.setColor( color );
		paint.setTextSize( dp2px(context, size ) );
		Rect bounds = new Rect();
		paint.getTextBounds( text, 0, text.length(), bounds );
		return drawTextToBitmap( bitmap, text, paint, bounds, dp2px(context, paddingLeft ), dp2px(context, paddingTop ) + bounds.height() );
	}


	/**
	 * 绘制文字到右下角
	 * 
	 * @param context
	 * @param bitmap
	 * @param text
	 * @param size
	 * @param color
	 * @param paddingRight
	 * @param paddingBottom
	 * @return
	 */
	public static Bitmap drawTextToRightBottom(Context context, Bitmap bitmap, String text, int size, int color, int paddingRight, int paddingBottom ) {

		Paint paint = new Paint( Paint.ANTI_ALIAS_FLAG );
		paint.setColor( color );
		paint.setTextSize( dp2px(context, size ) );
		Rect bounds = new Rect();
		paint.getTextBounds( text, 0, text.length(), bounds );
		return drawTextToBitmap( bitmap, text, paint, bounds, bitmap.getWidth() - bounds.width() - dp2px(context, paddingRight ), bitmap.getHeight()
				- dp2px(context, paddingBottom ) );
	}


	/**
	 * 绘制文字到右上方
	 * 
	 * @param context
	 * @param bitmap
	 * @param text
	 * @param size
	 * @param color
	 * @param paddingRight
	 * @param paddingTop
	 * @return
	 */
	public static Bitmap drawTextToRightTop(Context context, Bitmap bitmap, String text, int size, int color, int paddingRight, int paddingTop ) {

		Paint paint = new Paint( Paint.ANTI_ALIAS_FLAG );
		paint.setColor( color );
		paint.setTextSize( dp2px(context, size ) );
		Rect bounds = new Rect();
		paint.getTextBounds( text, 0, text.length(), bounds );
		return drawTextToBitmap( bitmap, text, paint, bounds, bitmap.getWidth() - bounds.width() - dp2px( context,paddingRight ), dp2px( context,paddingTop ) + bounds.height() );
	}


	/**
	 * 绘制文字到左下方
	 * 
	 * @param context
	 * @param bitmap
	 * @param text
	 * @param size
	 * @param color
	 * @param paddingLeft
	 * @param paddingBottom
	 * @return
	 */
	public static Bitmap drawTextToLeftBottom(Context context, Bitmap bitmap, String text, int size, int color, int paddingLeft, int paddingBottom ) {

		Paint paint = new Paint( Paint.ANTI_ALIAS_FLAG );
		paint.setColor( color );
		paint.setTextSize( dp2px( context,size ) );
		Rect bounds = new Rect();
		paint.getTextBounds( text, 0, text.length(), bounds );
		return drawTextToBitmap( bitmap, text, paint, bounds, dp2px(context, paddingLeft ), bitmap.getHeight() - dp2px( context,paddingBottom ) );
	}


	/**
	 * 绘制文字到中间
	 * 
	 * @param context
	 * @param bitmap
	 * @param text
	 * @param size
	 * @param color
	 * @return
	 */
	public static Bitmap drawTextToCenter(Context context, Bitmap bitmap, String text, int size, int color ) {

		Paint paint = new Paint( Paint.ANTI_ALIAS_FLAG );
		paint.setColor( color );
		paint.setTextSize( dp2px(context, size ) );
		Rect bounds = new Rect();
		paint.getTextBounds( text, 0, text.length(), bounds );
		return drawTextToBitmap( bitmap, text, paint, bounds, ( bitmap.getWidth() - bounds.width() ) / 2, ( bitmap.getHeight() + bounds.height() ) / 2 );
	}


	// 图片上绘制文字
	private static Bitmap drawTextToBitmap(Bitmap bitmap, String text, Paint paint, Rect bounds, int paddingLeft, int paddingTop ) {

		Config bitmapConfig = bitmap.getConfig();

		paint.setDither( true ); // 获取跟清晰的图像采样
		paint.setFilterBitmap( true );// 过滤一些
		if( bitmapConfig == null ) {
			bitmapConfig = Config.ARGB_8888;
		}
		bitmap = bitmap.copy( bitmapConfig, true );
		Canvas canvas = new Canvas( bitmap );

		canvas.drawText( text, paddingLeft, paddingTop, paint );
		return bitmap;
	}


	/**
	 * 缩放图片
	 * 
	 * @param src
	 * @param w
	 * @param h
	 * @return
	 */
	public static Bitmap scaleWithWH(Bitmap src, double w, double h ) {

		if( w == 0 || h == 0 || src == null ) {
			return src;
		} else {
			// 记录src的宽高
			int width = src.getWidth();
			int height = src.getHeight();
			// 创建一个matrix容器
			Matrix matrix = new Matrix();
			// 计算缩放比例
			float scaleWidth = ( float )( w / width );
			float scaleHeight = ( float )( h / height );
			// 开始缩放
			matrix.postScale( scaleWidth, scaleHeight );
			// 创建缩放后的图片
			return Bitmap.createBitmap( src, 0, 0, width, height, matrix, true );
		}
	}


	/**
	 * dip转pix
	 *
	 * @param mContext
	 * @param dp
	 * @return
	 */
	public static int dp2px(Context mContext, int dp ) {

		return DisplayUtil.dip2px( mContext,dp );
	}
}
