2010-12-02 55 views
10

我有一个在asp.net c#(Webforms)中构建的电子商务商店,并且很多新产品图片都非常难以获得,因此我想用我们的徽标或域名对它们进行水印处理。最有效的方式水印图像C#在飞行中?

有太多的产品只是下载图像并添加水印,而有限的图像编辑经验的用户将上传新的水印(因此他们不知道如何添加水印)。

所以我想这只是让我使用HttpHandler?是/否?考虑到,某些页面将有大约20个图像(Jpegs)(所有这些都需要加水印)

(如果有的话)是否可以提供一些洞察力(最好是C#中的代码示例)到 最有效的方式

回答

5

我会获得Graphics对象为JPEG,然后绘制在该项目顶部的水印,并与水印重新保存:

using (Image image = Image.FromFile("myImage.jpg")) 
using(Graphics g = Graphics.FromImage(image)){ 
    g.DrawImage(myWaterMarkImage, myPosition); 
    image.Save(myFilename); 
} 
+0

但问题是,它可能降低整个图像的图像质量由于JPEG重而不仅仅是水印所在的块。但我不知道是否有一个简单的方法可以做得更好。 – CodesInChaos 2010-12-02 15:40:18

+0

虽然它会降低图像质量,但只要一次完成就不会成为问题,特别是在平均网页图像的大小/分辨率方面。除非压缩过高,否则最终会产生油漆产生的混乱。 – themaninthesuitcase 2010-12-03 09:55:11

0

明显的优化,以任何“即时图像如果你可以承担存储成本,那么'wartermarking'就是缓存'水印'图像。所以,标记操作本身的效率本身并不重要。

1

这不是一个答案这么多的一些技巧:

  1. Jpeg格式不支持透明,你也许可以做的就是添加水印的图像,并使它成为一个非常浅灰色的颜色是最好的。
  2. 使用通用处理程序(.ashx),它非常轻量级,并防止您必须向web.config文件添加任何内容。
  3. 如果每页会有20个以上的图像,那么我会建议在获取图像时添加水印。这是每张图片的一次性成本,并且会使加载页面的图像更快。

我不能担保最有效的添加水印的方式,但如果您使用提示#3,它就变得不那么重要,因为您只会对每张图像执行一次操作。我可能只是使用System.Drawing命名空间来做到这一点;只要确保处理你使用的资源(图像,图形等),但我确信有那里的图书馆会更好。

+2

添加水印的中间阶段不受限于JPEG文件的限制 - 因此您可以将透明水印放在图像上没有问题。 – 2010-12-02 15:40:58

2

我建议你看看WPF类来完成这项工作(GDI +在Web上下文中不推荐使用)。

的方式(我不知道,如果是最好的方式,但我已经做到了这一点和作品精致漂亮)是类似于:

// Load the original image 
BitmapImage image = new BitmapImage(); 
image.BeginInit(); 
image.CacheOption = BitmapCacheOption.OnLoad; 
image.UriSource = new Uri(physical_imagepath); 
image.EndInit(); 

// Create a final render image 
RenderTargetBitmap final = new RenderTargetBitmap(yourNeededWidth, yourNeededHeight, yourDpiDefault, yourDpiDefault, PixelFormats.Default); 

DrawingVisual dv = new DrawingVisual(); 

using (DrawingContext dc = dv.RenderOpen()) 
{ 
    Rect rectImage = new Rect(0, 0, (double)image.PixelWidth, (double)image.PixelHeight); 
    dc.DrawImage(image, rectImage); 

    // Load the bitmap of the watermark 
    BitmapImage watermark = new BitmapImage(); 
    watermark.BeginInit(); 
    watermark.CacheOption = BitmapCacheOption.OnLoad; 
    watermark.UriSource = new Uri(physical_logopath); 
    watermark.EndInit(); 

    // Defines the watermark box 
    Rect rectWatermark = new Rect(0, 0, (double)watermark.PixelWidth, (double)watermark.PixelHeight); 

    /* use rectWatermark.X and rectWatermark.Y to move your watermark box around on the final image */ 

    dc.DrawImage(watermark, rectWatermark); 
} 

final.Render(dv); 

// And then serve the final Bitmap to the client 

当然所有写成的HttpHandler。 以上代码未经测试。

(小广告:我发布了一个CodeCanyon Item做类似的工作)。

3

下面是一个简单的HttpHandler

/// <summary> 
/// Summary description for $codebehindclassname$ 
/// </summary> 
[WebService(Namespace = "http://tempuri.org/")] 
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] 
public class ImageHandler : IHttpHandler 
{ 

    public void ProcessRequest(HttpContext context) 
    { 
     string imageName = string.Empty; 
     string physicalPath = string.Empty; 
     Image image = null; 
     Image thumbnailImage = null; 
     Bitmap bitmap = null; 
     using (MemoryStream memoryStream = new MemoryStream()) 
     { 
      string actionName = context.Request.QueryString["Image"]; 
      string opacity = context.Request.QueryString["Opacity"]; 
      int opacityPercent = int.Parse(opacity); 
      Color waterMarkColor = Color.Gray; 
      switch (actionName) 
      { 
       case "BlueHills": 
        string myCompany = "My Company Name"; 
        Font font = new Font("Times New Roman", 8f); 

        context.Response.ContentType = "image/png"; 
        bitmap = Resources.Resources.BlueHills; 
        Graphics g = Graphics.FromImage(bitmap); 
        Brush myBrush = new SolidBrush(Color.FromArgb(opacityPercent, waterMarkColor)); 
        SizeF sz = g.MeasureString(myCompany, font); 
        int X = (int)(bitmap.Width - sz.Width)/2; 
        int Y = (int)(sz.Height)/2; 
        g.DrawString(myCompany, font, myBrush, new Point(X, Y)); 
        bitmap.Save(memoryStream, ImageFormat.Png); 
        break; 
       default: 
        string test = actionName; 
        break; 
      } 

      context.Response.BinaryWrite(memoryStream.GetBuffer()); 
      memoryStream.Close(); 
      if (image != null) { image.Dispose(); } 
      if (thumbnailImage != null) { thumbnailImage.Dispose(); } 
      if (bitmap != null) { bitmap.Dispose(); } 
     } 
    } 

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

,并可以被称为像这样:

<asp:Image ID="Image1" runat="server" ImageUrl="~/ImageHandler.ashx?Image=BlueHills&Opacity=50" />