现在的位置: 首页 > 综合 > 正文

asp.net图片操作(Drawing.Imaging ;Drawing)

2012年12月04日 ⁄ 综合 ⁄ 共 11212字 ⁄ 字号 评论关闭

图片操作  (Drawing.Imaging ;Drawing)

1, Bitmap   控制图片属性

           封装 GDI+ 位图,此位图由图形图像及其属性的像素数据组成。Bitmap 是用于处理由像素数据定义的图像的对象

            具体使用方式,如:

          Bitmap bitmap = new Bitmap(); //创建

          GetPixel()//指定像素颜色

          Save()//将保存到指定位置

  例子:

  

 public Bitmap GetToMonochrome(Bitmap source, string fpath)

    {

        Bitmap bitmap = new Bitmap(source.Width, source.Height);

        for (int i = 0; i < bitmap.Height; i++)

        {

            for (int j = 0; j < bitmap.Width; j++)

            {

                Color pixel = source.GetPixel(j, i); 

                Color c = System.Drawing.ColorTranslator.FromHtml("#69EE11");  

                int reda = pixel.A;

                int redb = c.B;

                int redg = c.G;

                int redr = c.R;

                bitmap.SetPixel(j, i, Color.FromArgb(reda, redr, redg, redb));

            }

        }

        bitmap.Save(fpath.Substring(0, fpath.Length - 4) + "_BW.png", ImageFormat.Png);

        bitmap.Dispose();

        return bitmap;

}

 

 

    2 ,Image 为Bitmap 和 Metafile 的类提供功能的抽象基类。

Image 类型公开以下成员。

属性 

 

  

名称

说明

 

Flags 

获取该 Image 的像素数据的特性标志。 

 

FrameDimensionsList 

获取 GUID 的数组,这些 GUID 表示此 Image 中帧的维数。 

 

Height 

获取此 Image 的高度(以像素为单位)。 

 

HorizontalResolution 

获取此 Image 的水平分辨率(以像素/英寸为单位)。 

 

Palette 

获取或设置用于此 Image 的调色板。 

 

PhysicalDimension 

获取此图像的宽度和高度。 

 

PixelFormat 

获取此 Image 的像素格式。 

 

PropertyIdList 

获取存储于该 Image 中的属性项的 ID。 

 

PropertyItems 

获取存储于该 Image 中的所有属性项(元数据片)。 

 

RawFormat 

获取此 Image 的文件格式。 

 

Size 

获取此图像的以像素为单位的宽度和高度。 

 

Tag 

获取或设置提供有关图像附加数据的对象。 

 

VerticalResolution 

获取此 Image 的垂直分辨率(以像素/英寸为单位)。 

 

Width 

获取此 Image 的宽度(以像素为单位)。 

例如:

 

Image original = Image.FromStream(“1.png”);

original.Height;

             original.Width;

             original.Tag;

 

等等,一般是为其他类提供image类型的参数,或者是属性参数。

 

3Graphics  封装的一个 GDI+ 绘图图面。

          Clear(Color.Transparent) 清除整个绘图面并以指定背景色填充。

            DrawImage();在指定的位置并且按照指定的大小进行绘图

   例如:

        

Graphics graphics = Graphics.FromImage(bitmap);

          graphics.Clear(Color.Transparent);

        graphics.DrawImage(image, new Rectangle(0, 0, this.zipwidth, this.zipheight));

 

 

整体实例:

           对图的一般操作

 

     

 #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)

{

System.Drawing.Image originalImage = System.Drawing.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 "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图片

System.Drawing.Image bitmap
= new System.Drawing.Bitmap(towidth, toheight);

//新建一个画板

System.Drawing.Graphics g
= System.Drawing.Graphics.FromImage(bitmap);

//设置高质量插值法

g.InterpolationMode
= System.Drawing.Drawing2D.InterpolationMode.High;

//设置高质量,低速度呈现平滑程度

g.SmoothingMode
= System.Drawing.Drawing2D.SmoothingMode.HighQuality;

//清空画布并以透明背景色填充

g.Clear(System.Drawing.Color.Transparent);

//在指定位置并且按指定大小绘制原图片的指定部分

g.DrawImage(originalImage,
new System.Drawing.Rectangle(0, 0, towidth, toheight), new System.Drawing.Rectangle(x, y, ow, oh), System.Drawing.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="waterpath">水印图片(绝对路径)</param>

/// <param name="location">水印位置(传送正确的代码)</param>

public static string ImageWatermark(string path, string waterpath, string location)

{

string kz_name = Path.GetExtension(path);

if (kz_name == ".jpg" || kz_name == ".bmp" || kz_name == ".jpeg")

{

DateTime time = DateTime.Now;

string filename = "" + time.Year.ToString() + time.Month.ToString() + time.Day.ToString() + time.Hour.ToString() + time.Minute.ToString() + time.Second.ToString() + time.Millisecond.ToString();

Image img = Bitmap.FromFile(path);

Image waterimg = Image.FromFile(waterpath);

Graphics g = Graphics.FromImage(img);

ArrayList loca = GetLocation(location, img, waterimg);

g.DrawImage(waterimg, new Rectangle(int.Parse(loca[0].ToString()), int.Parse(loca[1].ToString()), waterimg.Width, waterimg.Height));

waterimg.Dispose();

g.Dispose();

string newpath = Path.GetDirectoryName(path) + filename + kz_name;

img.Save(newpath);

img.Dispose();

File.Copy(newpath, path, true);

if (File.Exists(newpath))

{

File.Delete(newpath);

}

}

return path;

}

/// <summary>

/// 图片水印位置处理方法

/// </summary>

/// <param name="location">水印位置</param>

/// <param name="img">需要添加水印的图片</param>

/// <param name="waterimg">水印图片</param>

private static ArrayList GetLocation(string location, Image img, Image waterimg)

{

ArrayList loca = new ArrayList();

int x = 0;

int y = 0;

if (location == "LT")

{

x = 10;

y = 10;

}

else if (location == "T")

{

x = img.Width / 2 - waterimg.Width / 2;

y = img.Height - waterimg.Height;

}

else if (location == "RT")

{

x = img.Width - waterimg.Width;

y = 10;

}

else if (location == "LC")

{

x = 10;

y = img.Height / 2 - waterimg.Height / 2;

}

else if (location == "C")

{

x = img.Width / 2 - waterimg.Width / 2;

y = img.Height / 2 - waterimg.Height / 2;

}

else if (location == "RC")

{

x = img.Width - waterimg.Width;

y = img.Height / 2 - waterimg.Height / 2;

}

else if (location == "LB")

{

x = 10;

y = img.Height - waterimg.Height;

}

else if (location == "B")

{

x = img.Width / 2 - waterimg.Width / 2;

y = img.Height - waterimg.Height;

}

else

{

x = img.Width - waterimg.Width;

y = img.Height - waterimg.Height;

}

loca.Add(x);

loca.Add(y);

return loca;

}

#endregion

#region 文字水印

/// <summary>

/// 文字水印处理方法

/// </summary>

/// <param name="path">图片路径(绝对路径)</param>

/// <param name="size">字体大小</param>

/// <param name="letter">水印文字</param>

/// <param name="color">颜色</param>

/// <param name="location">水印位置</param>

public static string LetterWatermark(string path, int size, string letter, Color color, string location)

{

#region

string kz_name = Path.GetExtension(path);

if (kz_name == ".jpg" || kz_name == ".bmp" || kz_name == ".jpeg")

{

DateTime time = DateTime.Now;

string filename = "" + time.Year.ToString() + time.Month.ToString() + time.Day.ToString() + time.Hour.ToString() + time.Minute.ToString() + time.Second.ToString() + time.Millisecond.ToString();

Image img = Bitmap.FromFile(path);

Graphics gs = Graphics.FromImage(img);

ArrayList loca = GetLocation(location, img, size, letter.Length);

Font font = new Font("宋体", size);

Brush br = new SolidBrush(color);

gs.DrawString(letter, font, br, float.Parse(loca[0].ToString()), float.Parse(loca[1].ToString()));

gs.Dispose();

string newpath = Path.GetDirectoryName(path) + filename + kz_name;

img.Save(newpath);

img.Dispose();

File.Copy(newpath, path, true);

if (File.Exists(newpath))

{

File.Delete(newpath);

}

}

return path;

#endregion

}

/// <summary>

/// 文字水印位置的方法

/// </summary>

/// <param name="location">位置代码</param>

/// <param name="img">图片对象</param>

/// <param name="width">宽(当水印类型为文字时,传过来的就是字体的大小)</param>

/// <param name="height">高(当水印类型为文字时,传过来的就是字符的长度)</param>

private static ArrayList GetLocation(string location, Image img, int width, int height)

{

#region

ArrayList loca = new ArrayList(); //定义数组存储位置

float x = 10;

float y = 10;

if (location == "LT")

{

loca.Add(x);

loca.Add(y);

}

else if (location == "T")

{

x = img.Width / 2 - (width * height) / 2;

loca.Add(x);

loca.Add(y);

}

else if (location == "RT")

{

x = img.Width - width * height;

}

else if (location == "LC")

{

y = img.Height / 2;

}

else if (location == "C")

{

x = img.Width / 2 - (width * height) / 2;

y = img.Height / 2;

}

else if (location == "RC")

{

x = img.Width - height;

y = img.Height / 2;

}

else if (location == "LB")

{

y = img.Height - width - 5;

}

else if (location == "B")

{

x = img.Width / 2 - (width * height) / 2;

y = img.Height - width - 5;

}

else

{

x = img.Width - width * height;

y = img.Height - width - 5;

}

loca.Add(x);

loca.Add(y);

return loca;

#endregion

}

#endregion

#region 调整光暗

/// <summary>

/// 调整光暗

/// </summary>

/// <param name="mybm">原始图片</param>

/// <param name="width">原始图片的长度</param>

/// <param name="height">原始图片的高度</param>

/// <param name="val">增加或减少的光暗值</param>

public Bitmap LDPic(Bitmap mybm, int width, int height, int val)

{

Bitmap bm = new Bitmap(width, height);//初始化一个记录经过处理后的图片对象

int x, y, resultR, resultG, resultB;//x、y是循环次数,后面三个是记录红绿蓝三个值的

Color pixel;

for (x = 0; x < width; x++)

{

for (y = 0; y < height; y++)

{

pixel = mybm.GetPixel(x, y);//获取当前像素的值

resultR
= pixel.R + val;//检查红色值会不会超出[0, 255]

resultG
= pixel.G + val;//检查绿色值会不会超出[0, 255]

resultB
= pixel.B + val;//检查蓝色值会不会超出[0, 255]

bm.SetPixel(x, y, Color.FromArgb(resultR, resultG, resultB));
//绘图

}

}

return bm;

}

#endregion

#region 反色处理

/// <summary>

/// 反色处理

/// </summary>

/// <param name="mybm">原始图片</param>

/// <param name="width">原始图片的长度</param>

/// <param name="height">原始图片的高度</param>

public Bitmap RePic(Bitmap mybm, int width, int height)

{

Bitmap bm = new Bitmap(width, height);//初始化一个记录处理后的图片的对象

int x, y, resultR, resultG, resultB;

Color pixel;

for (x = 0; x < width; x++)

{

for (y = 0; y < height; y++)

{

pixel = mybm.GetPixel(x, y);//获取当前坐标的像素值

resultR
= 255 - pixel.R;//反红

resultG
= 255 - pixel.G;//反绿

resultB
= 255 - pixel.B;//反蓝

bm.SetPixel(x, y, Color.FromArgb(resultR, resultG, resultB));
//绘图

}

}

return bm;

}

#endregion

#region 浮雕处理

/// <summary>

/// 浮雕处理

/// </summary>

/// <param name="oldBitmap">原始图片</param>

/// <param name="Width">原始图片的长度</param>

/// <param name="Height">原始图片的高度</param>

public Bitmap FD(Bitmap oldBitmap, int Width, int Height)

{

Bitmap newBitmap = new Bitmap(Width, Height);

Color color1, color2;

for (int x = 0; x < Width - 1; x++)

{

for (int y = 0; y < Height - 1; y++)

{

int r = 0, g = 0, b = 0;

color1 = oldBitmap.GetPixel(x, y);

color2 = oldBitmap.GetPixel(x + 1, y + 1);

r = Math.Abs(color1.R - color2.R + 128);

g = Math.Abs(color1.G - color2.G + 128);

b = Math.Abs(color1.B - color2.B + 128);

if (r > 255) r = 255;

if (r < 0) r = 0;

if (g > 255) g = 255;

if (g < 0) g = 0;

if (b > 255) b = 255;

if (b < 0) b = 0;

newBitmap.SetPixel(x, y, Color.FromArgb(r, g, b));

}

}

return newBitmap;

}

#endregion

#region 拉伸图片

/// <summary>

/// 拉伸图片

/// </summary>

/// <param name="bmp">原始图片</param>

/// <param name="newW">新的宽度</param>

/// <param name="newH">新的高度</param>

public static Bitmap ResizeImage(Bitmap bmp, int newW, int newH)

{

try

{

Bitmap bap = new Bitmap(newW, newH);

Graphics g = Graphics.FromImage(bap);

g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;

g.DrawImage(bap, new Rectangle(0, 0, newW, newH), new Rectangle(0, 0, bap.Width, bap.Height), GraphicsUnit.Pixel);

g.Dispose();

return bap;

}

catch

{

return null;

}

}

#endregion

#region 滤色处理

/// <summary>

/// 滤色处理

/// </summary>

/// <param name="mybm">原始图片</param>

/// <param name="width">原始图片的长度</param>

/// <param name="height">原始图片的高度</param>

public Bitmap FilPic(Bitmap mybm, int width, int height)

{

Bitmap bm = new Bitmap(width, height);//初始化一个记录滤色效果的图片对象

int x, y;

Color pixel;

for (x = 0; x < width; x++)

{

for (y = 0; y < height; y++)

{

pixel = mybm.GetPixel(x, y);//获取当前坐标的像素值

bm.SetPixel(x, y, Color.FromArgb(
0, pixel.G, pixel.B));//绘图

}

}

return bm;

}

#endregion

#region 左右翻转

/// <summary>

/// 左右翻转

/// </summary>

/// <param name="mybm">原始图片</param>

/// <param name="width">原始图片的长度</param>

/// <param name="height">原始图片的高度</param>

public Bitmap RevPicLR(Bitmap mybm, int width, int height)

{

Bitmap bm = new Bitmap(width, height);

int x, y, z; //x,y是循环次数,z是用来记录像素点的x坐标的变化的

Color pixel;

for (y = height - 1; y >= 0; y--)

{

for (x = width - 1, z = 0; x >= 0; x--)

{

pixel = mybm.GetPixel(x, y);//获取当前像素的值

bm.SetPixel(z
++, y, Color.FromArgb(pixel.R, pixel.G, pixel.B));//绘图

}

}

return bm;

}

#endregion

#region 上下翻转

/// <summary>

/// 上下翻转

/// </summary>

/// <param name="mybm">原始图片</param>

/// <param name="width">原始图片的长度</param>

/// <param name="height">原始图片的高度</param>

public Bitmap RevPicUD(Bitmap mybm, int width, int height)

{

Bitmap bm = new Bitmap(width, height);

int x, y, z;

Color pixel;

for (x = 0; x < width; x++)

{

for (y = height - 1, z = 0; y >= 0; y--)

{

pixel = mybm.GetPixel(x, y);//获取当前像素的值

bm.SetPixel(x, z
++, Color.FromArgb(pixel.R, pixel.G, pixel.B));//绘图

}

}

return bm;

}

#endregion

#region 压缩图片

/// <summary>

/// 压缩到指定尺寸

///

抱歉!评论已关闭.