当前位置:编程学习 > C#/ASP.NET >>

图片水印

请问如何在下载图片的时候给图片打上水印呢? --------------------编程问答--------------------     搞一个水印方法,在点击下载的时候,先上水印,水印成功后在下载。

或者是 在你上传图片的时候就直接上水印! --------------------编程问答--------------------
打开PHOTOSHOP后  在原有的照片上新建个图层   点击T这个图标  就是那个字符工具  写你喜欢的字或者你喜欢的字体(字体要自己去下 )   然后   你想要什么效果呢?   图层编辑 什么的  。 --------------------编程问答-------------------- 你上传图片的时候加上水印,这样比较合适点。
--------------------编程问答--------------------

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.IO;
using System.Drawing;
using System.Drawing.Imaging;

/// <summary>
/// PictureHandler 的摘要说明
/// </summary>
    public class PicHandler : IHttpHandler
    {
        public void ProcessRequest(HttpContext context)
        {
            context.Response.ContentType = "text/plain";
   
            string imgUrl = context.Request.PhysicalPath;//得到当前处理图片的物理路径
            if (File.Exists(imgUrl))
            {
                Image img = Image.FromFile(imgUrl);//通过图片路径得到图片对象
                Image watering = Image.FromFile(context.Server.MapPath("~/themes/images/water.jpg"));//得到数字水印图片
                Graphics g = Graphics.FromImage(img);//通过图片对象创建画布
                g.DrawImage(watering, new Rectangle(img.Width - watering.Width, img.Height - watering.Height, watering.Width, watering.Height), 0, 0, watering.Width, watering.Height, GraphicsUnit.Pixel);//画图
                context.Response.ContentType = "image/jpeg";//设置图片的格式
                img.Save(context.Response.OutputStream, ImageFormat.Jpeg);//把图片保存在输出流中
                g.Dispose();//销毁画布
                img.Dispose();//销毁图片
                context.Response.End();
            }
            else
            {
                Image defaultimg = Image.FromFile(context.Server.MapPath("~/themes/images/water.jpg"));//通过图片路径得到默认图片对象
                Image watering = Image.FromFile(context.Server.MapPath("~/themes/images/water.jpg"));//得到数字水印图片
                Graphics g = Graphics.FromImage(defaultimg);//通过图片对象创建画布
                g.DrawImage(watering, new Rectangle(defaultimg.Width - watering.Width, defaultimg.Height - watering.Height, watering.Width, watering.Height), 0, 0, watering.Width, watering.Height, GraphicsUnit.Pixel);//画图

                context.Response.ContentType = "image/jpeg";//设置图片的格式
                defaultimg.Save(context.Response.OutputStream, ImageFormat.Jpeg);
                g.Dispose();
                defaultimg.Dispose();
                context.Response.End();
            }

        }
        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }


--------------------编程问答-------------------- 方法是:首先准备一个小的水印图片,我们先把原图在水印下面的部分绘制上去,然后在吧水印的文本或图片绘制上去,然后把原图和水印图片的内存数据锁定(防止操作系统移动内存),然后直接用上面的算法改写原图的位图数据,解锁内存即得到最终加了水印的图片。

代码如下:下面是绘制文本类型的水印,只需提供水印文本内容,绘制起始坐标即可。注意,为了简单直观起见,代码中都没有做参数验证,例如水印是否超出原图范围,如果超出范围将引发对超过内存边界的访问限制(引发异常)。下面使用了unsafe代码,因此项目属性->Build中,应勾选允许不安全代码,否则无法编译。 在下面代码中的定位方式是非常熟悉的。再次强调的是以下的概念:
      scan0:指针,内存数据的起始地址。(换句话说,就是指向第一个扫描行第一个像素的Blue)。
      bpp:bit per pixel。
      stride:扫描行宽度,=width*bpp/8 并在结尾补0~3个字节的0,以凑齐到4字节整数倍。
      之所以横坐标乘以3是因为我们锁定的方式是24bppRgb(最后一个参数指定了数据的bpp),这意味这每个像素占据了3个字节,因此i要乘以3来跳跃到下一个像素。如果用32bppRGB锁定,则每个像素在内存占据4字节,相应的i应该乘以4。

/// <summary>
/// 给一个位图绘制水印文字(没有验证水印是否超出图片边界!)
/// </summary>
/// <param name="text">水印文本</param>
/// <param name="x">起始点</param>
/// <param name="y">起始点</param>
/// <param name="opacity">不透明度,0~1</param>
private Bitmap DrawWatermark(Image image,string text, Font font,Brush brush,int x,int y,double opacity)
{
    Bitmap bm1 = new Bitmap(image);
    Graphics g1=Graphics.FromImage(bm1);
    //测量水印文字的大小,然后申请一个新的位图
    SizeF sizef=g1.MeasureString(text,font);
    Bitmap bm2=new Bitmap((int)sizef.Width,(int)sizef.Height);
    Graphics g2=Graphics.FromImage(bm2);
    g2.DrawImage(bm1, 0,0,new Rectangle(x, y, bm2.Width, bm2.Height),GraphicsUnit.Pixel);
    g2.DrawString(text,font,brush,0,0);
    BitmapData data1=bm1.LockBits(new Rectangle(0,0,bm1.Width,bm1.Height),ImageLockMode.ReadWrite,PixelFormat.Format24bppRgb);
    BitmapData data2=bm2.LockBits(new Rectangle(0,0,bm2.Width,bm2.Height),ImageLockMode.ReadWrite,PixelFormat.Format24bppRgb);
    unsafe
    {
        byte* p1=(byte*)(void*)data1.Scan0;
        byte* p2=(byte*)(void*)data2.Scan0;
        for(int j=0;j<bm2.Height;j++)
        {
            for(int i=0;i<bm2.Width*3;i++)
            {
                p1[(y+j)*data1.Stride+i]=(byte)(p1[(y+j)*data1.Stride+i]*(1-opacity)+opacity*p2[j*data2.Stride+i]);
            }
        }
        bm1.UnlockBits(data1);
        bm2.UnlockBits(data2);
    }
    return bm1; 
}




--------------------编程问答-------------------- 可以自己去找个给图片加水印的方法(可以根据需求在修改修改) 然后根据你的需要使用
补充:.NET技术 ,  ASP.NET
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,