实现照片水印并且修改一些小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
- 实现照片水印并且修改一些小bug
- android开发一些小bug
- javamail的一些小bug
- Python3 照片打水印
- metinfo 5.0图片水印bug修改和支持透明背景png水印功能的增加
- 【小企】WPF实现TextBox水印效果
- 修改bug小经验积累总结
- 修改bug的一个小故事
- 短信模块一些bug的修改
- BUG修改的一些感触和心得
- android studio 的一些bug修改
- 修改了TabPagerIndicator开源库的一些bug
- Liferay 4.2 中的一些小Bug
- 前端设计的一些小BUG
- 一些小Bug,技巧以及注意事项
- 一些照片
- 一些小功能实现
- Android调用系统相机拍照,并且模仿实现水印相机简单功能
- OAuth
- shell基本字符串处理2
- table td 中定义了 width 但 overflow 不起作用的解决方法
- Android-UIL图片缓存框架 源码解析
- ios 上传图片到服务器两种方式
- 实现照片水印并且修改一些小bug
- Facebook ReDex说明以及使用链接
- Spring 实现远程访问详解——jms和activemq
- 有关BCB使用GDI+
- Mysql游标遍历
- HBASE 常用JAVA API使用指南
- java Exception的限制
- Android UUID主键生成器
- 正则表达式各个方法