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

来源:互联网 发布:linux查看宕机 编辑:程序博客网 时间:2024/04/29 03:33

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

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;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initUI();photo();}private void photo() {water_btn.setOnClickListener(new OnClickListener() {@Overridepublic 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() {@Overridepublic void onClick(View v) {Intent intent = new Intent(Intent.ACTION_PICK);intent.setType("image/*");// 相片类型startActivityForResult(intent, 1);}});}@Overrideprotected 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);}}

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


0 0