zoukankan      html  css  js  c++  java
  • 改善了性能的gif动画添加水印

    昨天的实现,效率非常低,基本要10s左右,今天重新改良了一下gif的Encoder,效率提高了不,基本实现了gif添加水印,但透明的gif在添加水印的时候仍然存在问题,有时间再研究研究
    原gif

    水印之后的图片为:

    但是,透明背景的却有些问题
    原图

    水印后

    改动的部分

     1  protected void GetImagePixels()
     2        {
     3            int w = image.Width;
     4            int h = image.Height;
     5            //        int type = image.GetType().;
     6            if ((w != width)
     7                || (h != height)
     8                )
     9            {
    10                // create new image with right size/format
    11                Image temp =
    12                    new Bitmap(width, height);
    13                Graphics g = Graphics.FromImage(temp);
    14                g.DrawImage(image, 00);
    15                image = temp;
    16                g.Dispose();
    17            }

    18            /*
    19                ToDo:
    20                improve performance: use unsafe code 
    21            */

    22            pixels = new Byte[3 * image.Width * image.Height];
    23            int count = 0;
    24            Bitmap tempBitmap = new Bitmap(image);
    25            int wh = image.Width;
    26            int he = image.Height;
    27            System.Drawing.Imaging.BitmapData bmpData = tempBitmap.LockBits(new Rectangle(00, wh, he), System.Drawing.Imaging.ImageLockMode.ReadWrite, image.PixelFormat);
    28            unsafe
    29            {
    30                byte* p = (byte*)bmpData.Scan0.ToPointer();
    31                for (int i = 0; i < 4 * wh * he; i += 4)
    32                {
    33                    pixels[count] = *(p + i+2);
    34                    count++;
    35                    pixels[count] = *(p + i + 1);
    36                    count++;
    37                    pixels[count] = *(p + i );
    38                    count++;
    39                }

    40            }

    41            tempBitmap.UnlockBits(bmpData);
    42            //count = 0;
    43            //for (int th = 0; th < image.Height; th++)
    44            //{
    45            //    for (int tw = 0; tw < image.Width; tw++)
    46            //    {
    47            //        Color color = tempBitmap.GetPixel(tw, th);
    48            //        pixels[count] = color.R;
    49            //        count++;
    50            //        pixels[count] = color.G;
    51            //        count++;
    52            //        pixels[count] = color.B;
    53            //        count++;
    54            //    }
    55            //}
    56
    57            //        pixels = ((DataBufferByte) image.getRaster().getDataBuffer()).getData();
    58        }
    注释部分是原来代码
    目前仍然有两个问题:
    1)透明背景
    2)生成的文件体积变大
    望得到更多的指教
  • 相关阅读:
    Windows下Android开发环境搭建
    解决Win7下打开或关闭Windows功能空白一片
    C#中得到程序当前工作目录和执行目录的一些方法
    创业者必看的小故事
    Sql Server 2005外围应用应用配置器打不开了怎么办
    vs2005无法Web调试
    SQL Server 全局变量
    转 document.documentElement与document.body
    [转]使用SSMA将Oracle数据库转成SQL Server 2008
    Delphi 2009、C++Builder2009正式发布
  • 原文地址:https://www.cnblogs.com/jillzhang/p/553246.html
Copyright © 2011-2022 走看看