实现照片水印并且修改一些小bug

    本人也是菜鸟一枚, 这个简单的小项目也是参考了很多大神的文章。话不多说发代码!

package com.example.waterbitmap1;

import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Matrix;
import android.media.ExifInterface;
import android.media.MediaScannerConnection;
import android.media.MediaScannerConnection.OnScanCompletedListener;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.ImageView;

public class MainActivity extends Activity {
	private ImageView water_img;
	private Button water_btn;
	private Bitmap bitmap ;
	private MediaScannerConnection msc;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		initUI();
		photo();
	}
	private void photo() {
		water_btn.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				// 点击调用系统照相机程序,进行拍照
				Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
				Uri imageUri = Uri.fromFile(new File(Environment.getExternalStorageDirectory(),"model.jpg"));
				intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
                startActivityForResult(intent, 1);
			}
		});
	}
	private void initUI() {
		water_img = (ImageView) this.findViewById(R.id.water_img);
		water_btn = (Button) this.findViewById(R.id.water_btn);
		water_img.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				Intent intent = new Intent(Intent.ACTION_PICK);
				intent.setType("image/*");// 相片类型
				startActivityForResult(intent, 1);
			}
		});
	}
	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		super.onActivityResult(requestCode, resultCode, data);
		if(resultCode==Activity.RESULT_OK)
		{
			//开始检测SD卡
			if(MomeryUtils.externalMemoryAvailable())
			{
				//获取照片路径
				String imageUri = Environment.getExternalStorageDirectory()+"/model.jpg";
				//获取屏幕大小
				WindowManager wm = (WindowManager) this.getSystemService(Context.WINDOW_SERVICE);
				int width = wm.getDefaultDisplay().getWidth();
				int height = wm.getDefaultDisplay().getHeight();
				//转动角度(改)
				int readPictureDegree = readPictureDegree(imageUri);
				//获取照片
				bitmap = decodeSuitableBitmap(imageUri,width, height);
				//转动完的图片(改)
				Bitmap rotateBitmap = rotateBitmap(bitmap, readPictureDegree);
		         //添加水印和文字
		         Bitmap createBitmap = GreateWaterBitmap.createBitmap(rotateBitmap, "ff");
		         if(null!=createBitmap){
		        	 //保存水印照片
		        	 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd-hh-mm-ss");
		        	 FileUtils.saveFile(createBitmap, sdf.format(new Date(System.currentTimeMillis()))+"1.jpg",this);
		        	 water_btn.setVisibility(View.GONE);
		        	 water_img.setImageBitmap(createBitmap);
		         }
			}
		}
	}
	
	public static Bitmap decodeSuitableBitmap(String uri,  
            int targetWidth, int targetHeight) {  
        // 空手套白狼  
       final BitmapFactory.Options options = new BitmapFactory.Options();  
       options.inJustDecodeBounds = true;  
       BitmapFactory.decodeFile(uri, options);
       // 计算合适的inSampleSize  
        options.inSampleSize = getInSampleSize(options, targetWidth, targetHeight);  
       // 加载到内存  
      options.inJustDecodeBounds = false;  
     return BitmapFactory.decodeFile(uri, options);  
   }  
	public static int getInSampleSize(BitmapFactory.Options options,  
            int targetWidth, int targetHeight) {  
          // 原始图片的高度和宽度  
       final int height = options.outHeight;  
      final int width = options.outWidth;  
      int inSampleSize = 1;  
      if (height > targetHeight || width > targetWidth) {  
      // 计算出实际宽高和目标宽高的比率  
      final int heightRate = Math.round((float) height / (float) targetHeight);  
      final int widthRate = Math.round((float) width / (float) targetWidth);  
      inSampleSize = heightRate < widthRate ? heightRate : widthRate;  
     }  
    return inSampleSize;  
  }  
	
	//转动角度(改)
	   public static int readPictureDegree(String path) {  
           int degree  = 0;  
           try {  
                   ExifInterface exifInterface = new ExifInterface(path);  
                   int orientation = exifInterface.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL);  
                   switch (orientation) {  
                   case ExifInterface.ORIENTATION_ROTATE_90:  
                           degree = 90;  
                           break;  
                   case ExifInterface.ORIENTATION_ROTATE_180:  
                           degree = 180;  
                           break;  
                   case ExifInterface.ORIENTATION_ROTATE_270:  
                           degree = 270;  
                           break;  
                   }  
           } catch (IOException e) {  
                   e.printStackTrace();  
           }  
           return degree;  
   }  
	   /** (改)
	    * 旋转图片,使图片保持正确的方向。 
	    * @param bitmap 原始图片 
	    * @param degrees 原始图片的角度 
	    * @return Bitmap 旋转后的图片 
	    */  
	   public static Bitmap rotateBitmap(Bitmap bitmap, int degrees) {  
	       if (degrees == 0 || null == bitmap) {  
	           return bitmap;  
	       }  
	       Matrix matrix = new Matrix();  
	       matrix.setRotate(degrees, bitmap.getWidth() / 2, bitmap.getHeight() / 2);  
	       Bitmap bmp = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);  
	       if (null != bitmap) {  
	           bitmap.recycle();  
	       }  
	       return bmp;  
	   } 
	   

}


照片保存


package com.example.waterbitmap1;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

import android.content.Context;
import android.graphics.Bitmap;
import android.media.MediaScannerConnection;
import android.util.Log;

public class FileUtils {
	/**
	 * 把图片村保存在相应的文件当中
	 * @param pBitmap
	 * @param pPathName
	 */
    public static void saveFile(Bitmap pBitmap,String fileName,Context context)
    {
    	File file=new File("/sdcard/water_image");
    	if(!file.exists())
    	{
    		file.mkdirs();
    	}
    	String filePathName=file.getAbsolutePath()+"/"+fileName;
    	FileOutputStream fos=null;
    	try {
			fos=new FileOutputStream(filePathName);
			pBitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos);
			fos.flush();
			MediaScannerConnection.scanFile(context, new String[]{filePathName}, null, null);//照片及时在相册更新
		} catch (Exception e) {
		   e.printStackTrace();
		}finally
		{
			if(fos!=null)
			{
				try {
					fos.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
    } 
}

添加水印


package com.example.waterbitmap1;

import java.text.SimpleDateFormat;
import java.util.Date;

import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Typeface;
import android.graphics.Bitmap.Config;
import android.text.format.Time;

public class GreateWaterBitmap {
	
	private static String time;
	private static String dateTime;

	public static Bitmap createBitmap(Bitmap src, String str) {
		getDateTime();
		int w = src.getWidth();
		int h = src.getHeight();
		//水印文字
		String mstrTitle = str+"时间:"+" "+dateTime+" "+time;;
		Bitmap bmpTemp = Bitmap.createBitmap(w, h, Config.ARGB_8888);
		Canvas canvas = new Canvas(bmpTemp);
		Paint p = new Paint();
		String familyName = "宋体";
		Typeface font = Typeface.create(familyName, Typeface.BOLD);
		p.setColor(Color.BLUE);
		p.setTypeface(font);
		p.setTextSize(22);
		canvas.drawBitmap(src, 0, 0, p);
		//文字画的地方
		canvas.drawText(mstrTitle, w/2, h-20, p);
		canvas.save(Canvas.ALL_SAVE_FLAG);
		canvas.restore();
		return bmpTemp;
	}
	
	public static void getDateTime() {
		Date d = new Date();
		SimpleDateFormat datetime = new SimpleDateFormat("yyyy-MM-dd");
		SimpleDateFormat hour = new SimpleDateFormat("HH:mm");
		time = hour.format(d);
		dateTime = datetime.format(d);
	}

}


判断sd卡

package com.example.waterbitmap1;

public class MomeryUtils {

	// 判断SD卡是否存在
	public static boolean externalMemoryAvailable() {
		return android.os.Environment.getExternalStorageState().equals(
				android.os.Environment.MEDIA_MOUNTED);
	}
}

希望对大家有帮助,有什么问题也可以交流。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值