C# Image 学习总结
生活随笔
收集整理的這篇文章主要介紹了
C# Image 学习总结
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Image 類
https://msdn.microsoft.com/zh-cn/library/system.drawing.image.aspx.NET Framework (current version) 其他版本?
?
一個抽象基類,提供了用于功能 Bitmap 和 Metafile 繼承的類。
命名空間: ? System.Drawing
程序集: ?System.Drawing(位于 System.Drawing.dll)
繼承層次結構
System.Object
??System.MarshalByRefObject
????System.Drawing.Image
??????System.Drawing.Bitmap
??????System.Drawing.Imaging.Metafile
語法
C#C++F#VB
[SerializableAttribute]
[TypeConverterAttribute(typeof(ImageConverter))]
[ComVisibleAttribute(true)]
public abstract class Image : MarshalByRefObject, ISerializable,?
ICloneable, IDisposable
屬性
名稱 說明
System_CAPS_pubproperty Flags
獲取特性的像素數據的這標志 Image。
System_CAPS_pubproperty FrameDimensionsList
獲取表示在此幀的維數的 Guid 的數組, Image。
System_CAPS_pubproperty Height
獲取的高度,以像素為單位,這 Image。
System_CAPS_pubproperty HorizontalResolution
獲取以每英寸的像素為單位的水平分辨率 Image。
System_CAPS_pubproperty Palette
獲取或設置用于此目的的顏色調色板 Image。
System_CAPS_pubproperty PhysicalDimension
獲取此圖像的寬度和高度。
System_CAPS_pubproperty PixelFormat
獲取此像素格式 Image。
System_CAPS_pubproperty PropertyIdList
獲取存儲于此的屬性項的 Id Image。
System_CAPS_pubproperty PropertyItems
獲取的所有屬性項 (元數據片) 存儲在此 Image。
System_CAPS_pubproperty RawFormat
獲取此文件格式 Image。
System_CAPS_pubproperty Size
獲取此圖像的寬度和高度(以像素為單位)。
System_CAPS_pubproperty Tag
獲取或設置提供有關圖像的附加數據的對象。
System_CAPS_pubproperty VerticalResolution
獲取以每英寸的像素為單位的垂直分辨率 Image。
System_CAPS_pubproperty Width
獲取的寬度,以像素為單位,這 Image。
方法
名稱 說明
System_CAPS_pubmethod Clone()
創建此 Image 的一個精確副本。
System_CAPS_pubmethod CreateObjRef(Type)
創建包含生成用來與遠程對象通信的代理所需的所有相關信息的對象。(繼承自 MarshalByRefObject。)
System_CAPS_pubmethod Dispose()
釋放此 Image 使用的所有資源。
System_CAPS_protmethod Dispose(Boolean)
釋放由 Image 占用的非托管資源,還可以另外再釋放托管資源。
System_CAPS_pubmethod Equals(Object)
確定指定的對象是否等于當前對象。(繼承自 Object。)
System_CAPS_protmethod Finalize()
在垃圾回收將某一對象回收前允許該對象嘗試釋放資源并執行其他清理操作。(覆蓋 Object.Finalize()。)
System_CAPS_pubmethodSystem_CAPS_static FromFile(String)
創建 Image 從指定的文件。
System_CAPS_pubmethodSystem_CAPS_static FromFile(String,?Boolean)
創建 Image 從指定的文件使用嵌入的顏色管理信息在該文件中。
System_CAPS_pubmethodSystem_CAPS_static FromHbitmap(IntPtr)
創建 Bitmap 從 GDI 位圖的句柄。
System_CAPS_pubmethodSystem_CAPS_static FromHbitmap(IntPtr,?IntPtr)
創建 Bitmap 從 GDI 位圖和 GDI 調色板的句柄的句柄。
System_CAPS_pubmethodSystem_CAPS_static FromStream(Stream)
創建 Image 從指定的數據流。
System_CAPS_pubmethodSystem_CAPS_static FromStream(Stream,?Boolean)
創建 Image 從指定的數據流 (可選) 使用嵌入的顏色管理信息該流中。
System_CAPS_pubmethodSystem_CAPS_static FromStream(Stream,?Boolean,?Boolean)
創建 Image 從指定的數據流 (可選) 使用嵌入的顏色管理信息并驗證圖像數據。
System_CAPS_pubmethod GetBounds(GraphicsUnit)
以指定的單位獲取圖像的界限。
System_CAPS_pubmethod GetEncoderParameterList(Guid)
返回有關指定的圖像編碼器所支持的參數的信息。
System_CAPS_pubmethod GetFrameCount(FrameDimension)
返回指定維度的幀數。
System_CAPS_pubmethod GetHashCode()
作為默認哈希函數。(繼承自 Object。)
System_CAPS_pubmethod GetLifetimeService()
檢索當前生存期的服務對象,用于控制此實例的生存期策略。(繼承自 MarshalByRefObject。)
System_CAPS_pubmethodSystem_CAPS_static GetPixelFormatSize(PixelFormat)
返回指定像素格式的顏色深度(每個像素的位數)。
System_CAPS_pubmethod GetPropertyItem(Int32)
獲取指定的屬性項從此 Image。
System_CAPS_pubmethod GetThumbnailImage(Int32,?Int32,?Image.GetThumbnailImageAbort,?IntPtr)
返回此縮略圖 Image。
System_CAPS_pubmethod GetType()
獲取當前實例的 Type。(繼承自 Object。)
System_CAPS_pubmethod InitializeLifetimeService()
獲取使用生存期服務對象來控制此實例的生存期策略。(繼承自 MarshalByRefObject。)
System_CAPS_pubmethodSystem_CAPS_static IsAlphaPixelFormat(PixelFormat)
返回一個值,該值指示的像素格式是否為此 Image 包含 alpha 信息。
System_CAPS_pubmethodSystem_CAPS_static IsCanonicalPixelFormat(PixelFormat)
返回一個值,該值指示該像素格式是否為每個像素 32 位。
System_CAPS_pubmethodSystem_CAPS_static IsExtendedPixelFormat(PixelFormat)
返回一個值,該值指示該像素格式是否為每個像素 64 位。
System_CAPS_protmethod MemberwiseClone()
創建當前 Object 的淺表副本。(繼承自 Object。)
System_CAPS_protmethod MemberwiseClone(Boolean)
創建當前的淺表副本 MarshalByRefObject 對象。(繼承自 MarshalByRefObject。)
System_CAPS_pubmethod RemovePropertyItem(Int32)
從這中移除指定的屬性項 Image。
System_CAPS_pubmethod RotateFlip(RotateFlipType)
旋轉、 翻轉,或將旋轉和翻轉 Image。
System_CAPS_pubmethod Save(Stream,?ImageCodecInfo,?EncoderParameters)
使用指定的編碼器和圖像編碼器參數,將該圖像保存到指定的流。
System_CAPS_pubmethod Save(Stream,?ImageFormat)
將此圖像以指定的格式保存到指定的流中。
System_CAPS_pubmethod Save(String)
這會將保存 Image 寫入指定的文件或流。
System_CAPS_pubmethod Save(String,?ImageCodecInfo,?EncoderParameters)
這會將保存 Image 寫入指定的文件,使用指定的編碼器和圖像編碼器參數。
System_CAPS_pubmethod Save(String,?ImageFormat)
這會將保存 Image 寫入指定的文件中指定的格式。
System_CAPS_pubmethod SaveAdd(EncoderParameters)
將幀添加到上次對 Save 方法調用時所指定的文件或流中。 使用此方法將多幀圖像中的選定幀保存到另一個多幀圖像。
System_CAPS_pubmethod SaveAdd(Image,?EncoderParameters)
將幀添加到上次對 Save 方法調用時所指定的文件或流中。
System_CAPS_pubmethod SelectActiveFrame(FrameDimension,?Int32)
選擇由維度和索引指定的幀。
System_CAPS_pubmethod SetPropertyItem(PropertyItem)
在此 Image 中存儲一個屬性項(元數據片)。
System_CAPS_pubmethod ToString()
返回表示當前對象的字符串。(繼承自 Object。)
顯式接口實現
名稱 說明
System_CAPS_pubinterfaceSystem_CAPS_privmethod ISerializable.GetObjectData(SerializationInfo,?StreamingContext)
使用將目標對象序列化所需的數據填充 SerializationInfo。
備注
若要繪制 Image 在 Windows 窗體中,應使用之一 DrawImage 方法。
示例
下面的代碼示例旨在為使用 Windows 窗體。 它是處理程序 Paint 事件。 一個 Graphics 對象傳遞給事件,并且使用窗體上繪制圖像。 該代碼執行下列操作:
從名為 sampimag.jpg 位于同一個文件中創建的映像。 此文件必須位于應用程序可執行文件所在的文件夾。
創建要在該處繪制圖像的左上角的點。
窗體上繪制不成比例的圖像。
C#C++VB
private void ImageExampleForm_Paint(object sender, PaintEventArgs e)
{ ? ? ? ??
? ? // Create image.
? ? Image newImage = Image.FromFile("SampImag.jpg");
? ? // Create Point for upper-left corner of image.
? ? Point ulCorner = new Point(100, 100);
? ? // Draw image to screen.
? ? e.Graphics.DrawImage(newImage, ulCorner);
}
版本信息
.NET Framework?
自 1.1 起可用
線程安全
此類型的所有公共靜態(Visual Basic 中的 已共享 在 Visual Basic 中)成員都是線程安全的。不保證所有實例成員都是線程安全的。
另請參閱
System.Drawing 命名空間
圖像、位圖和圖元文件
使用圖像、位圖、圖標和圖元文件
========
?C# Image 加載圖片
http://blog.csdn.net/cai_huan_123/article/details/42524001Image.FromFile ?一旦使用后,對應的文件在一直調用其生成的Image對象被Disponse前都不會被解除鎖定,這就造成了一個問題,就是在這個圖形被解鎖前無法對圖像進行操作(比如刪除,修改等操作).
在以前用的過程中曾用過下面三個方法解決問題.
第一種方法,在要進行文件操作前將Image對象銷毀.
PictureBox picbox;
if(picbox.Image!=null)picbox.Image.Disponse();
第二種方法,就是在加載圖像的時候用一種方法替代:
System.Drawing.Image img = System.Drawing.Image.FromFile(filepath);
System.Drawing.Image bmp = new System.Drawing.Bitmap(img.Width, img.Height, ? ?System.Drawing.Imaging.PixelFormat.Format32bppArgb);
System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(bmp);
g.DrawImage(img, 0, 0);
g.Flush();
g.Dispose();
img.Dispose();
//下面開始使用bmp作為顯示的Image對象
System.Drawing.Image img = System.Drawing.Image.FromFile(filepath);
System.Drawing.Image bmp = new System.Drawing.Bitmap(img);
img.Dispose();
方法四:
fs = New System.IO.FileStream("C:\WINNT\Web\Wallpaper\Fly Away.jpg",
IO.FileMode.Open, IO.FileAccess.Read)
PictureBox1.Image = System.Drawing.Image.FromStream(fs)
fs.Close()
Image類的FromFile方法打開文件と后沒有關閉,導致文件鎖定,無法進行刪除、移動等操作。
該而使用FromStream方法,代碼如下:
//讀取文件流
FileStream fileStream = new FileStream(iconPath, FileMode.Open, FileAccess.Read);
int byteLength = (int)fileStream.Length;
byte[] fileBytes = new byte[byteLength];
fileStream.Read(fileBytes, 0, byteLength);
//文件流關閉,文件解除鎖定
fileStream.Close();
Pictrue.Image = Image.FromStream(new MemoryStream(fileBytes));
因為FromStream方法參數應用的流必須一直保持打開,故代碼中有一個文件流向MemeoryStream流的轉換,從而可以關閉文件流,保持MemoryStream流的打開狀態。
========
C#如何釋放已經加載的圖片
http://www.cnblogs.com/netlyf/p/3781630.html使用Image.FromFile取磁盤上的圖片時,這個方法會鎖定圖片文件,而且會導致內存占用增大, 有幾種方法解決:
一:將Image類轉換成Bitmap類
System.Drawing.Image img = System.Drawing.Image.FromFile(filepath);
System.Drawing.Image bmp = new System.Drawing.Bitmap(img);
img.Dispose();
然后使用 bmp作為PictureBox的圖片源
二:從流中讀取
FileStream fileStream = new FileStream("文件名", FileMode.Open, FileAccess.Read);
pictureBox1.Image = Image.FromStream(fileStream);
fileStream.Close();
fileStream.Dispose();?
原因:一個圖像對象從一個文件構造時該文件仍保留鎖定對象的生存期。所以關鍵是要使用 Graphics.DrawImage()方法或Drawing.Bitmap()方法來將映像復制到新位圖Bitmap對象,然后Bitmap和Graphics就可以釋放了。或者用使用FileStream的方式將文件讀成流。
========
c#在sql中存取圖片image示例
http://www.jb51.net/article/48035.htm這篇文章主要介紹了c#在sql中存取圖片image示例,需要的朋友可以參考下
..(1)控制臺應用程序下演示插入圖片
復制代碼 代碼如下:
public void InsertIMG()
{
//將需要存儲的圖片讀取為數據流
FileStream fs = new FileStream(@"E:\c.jpg", FileMode.Open,FileAccess.Read);
Byte[] btye2 = new byte[fs.Length];
fs.Read(btye2 , 0, Convert.ToInt32(fs.Length));
fs.Close();
using (SqlConnection conn = new SqlConnection(sqlconnstr))
{
conn.Open();
SqlCommand cmd = new SqlCommand();
cmd.Connection = conn;
cmd.CommandText = "insert into T_Img(imgfile) values(@imgfile)";
SqlParameter par = new SqlParameter("@imgfile", SqlDbType.Image);
par.Value = bt;
cmd.Parameters.Add(par);
int t=(int)(cmd.ExecuteNonQuery());
if (t > 0)
{
Console.WriteLine("插入成功");
}
conn.Close();
}
}
(2)控制臺應用程序下讀出并生成圖片到物理位置
復制代碼 代碼如下:
public void Read()
{
byte[] MyData = new byte[0];
using (SqlConnection conn = new SqlConnection(sqlconnstr))
{
conn.Open();
SqlCommand cmd = new SqlCommand();
cmd.Connection = conn;
cmd.CommandText = "select * from T_img";
SqlDataReader sdr = cmd.ExecuteReader();
sdr.Read();
MyData = (byte[])sdr["ImgFile"];//讀取第一個圖片的位流
int ArraySize= MyData.GetUpperBound(0);//獲得數據庫中存儲的位流數組的維度上限,用作讀取流的上限
FileStream fs = new FileStream(@"c:\00.jpg", FileMode.OpenOrCreate, FileAccess.Write);
fs.Write(MyData, 0, ArraySize);
fs.Close(); ? //-- 寫入到c:\00.jpg。
conn.Close();
Console.WriteLine("讀取成功");//查看硬盤上的文件
}
}
(3)Web下picshow.aspx頁將圖片讀取出來并寫入到瀏覽器上呈現
復制代碼 代碼如下:
public void Read()
{
byte[] MyData = new byte[0];
using (SqlConnection conn = new SqlConnection(sqlconnstr))
{
conn.Open();
SqlCommand cmd = new SqlCommand();
cmd.Connection = conn;
cmd.CommandText = "select * from T_img";
SqlDataReader sdr = cmd.ExecuteReader();
sdr.Read();
MyData = (byte[])sdr["ImgFile"];
Response.ContentType = "image/gif";
Response.BinaryWrite(MyData);
conn.Close();
Response.Write("讀取成功");
}
(4)在web中可以如上picshow.aspx頁面讀取并顯示圖片,而真正引用該圖片時如下示例
復制代碼 代碼如下:
<img src="picshow.aspx" width="500" height="300" />
?(5)Winform下將圖片寫入到sql數據庫image類型字段中的方法和以上方法基本一致,僅區別于可以利用多個對話框來幫助選取存儲圖片等,各個屬性可以方便的利用上
(6)Winform下讀取圖片在picturebox控件中顯示出來
方法一:利用MemoryStream 和System.Drawing.Image
復制代碼 代碼如下:
public void Read()
{
byte[] MyData = new byte[0];
using (SqlConnection conn = new SqlConnection(sqlconnstr))
{
conn.Open();
SqlCommand cmd = new SqlCommand();
cmd.Connection = conn;
cmd.CommandText = "select * from T_img";
SqlDataReader sdr = cmd.ExecuteReader();
sdr.Read();
MyData = (byte[])sdr["ImgFile"];
MemoryStream mystream = new MemoryStream(MyData);
//用指定的數據流來創建一個image圖片
System.Drawing.Image img = System.Drawing.Image.FromStream(mystream, true);
System.Windows.Forms.PictureBox picbox = new PictureBox();
picbox.Image = img;
picbox.Left = 30;
picbox.Top = 80;
picbox.Width = 800;
picbox.Height = 500;
this.Controls.Add(picbox);
mystream.Close();
conn.Close();
}
}
方法二:將流直接讀取成圖片并寫入到物理位置,然后再行利用該圖片呈現
復制代碼 代碼如下:
void Read()
{
using (SqlConnection conn = new SqlConnection(sqlconnstr))
{
conn.Open();
SqlCommand cmd = new SqlCommand();
cmd.Connection = conn;
cmd.CommandText = "select * from T_img";
SqlDataReader sdr = cmd.ExecuteReader();
sdr.Read();
byte[] Image_img = (byte[])sdr["ImgFile"];
if (Image_img.Length == 0)
{
return;
}
int filelength = Image_img.Length;
string imageName = "1.jpg";
string myUrl = Environment.CurrentDirectory + "\\" + imageName;
FileStream fs = new FileStream(myUrl, FileMode.OpenOrCreate,FileAccess.Write);
BinaryWriter BW = new BinaryWriter(fs);
BW.BaseStream.Write(Image_img, 0, filelength);
BW.Flush();
BW.Close();
System.Windows.Forms.PictureBox picbox = new PictureBox();
//為picbox添加圖片方法一
//picbox.ImageLocation = myUrl;
//picbox.Width = 800;
//picbox.Height = 300;
//為picbox添加圖片方法二
Bitmap bitmap = new Bitmap(myUrl);
picbox.Width = 100;//bitmap.Width;
picbox.Height = 80;//bitmap.Height;
picbox.Image = (Image)bitmap;
picbox.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage;
picbox.Left = 20;
picbox.Top = 30;
this.Controls.Add(picbox);
conn.Close();
}
}
========
C#利用原圖和水印圖的重疊簡單實現水印的方法
http://www.jb51.net/article/82764.htm這篇文章主要介紹了C#利用原圖和水印圖的重疊簡單實現水印的方法,實例演示了完整的水印操作類實現方法,需要的朋友可以參考下
圖片操作類
/// <summary> /// 獲取一個圖片按等比例縮小后的大小。 /// </summary> /// <param name="maxWidth">需要縮小到的寬度</param> /// <param name="maxHeight">需要縮小到的高度</param> /// <param name="imageOriginalWidth">圖片的原始寬度</param> /// <param name="imageOriginalHeight">圖片的原始高度</param> /// <returns>返回圖片按等比例縮小后的實際大小</returns> public static Size GetNewSize(int maxWidth, int maxHeight, int imageOriginalWidth, int imageOriginalHeight) { ? double w = 0.0; ? double h = 0.0; ? double sw = Convert.ToDouble(imageOriginalWidth); ? double sh = Convert.ToDouble(imageOriginalHeight); ? double mw = Convert.ToDouble(maxWidth); ? double mh = Convert.ToDouble(maxHeight); ? if (sw < mw && sh < mh) ? { ? ? w = sw; ? ? h = sh; ? } ? else if ((sw / sh) > (mw / mh)) ? { ? ? w = maxWidth; ? ? h = (w * sh) / sw; ? } ? else ?{ ? ? h = maxHeight; ? ? w = (h * sw) / sh; ? } ? return new Size(Convert.ToInt32(w), Convert.ToInt32(h)); } /// <summary> /// 對給定的一個圖片(Image對象)生成一個指定大小的縮略圖。 /// </summary> /// <param name="originalImage">原始圖片</param> /// <param name="thumMaxWidth">縮略圖的寬度</param> /// <param name="thumMaxHeight">縮略圖的高度</param> /// <returns>返回縮略圖的Image對象</returns> public static System.Drawing.Image GetThumbNailImage(System.Drawing.Image originalImage, int thumMaxWidth, int thumMaxHeight) { ? Size thumRealSize = Size.Empty; ? System.Drawing.Image newImage = originalImage; ? Graphics graphics = null; ? try ?{ ? ? thumRealSize = GetNewSize(thumMaxWidth, thumMaxHeight, originalImage.Width, originalImage.Height); ? ? newImage = new Bitmap(thumRealSize.Width, thumRealSize.Height); ? ? graphics = Graphics.FromImage(newImage); ? ? graphics.CompositingQuality = CompositingQuality.HighQuality; ? ? graphics.InterpolationMode = InterpolationMode.HighQualityBicubic; ? ? graphics.SmoothingMode = SmoothingMode.HighQuality; ? ? graphics.Clear(Color.Transparent); ? ? graphics.DrawImage(originalImage, new Rectangle(0, 0, thumRealSize.Width, thumRealSize.Height), new Rectangle(0, 0, originalImage.Width, originalImage.Height), GraphicsUnit.Pixel); ? } ? catch { } ? finally ?{ ? ? if (graphics != null) ? ? { ? ? ? graphics.Dispose(); ? ? ? graphics = null; ? ? } ? } ? return newImage; } /// <summary> /// 對給定的一個圖片文件生成一個指定大小的縮略圖。 /// </summary> /// <param name="originalImage">圖片的物理文件地址</param> /// <param name="thumMaxWidth">縮略圖的寬度</param> /// <param name="thumMaxHeight">縮略圖的高度</param> /// <returns>返回縮略圖的Image對象</returns> public static System.Drawing.Image GetThumbNailImage(string imageFile, int thumMaxWidth, int thumMaxHeight) { ? System.Drawing.Image originalImage = null; ? System.Drawing.Image newImage = null; ? try ?{ ? ? originalImage = System.Drawing.Image.FromFile(imageFile); ? ? newImage = GetThumbNailImage(originalImage, thumMaxWidth, thumMaxHeight); ? } ? catch { } ? finally ?{ ? ? if (originalImage != null) ? ? { ? ? ? originalImage.Dispose(); ? ? ? originalImage = null; ? ? } ? } ? return newImage; } /// <summary> /// 對給定的一個圖片文件生成一個指定大小的縮略圖,并將縮略圖保存到指定位置。 /// </summary> /// <param name="originalImageFile">圖片的物理文件地址</param> /// <param name="thumbNailImageFile">縮略圖的物理文件地址</param> /// <param name="thumMaxWidth">縮略圖的寬度</param> /// <param name="thumMaxHeight">縮略圖的高度</param> public static void MakeThumbNail(string originalImageFile, string thumbNailImageFile, int thumMaxWidth, int thumMaxHeight) { ? System.Drawing.Image newImage = GetThumbNailImage(originalImageFile, thumMaxWidth, thumMaxHeight); ? try ?{ ? ? newImage.Save(thumbNailImageFile, ImageFormat.Jpeg); ? } ? catch ?{ } ? finally ?{ ? ? newImage.Dispose(); ? ? newImage = null; ? } } /// <summary> /// 將一個圖片的內存流調整為指定大小,并返回調整后的內存流。 /// </summary> /// <param name="originalImageStream">原始圖片的內存流</param> /// <param name="newWidth">新圖片的寬度</param> /// <param name="newHeight">新圖片的高度</param> /// <returns>返回調整后的圖片的內存流</returns> public static MemoryStream ResizeImage(Stream originalImageStream, int newWidth, int newHeight) { ? MemoryStream newImageStream = null; ? System.Drawing.Image newImage = Globals.GetThumbNailImage(System.Drawing.Image.FromStream(originalImageStream), newWidth, newHeight); ? if (newImage != null) ? { ? ? newImageStream = new MemoryStream(); ? ? newImage.Save(newImageStream, ImageFormat.Jpeg); ? } ? return newImageStream; } /// <summary> /// 將一個內存流保存為磁盤文件。 /// </summary> /// <param name="stream">內存流</param> /// <param name="newFile">目標磁盤文件地址</param> public static void SaveStreamToFile(Stream stream, string newFile) { ? if (stream == null || stream.Length == 0 || string.IsNullOrEmpty(newFile)) ? { ? ? return; ? } ? byte[] buffer = new byte[stream.Length]; ? stream.Position = 0; ? stream.Read(buffer, 0, buffer.Length); ? FileStream fileStream = new FileStream(newFile, FileMode.OpenOrCreate, FileAccess.Write); ? fileStream.Write(buffer, 0, buffer.Length); ? fileStream.Flush(); ? fileStream.Close(); ? fileStream.Dispose(); } /// <summary> /// 對一個指定的圖片加上圖片水印效果。 /// </summary> /// <param name="imageFile">圖片文件地址</param> /// <param name="waterImage">水印圖片(Image對象)</param> public static void CreateImageWaterMark(string imageFile, System.Drawing.Image waterImage) { ? if (string.IsNullOrEmpty(imageFile) || !File.Exists(imageFile) || waterImage == null) ? { ? ? return; ? } ? System.Drawing.Image originalImage = System.Drawing.Image.FromFile(imageFile); ? if (originalImage.Width - 10 < waterImage.Width || originalImage.Height - 10 < waterImage.Height) ? { ? ? return; ? } ? Graphics graphics = Graphics.FromImage(originalImage); ? int x = originalImage.Width - waterImage.Width - 10; ? int y = originalImage.Height - waterImage.Height - 10; ? int width = waterImage.Width; ? int height = waterImage.Height; ? graphics.DrawImage(waterImage, new Rectangle(x, y, width, height), 0, 0, width, height, GraphicsUnit.Pixel); ? graphics.Dispose(); ? MemoryStream stream = new MemoryStream(); ? originalImage.Save(stream, ImageFormat.Jpeg); ? originalImage.Dispose(); ? System.Drawing.Image imageWithWater = System.Drawing.Image.FromStream(stream); ? imageWithWater.Save(imageFile); ? imageWithWater.Dispose(); } /// <summary> /// 對一個指定的圖片加上文字水印效果。 /// </summary> /// <param name="imageFile">圖片文件地址</param> /// <param name="waterText">水印文字內容</param> public static void CreateTextWaterMark(string imageFile, string waterText) { ? if (string.IsNullOrEmpty(imageFile) || string.IsNullOrEmpty(waterText) || !File.Exists(imageFile)) ? { ? ? return; ? } ? System.Drawing.Image originalImage = System.Drawing.Image.FromFile(imageFile); ? Graphics graphics = Graphics.FromImage(originalImage); ? graphics.SmoothingMode = SmoothingMode.HighQuality; ? graphics.TextRenderingHint = TextRenderingHint.ClearTypeGridFit; ? graphics.CompositingQuality = CompositingQuality.HighQuality; ? graphics.InterpolationMode = InterpolationMode.HighQualityBicubic; ? SolidBrush brush = new SolidBrush(Color.FromArgb(153, 255, 255, 255)); ? Font waterTextFont = new Font("Arial", 16, FontStyle.Regular); ? SizeF waterTextSize = graphics.MeasureString(waterText, waterTextFont); ? float x = (float)originalImage.Width - waterTextSize.Width - 10F; ? float y = (float)originalImage.Height - waterTextSize.Height - 10F; ? graphics.DrawString(waterText, waterTextFont, brush, x, y); ? graphics.Dispose(); ? brush.Dispose(); ? MemoryStream stream = new MemoryStream(); ? originalImage.Save(stream, ImageFormat.Jpeg); ? originalImage.Dispose(); ? System.Drawing.Image imageWithWater = System.Drawing.Image.FromStream(stream); ? imageWithWater.Save(imageFile); ? imageWithWater.Dispose(); } /// <summary> /// 判斷上傳組件是否包含內容。 /// </summary> /// <param name="fileUpload">ASP.NET 2.0標準上傳組件</param> /// <returns>如果數據有效,則返回True,否則返回False</returns> public static bool IsAttachmentValid(FileUpload fileUpload) { ? if (fileUpload != null && ? ? fileUpload.PostedFile != null && ? ? !string.IsNullOrEmpty(fileUpload.PostedFile.FileName) && ? ? fileUpload.PostedFile.ContentLength > 0) ? { ? ? return true; ? } ? return false; }?
public class ImageHelper { ? #region " 水印存放的相對路徑 " ? public static string GetLogoPath() ? { ? ? return "/images/logo.png"; ?///水印圖路徑 ? } ? #endregion ? #region " 圖片水印 " ? // <summary> ? // 在圖片上生成圖片水印,此方法不支持Gif類型的圖片 ? // </summary> ? // <param name="Path">原服務器圖片路徑</param> ? // <param name="Path_syp">生成的帶圖片水印的圖片路徑</param> ? // <param name="Path_sypf">水印圖片路徑</param> ? public static void MarkImage(Stream InUploadImagePath, string inLogoImagePath, string InSavePath) ? { ? ? System.Drawing.Image Image = System.Drawing.Image.FromStream(InUploadImagePath); ? ? System.Drawing.Image newimage = Image.FromFile(Current.Server.MapPath(inLogoImagePath)); ? ? Graphics g = Graphics.FromImage(Image); ? ? g.DrawImage(newimage, new Rectangle(Image.Width - newimage.Width, Image.Height - newimage.Height, newimage.Width, newimage.Height), 0, 0, newimage.Width, newimage.Height, GraphicsUnit.Pixel); ? ? try { ? ? ? Image.Save(Current.Server.MapPath(InSavePath)); ? ? } ? ? catch (Exception ex) { ? ? } ? ? finally { ? ? ? g.Dispose(); ? ? ? Image.Dispose(); ? ? ? newimage.Dispose(); ? ? } ? } ? #endregion }?
更多關于C#相關內容感興趣的讀者可查看本站專題:《C#圖片操作技巧匯總》、《WinForm控件用法總結》、《C#數據結構與算法教程》、《C#常見控件用法教程》、《C#面向對象程序設計入門教程》及《C#程序設計之線程使用技巧總結》
========
C#給圖片加水印標記,可設置透明度
http://www.cnblogs.com/huangcong/archive/2010/03/26/1697319.html/// <summary> ?
/// Creating a Watermarked Photograph with GDI+ for .NET ?
/// </summary> ?
/// <param name="rSrcImgPath">原始圖片的物理路徑</param> ?
/// <param name="rMarkImgPath">水印圖片的物理路徑</param> ?
/// <param name="rMarkText">水印文字(不顯示水印文字設為空串)</param> ?
/// <param name="rDstImgPath">輸出合成后的圖片的物理路徑</param> ?
/// @整理: anyrock@mending.cn ?
public void BuildWatermark(string rSrcImgPath,string rMarkImgPath,string rMarkText,string rDstImgPath) ?
{ ?
? ? ?//以下(代碼)從一個指定文件創建了一個Image 對象,然后為它的 Width 和 Height定義變量。 ?
? ? ?//這些長度待會被用來建立一個以24 bits 每像素的格式作為顏色數據的Bitmap對象。 ?
? ? ?Image imgPhoto = Image.FromFile(rSrcImgPath); ?
? ? ?int phWidth = imgPhoto.Width; ?
? ? ?int phHeight = imgPhoto.Height; ?
? ? ?Bitmap bmPhoto=new Bitmap(phWidth,phHeight, PixelFormat.Format24bppRgb); ?
? ? ?bmPhoto.SetResolution(72,72); ?
? ? ?Graphics grPhoto = Graphics.FromImage(bmPhoto); ?
? ? ?//這個代碼載入水印圖片,水印圖片已經被保存為一個BMP文件,以綠色(A=0,R=0,G=255,B=0)作為背景顏色。 ?
? ? ?//再一次,會為它的Width 和Height定義一個變量。 ?
? ? ?Image imgWatermark = new Bitmap(rMarkImgPath); ?
? ? ?int wmWidth = imgWatermark.Width; ?
? ? ?int wmHeight = imgWatermark.Height; ?
? ? ?//這個代碼以100%它的原始大小繪制imgPhoto 到Graphics 對象的(x=0,y=0)位置。 ?
? ? ?//以后所有的繪圖都將發生在原來照片的頂部。 ?
? ? ?grPhoto.SmoothingMode = SmoothingMode.AntiAlias; ?
? ? ?grPhoto.DrawImage( ?
? ? ? ? ? imgPhoto, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? new Rectangle(0, 0, phWidth, phHeight), ??
? ? ? ? ? 0, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? 0, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? phWidth, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? phHeight, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? GraphicsUnit.Pixel); ?
? ? ?//為了最大化版權信息的大小,我們將測試7種不同的字體大小來決定我們能為我們的照片寬度使用的可能的最大大小。 ?
? ? ?//為了有效地完成這個,我們將定義一個整型數組,接著遍歷這些整型值測量不同大小的版權字符串。 ?
? ? ?//一旦我們決定了可能的最大大小,我們就退出循環,繪制文本 ?
? ? ?int[] sizes = new int[]{16,14,12,10,8,6,4}; ?
? ? ?Font crFont = null; ??
? ? ?SizeF crSize = new ?SizeF(); ??
? ? ?for (int i=0 ;i<7; i++) ?
? ? ?{ ??
? ? ? ? ? crFont = new Font("arial", sizes[i], ?
? ? ? ? ? ? ? ? FontStyle.Bold); ?
? ? ? ? ? crSize = grPhoto.MeasureString(rMarkText, ?
? ? ? ? ? ? ? ? crFont); ?
? ? ? ? ? if((ushort)crSize.Width < (ushort)phWidth) ?
? ? ? ? ? ? ? ? break; ?
? ? ?} ?
? ? ?//因為所有的照片都有各種各樣的高度,所以就決定了從圖象底部開始的5%的位置開始。 ?
? ? ?//使用rMarkText字符串的高度來決定繪制字符串合適的Y坐標軸。 ?
? ? ?//通過計算圖像的中心來決定X軸,然后定義一個StringFormat 對象,設置StringAlignment 為Center。 ?
? ? ?int yPixlesFromBottom = (int)(phHeight *.05); ?
? ? ?float yPosFromBottom = ((phHeight - ??
? ? ? ? ? yPixlesFromBottom)-(crSize.Height/2)); ?
? ? ?float xCenterOfImg = (phWidth/2); ?
? ? ?StringFormat StrFormat = new StringFormat(); ?
? ? ?StrFormat.Alignment = StringAlignment.Center; ?
? ? ?//現在我們已經有了所有所需的位置坐標來使用60%黑色的一個Color(alpha值153)創建一個SolidBrush 。 ?
? ? ?//在偏離右邊1像素,底部1像素的合適位置繪制版權字符串。 ?
? ? ?//這段偏離將用來創建陰影效果。使用Brush重復這樣一個過程,在前一個繪制的文本頂部繪制同樣的文本。 ?
? ? ?SolidBrush semiTransBrush2 = ??
? ? ? ? ? new SolidBrush(Color.FromArgb(153, 0, 0,0)); ??
? ? ?grPhoto.DrawString(rMarkText, ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? crFont, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
? ? ? ? ? semiTransBrush2, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? new PointF(xCenterOfImg+1,yPosFromBottom+1), ??
? ? ? ? ? StrFormat); ?
? ? ?SolidBrush semiTransBrush = new SolidBrush( ?
? ? ? ? ? Color.FromArgb(153, 255, 255, 255)); ?
? ? ?grPhoto.DrawString(rMarkText, ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? crFont, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
? ? ? ? ? semiTransBrush, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
? ? ? ? ? new PointF(xCenterOfImg,yPosFromBottom), ? ?
? ? ? ? ? StrFormat); ?
? ? ?//根據前面修改后的照片創建一個Bitmap。把這個Bitmap載入到一個新的Graphic對象。 ?
? ? ?Bitmap bmWatermark = new Bitmap(bmPhoto); ??
? ? ?bmWatermark.SetResolution( ?
? ? ? ? ? imgPhoto.HorizontalResolution, ??
? ? ? ? ? imgPhoto.VerticalResolution); ?
? ? ?Graphics grWatermark = ?
? ? ? ? ? Graphics.FromImage(bmWatermark); ?
? ? ?//通過定義一個ImageAttributes 對象并設置它的兩個屬性,我們就是實現了兩個顏色的處理,以達到半透明的水印效果。 ?
? ? ?//處理水印圖象的第一步是把背景圖案變為透明的(Alpha=0, R=0, G=0, B=0)。我們使用一個Colormap 和定義一個RemapTable來做這個。 ?
? ? ?//就像前面展示的,我的水印被定義為100%綠色背景,我們將搜到這個顏色,然后取代為透明。 ?
? ? ?ImageAttributes imageAttributes = ?
? ? ? ? ? new ImageAttributes(); ?
? ? ?ColorMap colorMap = new ColorMap(); ?
? ? ?colorMap.OldColor=Color.FromArgb(255, 0, 255, 0); ?
? ? ?colorMap.NewColor=Color.FromArgb(0, 0, 0, 0); ?
? ? ?ColorMap[] remapTable = {colorMap}; ?
? ? ?//第二個顏色處理用來改變水印的不透明性。 ?
? ? ?//通過應用包含提供了坐標的RGBA空間的5x5矩陣來做這個。 ?
? ? ?//通過設定第三行、第三列為0.3f我們就達到了一個不透明的水平。結果是水印會輕微地顯示在圖象底下一些。 ?
? ? ?imageAttributes.SetRemapTable(remapTable, ?
? ? ? ? ? ColorAdjustType.Bitmap); ?
? ? ?float[][] colorMatrixElements = { ??
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?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, ?0.3f, 0.0f}, ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?new float[] {0.0f, ?0.0f, ?0.0f, ?0.0f, 1.0f} ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }; ?
? ? ?ColorMatrix wmColorMatrix = new ?
? ? ? ? ? ColorMatrix(colorMatrixElements); ?
? ? ?imageAttributes.SetColorMatrix(wmColorMatrix, ??
? ? ? ? ? ColorMatrixFlag.Default, ??
? ? ? ? ? ColorAdjustType.Bitmap); ?
? ? ?//隨著兩個顏色處理加入到imageAttributes 對象,我們現在就能在照片右手邊上繪制水印了。 ?
? ? ?//我們會偏離10像素到底部,10像素到左邊。 ?
? ? ?int markWidth; ?
? ? ?int markHeight; ?
? ? ?//mark比原來的圖寬 ?
? ? ?if(phWidth<=wmWidth) ?
? ? ?{ ?
? ? ? ? ? markWidth = phWidth-10; ?
? ? ? ? ? markHeight = (markWidth*wmHeight)/wmWidth; ?
? ? ?} ?
? ? ?else if(phHeight<=wmHeight) ?
? ? ?{ ?
? ? ? ? ? markHeight = phHeight-10; ?
? ? ? ? ? markWidth = (markHeight*wmWidth)/wmHeight; ?
? ? ?} ?
? ? ?else ?
? ? ?{ ?
? ? ? ? ? markWidth = wmWidth; ?
? ? ? ? ? markHeight = wmHeight; ?
? ? ?} ?
? ? ?int xPosOfWm = ((phWidth - markWidth)-10); ?
? ? ?int yPosOfWm = 10; ?
? ? ?grWatermark.DrawImage(imgWatermark, ??
? ? ? ? ? new Rectangle(xPosOfWm,yPosOfWm,markWidth, ?
? ? ? ? ? markHeight), ?
? ? ? ? ? 0, ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? 0, ? ? ? ? ? ? ? ? ? ? ? ? ??
? ? ? ? ? wmWidth, ? ? ? ? ? ? ? ?
? ? ? ? ? wmHeight, ? ? ? ? ? ? ??
? ? ? ? ? GraphicsUnit.Pixel, ??
? ? ? ? ? imageAttributes); ?
? ? ?//最后的步驟將是使用新的Bitmap取代原來的Image。 銷毀兩個Graphic對象,然后把Image 保存到文件系統。 ?
? ? ?imgPhoto = bmWatermark; ?
? ? ?grPhoto.Dispose(); ?
? ? ?grWatermark.Dispose(); ?
? ? ?imgPhoto.Save(rDstImgPath,ImageFormat.Jpeg); ?
? ? ?imgPhoto.Dispose(); ?
? ? ?imgWatermark.Dispose(); ? ? ? ? ? ? ? ? ?
} ?
========
總結
以上是生活随笔為你收集整理的C# Image 学习总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: VC++文件操作
- 下一篇: C#二进制文件编程实践