如果您想了解FastStoneCapture怎么添加水印-给图片添加水印方法的相关知识,那么本文是一篇不可错过的文章,我们将对faststonecapture怎么用进行全面详尽的解释,并且为您提供关于
如果您想了解FastStone Capture怎么添加水印-给图片添加水印方法的相关知识,那么本文是一篇不可错过的文章,我们将对faststone capture怎么用进行全面详尽的解释,并且为您提供关于Android给图片添加水印、asp .net实现给图片添加图片水印方法示例、ASP.NET -- WebForm -- 给图片添加水印标记、C#生成缩略图,C#给图片添加水印的有价值的信息。
本文目录一览:- FastStone Capture怎么添加水印-给图片添加水印方法(faststone capture怎么用)
- Android给图片添加水印
- asp .net实现给图片添加图片水印方法示例
- ASP.NET -- WebForm -- 给图片添加水印标记
- C#生成缩略图,C#给图片添加水印
FastStone Capture怎么添加水印-给图片添加水印方法(faststone capture怎么用)
FastStone Capture怎么给图片添加水印呢?最近有很多朋友在咨询小编,那么针对这个问题,小编今天就为大家带来了FastStone Capture给图片添加水印方法哦,还不太清楚的朋友们赶快来看看吧。
首先,打开FastStone Capture,点击选项卡的第一个图标的下拉菜单中的打开

然后,点击上方菜单栏的特效——边缘/水印

接着,弹出对话框,勾选水印图像

点击浏览,添加你的水印

接着,更改水印位置、不透明度,然后应用

效果如下,添加水印成功

以上就是小编带来的FastStone Capture给图片添加水印方法,希望对大家有用哦。
Android给图片添加水印
1. 前言
PS:最近在项目执行过程中有这样一个需求,要求拍完照的图片必须达到以上的效果。需求分析:
- 使用用预览布局SurfaceView,在不局上方使用控件的方式来进行设计,最后通过截图的方式将画面进行保存。
- 使用图片添加水印的方式来完成。
2. 方法1 使用SurfaceView
我心想这不简单吗?于是开始一顿balabala的操作,结果到最后一步时发现,SurfaceView居然不能进行截图,截图下来的图片居然是一张黑色的。简单地说这是因为SurfaceView的特性决定的,我们知道安卓中唯一可以在子线程中进行绘制的view就只有Surfaceview了。他可以独立于子线程中绘制,不会导致主线程的卡顿,至于造成surfaceView黑屏的原因,可以移步这里 Android视图SurfaceView的实现原理分析。如果非要使用此方式时还是有三种思路来进行解决: 采用三种思路:
1. 获取源头视频的截图作为SurfaceView的截图
2. 获取SurfaceView的画布canvas,将canvas保存成Bitmap
3. 直接截取整个屏幕,然后在截图SurfaceView位置的图
但是我觉得这种方式太过繁琐,所以选择用添加水印的式来完成。
3. 方法2 给拍照下来的图片添加水印
第一步:获取拍照权限
<!--相机权限--> <uses-permission android:name="android.permission.CAMERA" /> <!--访问外部权限--> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
这里使用到郭霖大佬的开源库PermissionX获取权限:
PermissionX.init(this) .permissions(Manifest.permission.CAMERA, Manifest.permission.RECORD_AUDIO) .onExplainRequestReason { scope, deniedList -> val message = "需要您同意以下权限才能正常使用" scope.showRequestReasonDialog(deniedList, message, "确定", "取消") } .request { allGranted, grantedList, deniedList -> if (allGranted) { openCamera() } else { Toast.makeText(activity, "您拒绝了如下权限:$deniedList", Toast.LENGTH_SHORT).show() } }
第二步:拍照
android 6.0以后,相机权限需要动态申请。
// 申请相机权限的requestCode private static final int PERMISSION_CAMERA_REQUEST_CODE = 0x00000012; /** * 检查权限并拍照。 * 调用相机前先检查权限。 */ private void checkPermissionAndCamera() { int hasCameraPermission = ContextCompat.checkSelfPermission(getApplication(), Manifest.permission.CAMERA); if (hasCameraPermission == PackageManager.PERMISSION_GRANTED) { //有调起相机拍照。 openCamera(); } else { //没有权限,申请权限。 ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.CAMERA}, PERMISSION_CAMERA_REQUEST_CODE); } } /** * 处理权限申请的回调。 */ @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { if (requestCode == PERMISSION_CAMERA_REQUEST_CODE) { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { //允许权限,有调起相机拍照。 openCamera(); } else { //拒绝权限,弹出提示框。 Toast.makeText(this,"拍照权限被拒绝",Toast.LENGTH_LONG).show(); } } }
调用相机进行拍照
申请权限后,就可以调起相机拍照了。调用相机只需要调用startActivityForResult传一个Intent就可以了,但是这个Intent需要传递一个uri,用于保存拍出来的图片,创建这个uri时,各个Android版本有所不同,需要进行版本兼容。
//用于保存拍照图片的uri private Uri mCameraUri; // 用于保存图片的文件路径,Android 10以下使用图片路径访问图片 private String mCameraImagePath; // 是否是Android 10以上手机 private boolean isAndroidQ = Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.Q; /** * 调起相机拍照 */ private void openCamera() { Intent captureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); // 判断是否有相机 if (captureIntent.resolveActivity(getPackageManager()) != null) { File photoFile = null; Uri photoUri = null; if (isAndroidQ) { // 适配android 10 photoUri = createImageUri(); } else { try { photoFile = createImageFile(); } catch (IOException e) { e.printStackTrace(); } if (photoFile != null) { mCameraImagePath = photoFile.getAbsolutePath(); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { //适配Android 7.0文件权限,通过FileProvider创建一个content类型的Uri photoUri = FileProvider.getUriForFile(this, getPackageName() + ".fileprovider", photoFile); } else { photoUri = Uri.fromFile(photoFile); } } } mCameraUri = photoUri; if (photoUri != null) { captureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri); captureIntent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION); startActivityForResult(captureIntent, CAMERA_REQUEST_CODE); } } } /** * 创建图片地址uri,用于保存拍照后的照片 Android 10以后使用这种方法 */ private Uri createImageUri() { String status = Environment.getExternalStorageState(); // 判断是否有SD卡,优先使用SD卡存储,当没有SD卡时使用手机存储 if (status.equals(Environment.MEDIA_MOUNTED)) { return getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, new ContentValues()); } else { return getContentResolver().insert(MediaStore.Images.Media.INTERNAL_CONTENT_URI, new ContentValues()); } } /** * 创建保存图片的文件 */ private File createImageFile() throws IOException { String imageName = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault()).format(new Date()); File storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES); if (!storageDir.exists()) { storageDir.mkdir(); } File tempFile = new File(storageDir, imageName); if (!Environment.MEDIA_MOUNTED.equals(EnvironmentCompat.getStorageState(tempFile))) { return null; } return tempFile; }
接收拍照结果
@Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == CAMERA_REQUEST_CODE) { if (resultCode == RESULT_OK) { if (isAndroidQ) { // Android 10 使用图片uri加载 ivPhoto.setImageURI(mCameraUri); } else { // 使用图片路径加载 ivPhoto.setImageBitmap(BitmapFactory.decodeFile(mCameraImagePath)); } } else { Toast.makeText(this,"取消",Toast.LENGTH_LONG).show(); } } }
注意:
这两需要说明一下,Android 10由于文件权限的关系,显示手机储存卡里的图片不能直接使用图片路径,需要使用图片uri加载。
另外虽然我在这里对Android 10和10以下的手机使用了不同的方式创建uri 和加载图片,但其实Android 10创建uri的方式和使用uri加载图片的方式在10以下的手机是同样适用的。 android 7.0需要配置文件共享。
<provider android:name="androidx.core.content.FileProvider" android:authorities="${applicationId}.fileprovider" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths" /> </provider>
在res目录下创建文件夹xml ,放置一个文件file_paths.xml(文件名可以随便取),配置需要共享的文件目录,也就是拍照图片保存的目录。
<?xml version="1.0" encoding="utf-8"?> <resources> <paths> <!-- 这个是保存拍照图片的路径,必须配置。 --> <external-files-path name="images" path="Pictures" /> </paths> </resources>
第三步:给拍照后得到的图片添加水印
@Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == CAMERA_REQUEST_CODE) { if (resultCode == RESULT_OK) { Bitmap mp; if (isAndroidQ) { // Android 10 使用图片uri加载 mp = MediaStore.Images.Media.getBitmap(this.contentResolver, t.uri); } else { // Android 10 以下使用图片路径加载 mp = BitmapFactory.decodeFile(uri); } //对图片添加水印 这里添加一张图片为示例: ImageUtil.drawTextToLeftTop(this,mp,"示例文字",30,R.color.black,20,30) } else { Toast.makeText(this,"取消",Toast.LENGTH_LONG).show(); } } }
这里使用到一个ImageUtil工具类,我在这里贴上。如果需要使用可以直接拿走~
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)); } 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, Bitmap.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(context, bitmap, text, paint, bounds, dp2px(context, paddingLeft), dp2px(context, paddingTop) + bounds.height()); } /** * 绘制文字到右下角 * * @param context * @param bitmap * @param text * @param size * @param color * @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(context, 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(context, 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(context, 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(context, bitmap, text, paint, bounds, (bitmap.getWidth() - bounds.width()) / 2, (bitmap.getHeight() + bounds.height()) / 2); } //图片上绘制文字 private static Bitmap drawTextToBitmap(Context context, Bitmap bitmap, String text, Paint paint, Rect bounds, int paddingLeft, int paddingTop) { android.graphics.Bitmap.Config bitmapConfig = bitmap.getConfig(); paint.setDither(true); // 获取跟清晰的图像采样 paint.setFilterBitmap(true);// 过滤一些 if (bitmapConfig == null) { bitmapConfig = android.graphics.Bitmap.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 context * @param dp * @return */ public static int dp2px(Context context, float dp) { final float scale = context.getResources().getDisplayMetrics().density; return (int) (dp * scale + 0.5f); } }
4. 最终实现的效果如下
5.总结
整体来说没有什么太大的问题,添加水印的原理就是通过Canvas绘制的方式将文字/图片添加到图片上。最后再将修改之后的图片呈现给用户。同时也记录下SurfaceView截图黑屏的问题。
以上就是Android实现添加水印功能的详细内容,更多关于Android 添加水印的资料请关注其它相关文章!
- Android使用Opengl录像时添加水印
- android实现文字水印效果 支持多行水印
- Android图片添加水印图片并把图片保存到文件存储的实现代码
- Android给任何view添加全屏倾斜水印
- Android 给图片加上水印的示例代码(支持logo+文字)
- Android 图片添加水印的实现方法
- Android给图片加文字和图片水印实例代码
- Android实现分享长图并且添加全图水印
- android使用ItemDecoration给RecyclerView 添加水印
- Android实现为图片添加水印
- Android添加水印的正确方法 只要三步!
- Android视频处理之动态时间水印效果
asp .net实现给图片添加图片水印方法示例
前言
本文主要给大家介绍的是asp .net实现给图片添加图片水印的方法,注意是图片水印,需要的朋友们可以参考学习,下面话不多说来看看详细的介绍吧。
方法如下
首先写好一个写入图片水印的类,先创建一个ImageWriter类库 (该类中有包含枚举类型和方法)
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; using System.Collections; using System.Drawing; using System.Drawing.Drawing2D; using System.Drawing.Imaging; namespace ImageWriter { /// <summary> /// 图片处理类 /// </summary> public class ImageManager { #region 变量声明开始 /// <summary> /// 枚举: 水印位置 /// </summary> public enum WatermarkPosition { /// <summary> /// 左上 /// </summary> LeftTop, /// <summary> /// 左中 /// </summary> Left, /// <summary> /// 左下 /// </summary> LeftBottom, /// <summary> /// 正上 /// </summary> Top, /// <summary> /// 正中 /// </summary> Center, /// <summary> /// 正下 /// </summary> Bottom, /// <summary> /// 右上 /// </summary> RightTop, /// <summary> /// 右中 /// </summary> RightCenter, /// <summary> /// 右下 /// </summary> RigthBottom } #endregion 变量声明结束 #region 构造函数开始 /// <summary> /// 构造函数: 默认 /// </summary> public ImageManager() { } #endregion 构造函数结束 #region 私有函数开始 /// <summary> /// 获取: 图片去扩展名(包含完整路径及其文件名)小写字符串 /// </summary> /// <param name="path">图片路径(包含完整路径,文件名及其扩展名): string</param> /// <returns>返回: 图片去扩展名(包含完整路径及其文件名)小写字符串: string</returns> private string GetFileName(string path) { return path.Remove(path.LastIndexOf(''.'')).ToLower(); } /// <summary> /// 获取: 图片以''.''开头的小写字符串扩展名 /// </summary> /// <param name="path">图片路径(包含完整路径,文件名及其扩展名): string</param> /// <returns>返回: 图片以''.''开头的小写字符串扩展名: string</returns> private string GetExtension(string path) { return path.Remove(0, path.LastIndexOf(''.'')).ToLower(); } /// <summary> /// 获取: 图片以 ''.'' 开头的小写字符串扩展名对应的 System.Drawing.Imaging.ImageFormat 对象 /// </summary> /// <param name="format">以 ''. ''开头的小写字符串扩展名: string</param> /// <returns>返回: 图片以 ''.'' 开头的小写字符串扩展名对应的 System.Drawing.Imaging.ImageFormat 对象: System.Drawing.Imaging.ImageFormat</returns> private ImageFormat GetImageFormat(string format) { switch (format) { case ".bmp": return ImageFormat.Bmp; case ".emf": return ImageFormat.Emf; case ".exif": return ImageFormat.Exif; case ".gif": return ImageFormat.Gif; case ".ico": return ImageFormat.Icon; case ".png": return ImageFormat.Png; case ".tif": return ImageFormat.Tiff; case ".tiff": return ImageFormat.Tiff; case ".wmf": return ImageFormat.Wmf; default: return ImageFormat.Jpeg; } } /// <summary> /// 获取: 枚举 Uinatlex.ToolBox.ImageManager.WatermarkPosition 对应的 System.Drawing.Rectangle 对象 /// </summary> /// <param name="positon">枚举 Uinatlex.ToolBox.ImageManager.WatermarkPosition: Uinatlex.ToolBox.ImageManager.WatermarkPosition</param> /// <param name="X">原图宽度: int</param> /// <param name="Y">原图高度: int</param> /// <param name="x">水印宽度: int</param> /// <param name="y">水印高度: int</param> /// <param name="i">边距: int</param> /// <returns>返回: 枚举 Uinatlex.ToolBox.ImageManager.WatermarkPosition 对应的 System.Drawing.Rectangle 对象: System.Drawing.Rectangle</returns> private Rectangle GetWatermarkRectangle(WatermarkPosition positon, int X, int Y, int x, int y, int i) { switch (positon) { case WatermarkPosition.LeftTop: return new Rectangle(i, i, x, y); case WatermarkPosition.Left: return new Rectangle(i, (Y - y) / 2, x, y); case WatermarkPosition.LeftBottom: return new Rectangle(i, Y - y - i, x, y); case WatermarkPosition.Top: return new Rectangle((X - x) / 2, i, x, y); case WatermarkPosition.Center: return new Rectangle((X - x) / 2, (Y - y) / 2, x, y); case WatermarkPosition.Bottom: return new Rectangle((X - x) / 2, Y - y - i, x, y); case WatermarkPosition.RightTop: return new Rectangle(X - x - i, i, x, y); case WatermarkPosition.RightCenter: return new Rectangle(X - x - i, (Y - y) / 2, x, y); default: return new Rectangle(X - x - i, Y - y - i, x, y); } } #endregion 私有函数结束 #region 文字生成开始 #endregion 文字生成结束 #region 设置透明度开始 /// <summary> /// 设置: 图片 System.Drawing.Bitmap 对象透明度 /// </summary> /// <param name="sBitmap">图片 System.Drawing.Bitmap 对象: System.Drawing.Bitmap</param> /// <param name="transparence">水印透明度(值越高透明度越低,范围在0.0f~1.0f之间): float</param> /// <returns>图片 System.Drawing.Bitmap: System.Drawing.Bitmap</returns> public Bitmap SetTransparence(Bitmap bm, float transparence) { if (transparence == 0.0f || transparence == 1.0f) throw new ArgumentException("透明度值只能在0.0f~1.0f之间"); float[][] floatArray = { new float[] { 1.0f, 0.0f, 0.0f, 0.0f, 0.0f }, new float[] { 0.0f, 1.0f, 0.0f, 0.0f, 0.0f }, new float[] { 0.0f, 0.0f, 1.0f, 0.0f, 0.0f }, new float[] { 0.0f, 0.0f, 0.0f, transparence, 0.0f }, new float[] { 0.0f, 0.0f, 0.0f, 0.0f, 1.0f } }; ImageAttributes imageAttributes = new ImageAttributes(); imageAttributes.SetColorMatrix(new ColorMatrix(floatArray), ColorMatrixFlag.Default, ColorAdjustType.Bitmap); Bitmap bitmap = new Bitmap(bm.Width, bm.Height); Graphics graphics = Graphics.FromImage(bitmap); graphics.DrawImage(bm, new Rectangle(0, 0, bm.Width, bm.Height), 0, 0, bm.Width, bm.Height, GraphicsUnit.Pixel, imageAttributes); graphics.Dispose(); imageAttributes.Dispose(); bm.Dispose(); return bitmap; } /// <summary> /// 设置: 图片 System.Drawing.Bitmap 对象透明度 /// </summary> /// <param name="readpath">图片路径(包含完整路径,文件名及其扩展名): string</param> /// <param name="transparence">水印透明度(值越高透明度越低,范围在0.0f~1.0f之间): float</param> /// <returns>图片 System.Drawing.Bitmap: System.Drawing.Bitmap</returns> public Bitmap SetTransparence(string readpath, float transparence) { return SetTransparence(new Bitmap(readpath), transparence); } #endregion 设置透明度结束 #region 添加水印开始 /// <summary> /// 生成: 原图绘制水印的 System.Drawing.Bitmap 对象 /// </summary> /// <param name="sBitmap">原图 System.Drawing.Bitmap 对象: System.Drawing.Bitmap</param> /// <param name="wBitmap">水印 System.Drawing.Bitmap 对象: System.Drawing.Bitmap</param> /// <param name="position">枚举 Uinatlex.ToolBox.ImageManager.WatermarkPosition : Uinatlex.ToolBox.ImageManager.WatermarkPosition</param> /// <param name="margin">水印边距: int</param> /// <returns>返回: 原图绘制水印的 System.Drawing.Bitmap 对象 System.Drawing.Bitmap</returns> public Bitmap CreateWatermark(Bitmap sBitmap, Bitmap wBitmap, WatermarkPosition position, int margin) { Graphics graphics = Graphics.FromImage(sBitmap); graphics.DrawImage(wBitmap, GetWatermarkRectangle(position, sBitmap.Width, sBitmap.Height, wBitmap.Width, wBitmap.Height, margin)); graphics.Dispose(); wBitmap.Dispose(); return sBitmap; } #endregion 添加水印结束 #region 图片切割开始 #endregion 图片切割结束 #region 图片缩放开始 #endregion 图片缩放结束 #region 保存图片到文件开始 #region 普通保存开始 /// <summary> /// 保存: System.Drawing.Bitmap 对象到图片文件 /// </summary> /// <param name="bitmap">System.Drawing.Bitmap 对象: System.Drawing.Bitmap</param> /// <param name="writepath">保存路径(包含完整路径,文件名及其扩展名): string</param> public void Save(Bitmap bitmap, string writepath) { try { bitmap.Save(writepath, GetImageFormat(GetExtension(writepath))); bitmap.Dispose(); } catch { throw new ArgumentException("图片保存错误"); } } /// <summary> /// 保存: 对象到图片文件 /// </summary> /// <param name="readpath">原图路径(包含完整路径,文件名及其扩展名): string</param> /// <param name="writepath">保存路径(包含完整路径,文件名及其扩展名): string</param> public void Save(string readpath, string writepath) { if (string.Compare(readpath, writepath) == 0) throw new ArgumentException("源图片与目标图片地址相同"); try { Save(new Bitmap(readpath), writepath); } catch { throw new ArgumentException("图片读取错误"); } } #endregion 普通保存结束 #region 文字绘图保存开始 #endregion 文字绘图保存结束 #region 透明度调整保存开始 /// <summary> /// 保存: 设置透明度的对象到图片文件 /// </summary> /// <param name="sBitmap">图片 System.Drawing.Bitmap 对象: System.Drawing.Bitmap</param> /// <param name="transparence">水印透明度(值越高透明度越低,范围在0.0f~1.0f之间): float</param> /// <param name="writepath">保存路径(包含完整路径,文件名及其扩展名): string</param> public void SaveTransparence(Bitmap bitmap, float transparence, string writepath) { Save(SetTransparence(bitmap, transparence), writepath); } /// <summary> /// 保存: 设置透明度的象到图片文件 /// </summary> /// <param name="readpath">原图路径(包含完整路径,文件名及其扩展名): string</param> /// <param name="transparence">水印透明度(值越高透明度越低,范围在0.0f~1.0f之间): float</param> /// <param name="writepath">保存路径(包含完整路径,文件名及其扩展名): string</param> public void SaveTransparence(string readpath, float transparence, string writepath) { Save(SetTransparence(readpath, transparence), writepath); } #endregion 透明度调整保存结束 #region 水印图片保存开始 /// <summary> /// 保存: 绘制水印的对象到图片文件 /// </summary> /// <param name="sBitmap">原图 System.Drawing.Bitmap 对象: System.Drawing.Bitmap</param> /// <param name="wBitmap">水印 System.Drawing.Bitmap 对象: System.Drawing.Bitmap</param> /// <param name="position">枚举 Uinatlex.ToolBox.ImageManager.WatermarkPosition : Uinatlex.ToolBox.ImageManager.WatermarkPosition</param> /// <param name="margin">水印边距: int</param> /// <param name="writepath">保存路径(包含完整路径,文件名及其扩展名): string</param> public void SaveWatermark(Bitmap sBitmap, Bitmap wBitmap, WatermarkPosition position, int margin, string writepath) { Save(CreateWatermark(sBitmap, wBitmap, position, margin), writepath); } /// <summary> /// 保存: 绘制水印的对象到图片文件 /// </summary> /// <param name="readpath">图片路径(包含完整路径,文件名及其扩展名): string</param> /// <param name="watermarkpath">水印图片路径(包含完整路径,文件名及其扩展名): string</param> /// <param name="transparence">水印透明度(值越高透明度越低,范围在0.0f~1.0f之间): float</param> /// <param name="position">枚举 Uinatlex.ToolBox.ImageManager.WatermarkPosition : Uinatlex.ToolBox.ImageManager.WatermarkPosition</param> /// <param name="margin">水印边距: int</param> /// <param name="writepath">保存路径(包含完整路径,文件名及其扩展名): string</param> public void SaveWatermark(string readpath, string watermarkpath, float transparence, WatermarkPosition position, int margin, string writepath) { if (string.Compare(readpath, writepath) == 0) throw new ArgumentException("源图片与目标图片地址相同"); if (transparence == 0.0f) Save(readpath, writepath); else if (transparence == 1.0f) SaveWatermark(new Bitmap(readpath), new Bitmap(watermarkpath), position, margin, writepath); else SaveWatermark(new Bitmap(readpath), SetTransparence(watermarkpath, transparence), position, margin, writepath); } #endregion 水印图片保存结束 #region 图片切割保存开始 #endregion 图片切割保存结束 #region 图片缩放保存开始 #endregion 图片缩放保存开始 #endregion 保存图片到文件结束 } } /* 调用很简单 im.SaveWatermark(原图地址, 水印地址, 透明度, 水印位置, 边距,保存位置); Uinatlex.ToolBox.ImageManager im = new Uinatlex.ToolBox.ImageManager(); im.SaveWatermark(Server.MapPath("/原图.jpg"), Server.MapPath("/水印.jpg"), 0.5f, Uinatlex.ToolBox.ImageManager.WatermarkPosition.RigthBottom, 10, Server.MapPath("/原图.jpg")); */
在客户端页面中调用上面这个类
protected void Page_Load(object sender, EventArgs e) { string newfileName = Server.MapPath("img/") + DateTime.Now.Millisecond + "" + DateTime.Now.Second + ".jpg"; ImageManager im = new ImageManager(); //调用很简单 im.SaveWatermark(原图地址, 水印地址, 透明度, 水印位置, 边距,保存到的位置); im.SaveWatermark(Server.MapPath("img/Chrysanthemum.jpg"), Server.MapPath("img/woshi.jpg"), 0.9f, ImageManager.WatermarkPosition.RigthBottom, 10, newfileName); }
总结
好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对的支持。
- C#(.net)水印图片的生成完整实例
- asp.net下用Aspose.Words for .NET动态生成word文档中的图片或水印的方法
- asp.net如何在图片上加水印文字具体实现
- .net c# gif动画如何添加图片水印实现思路及代码
- .net生成缩略图及水印图片时出现GDI+中发生一般性错误解决方法
- Asp.net简单实现给图片增加文字水印
- ASP.NET 图片加水印防盗链实现代码
- ASP.NET简单好用功能齐全图片上传工具类(水印、缩略图、裁剪等)
- asp.net上传图片并作处理水印与缩略图的实例代码
- asp.net中上传图片文件实现防伪图片水印并写入数据库
ASP.NET -- WebForm -- 给图片添加水印标记
ASP.NET -- WebForm: 给图片添加水印标记
ASP.NET:使用 WebForm(C#) 制作一个简单的为图片添加水印的页面。
1. Test2.aspx文件
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Test2.aspx.cs" Inherits="Test2" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:FileUpload ID="FileUpload1" runat="server" />
<asp:Button ID="Button1" runat="server" Text="上传" onclick="Button1_Click" />
水印文字:<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
<asp:Button ID="Button2" runat="server" Text="添加水印" onclick="Button2_Click" /><br />
<asp:Image ID="Image1" runat="server" />
<asp:Image ID="Image2" runat="server" />
</div>
</form>
</body>
</html>
2. Test2.aspx.cs文件
using System;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Drawing;
public partial class Test2 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void Button1_Click(object sender, EventArgs e)
{
//上传图片并保存
HttpPostedFile imgfile = Context.Request.Files[0];
imgfile.SaveAs(Context.Request.MapPath("image/TestImg.jpg"));
Image1.ImageUrl = "./image/TestImg.jpg";
}
protected void Button2_Click(object sender, EventArgs e)
{
//创建位图,位图来自image文件
using (Bitmap map = (Bitmap)Bitmap.FromFile(Context.Request.MapPath("image/TestImg.jpg")))
{
using (Graphics g=Graphics.FromImage(map))
{
//画水印文字在位图上
g.DrawString(TextBox1.Text, new Font("黑体", 14.0f, FontStyle.Bold), Brushes.Blue, new PointF(map.Width - 120, map.Height - 30));
//将画好水印文字的位图保存
map.Save(Context.Request.MapPath("image/TestImg2.jpg"));
}
}
Image2.ImageUrl = "./image/TestImg2.jpg";
}
}
3. 实现结果
(1) 上传要添加水印的图片
(2) 输入水印文字
(3) 添加水印在图片上
C#生成缩略图,C#给图片添加水印
生成缩略图


#region 生成缩略图
/// <summary>
/// 生成缩略图
/// </summary>
/// <param name="originalImagePath">源图路径(物理路径)</param>
/// <param name="thumbnailPath">缩略图路径(物理路径)</param>
/// <param name="width">缩略图宽度</param>
/// <param name="height">缩略图高度</param>
/// <param name="mode">生成缩略图的方式</param>
public static void MakeThumbnail(string originalImagePath, string thumbnailPath, int width, int height, string mode)
{
Image originalImage = Image.FromFile(originalImagePath);
int towidth = width;
int toheight = height;
int x = 0;
int y = 0;
int ow = originalImage.Width;
int oh = originalImage.Height;
switch (mode)
{
case "HW"://指定高宽缩放(可能变形)
break;
case "WC":
if (originalImage.Width > width)
{
toheight = originalImage.Height * width / originalImage.Width;
}
else
{
towidth = originalImage.Width;
toheight = originalImage.Height;
}
break;
case "W"://指定宽,高按比例
toheight = originalImage.Height * width / originalImage.Width;
break;
case "H"://指定高,宽按比例
towidth = originalImage.Width * height / originalImage.Height;
break;
case "Cut"://指定高宽裁减(不变形)
if ((double)originalImage.Width / (double)originalImage.Height > (double)towidth / (double)toheight)
{
oh = originalImage.Height;
ow = originalImage.Height * towidth / toheight;
y = 0;
x = (originalImage.Width - ow) / 2;
}
else
{
ow = originalImage.Width;
oh = originalImage.Width * height / towidth;
x = 0;
y = (originalImage.Height - oh) / 2;
}
break;
default:
break;
}
//新建一个bmp图片
Image bitmap = new System.Drawing.Bitmap(towidth, toheight);
//新建一个画板
Graphics g = System.Drawing.Graphics.FromImage(bitmap);
//设置高质量插值法
g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;
//设置高质量,低速度呈现平滑程度
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
//清空画布并以透明背景色填充
g.Clear(Color.Transparent);
//在指定位置并且按指定大小绘制原图片的指定部分
g.DrawImage(originalImage, new Rectangle(0, 0, towidth, toheight),
new Rectangle(x, y, ow, oh),
GraphicsUnit.Pixel);
try
{
//以jpg格式保存缩略图
bitmap.Save(thumbnailPath, System.Drawing.Imaging.ImageFormat.Jpeg);
}
catch (System.Exception e)
{
throw e;
}
finally
{
originalImage.Dispose();
bitmap.Dispose();
g.Dispose();
}
}
#endregion
在图片上生成图片水印


#region 在图片上生成图片水印
/// <summary>
/// 在图片上生成图片水印
/// </summary>
/// <param name="Path">原服务器图片路径 </param>
/// <param name="Path_syp">生成的带图片水印的图片路径 </param>
/// <param name="Path_sypf">水印图片路径 </param>
public static void AddWaterPic(string Path, string Path_syp, string Path_sypf,string style)
{
Path = HttpContext.Current.Server.MapPath(Path);
Path_syp = HttpContext.Current.Server.MapPath(Path_syp);
System.Drawing.Image image = System.Drawing.Image.FromFile(Path);
System.Drawing.Image copyImage = System.Drawing.Image.FromFile(Path_sypf);
Graphics g = Graphics.FromImage(image);
int x=0;
int y=0;
switch (style)
{
case "C":
x = image.Width/2 - copyImage.Width/2;
y = Convert.ToInt32(image.Height * 0.8) - copyImage.Height/2;
break;
case "RD":
x = (image.Width - copyImage.Width) - 20;
y = (image.Height - copyImage.Height) - 20;
break;
}
Rectangle rect = new Rectangle(x, y, copyImage.Width, copyImage.Height);
g.DrawImage(copyImage, rect, 0, 0, copyImage.Width, copyImage.Height, GraphicsUnit.Pixel);
g.Dispose();
image.Save(Path_syp);
image.Dispose();
}
#endregion
今天关于FastStone Capture怎么添加水印-给图片添加水印方法和faststone capture怎么用的分享就到这里,希望大家有所收获,若想了解更多关于Android给图片添加水印、asp .net实现给图片添加图片水印方法示例、ASP.NET -- WebForm -- 给图片添加水印标记、C#生成缩略图,C#给图片添加水印等相关知识,可以在本站进行查询。
本文标签: