C#图片编辑类
using ?System;
using ?System.Drawing;
using ?System.IO;
/**/ /// ? <summary>
/// ?ImgEdit?的摘要說 明
/// ? </summary>
public ? class ?ImgEdit
{
???? public ?ImgEdit()
????{
???????? //
???????? // ?TODO:?在此處添加構(gòu)造函數(shù)邏輯
???????? //
????}
???? /**/ /// ? <summary>
???? /// ?圖片水 印
???? /// ? </summary>
???? /// ? <param?name="ImgFile"> 原圖文件地址 </param>
???? /// ? <param?name="WaterImg"> 水印圖片地址 </param>
???? /// ? <param?name="sImgPath"> 水印圖片保存地址 </param>
???? /// ? <param?name="Alpha"> 水印透明度設(shè)置 </param>
???? /// ? <param?name="iScale"> 水印圖片在原圖上的顯示比例(水平) </param>
???? /// ? <param?name="intDistance"> 水印圖片在原圖上的邊距確定,以圖片的右邊和下邊為準(zhǔn),當(dāng)設(shè)定的邊距超過一定大小后參 數(shù)會自動(dòng)失效 </param>
???? public ? bool ?ImgWater( string ?ImgFile,? string ?WaterImg,? string ?sImgPath,? float ?Alpha,? float ?iScale,? int ?intDistance)
????{
???????? try
????????{
???????????? // 裝載圖片
????????????FileStream?fs? = ? new ?FileStream(ImgFile,?FileMode.Open);
????????????BinaryReader?br? = ? new ?BinaryReader(fs);
???????????? byte []?bytes? = ?br.ReadBytes(( int )fs.Length);
????????????br.Close();
????????????fs.Close();
????????????MemoryStream?ms? = ? new ?MemoryStream(bytes);
????????????System.Drawing.Image?imgPhoto? = ?System.Drawing.Image.FromStream(ms);
???????????? int ?imgPhotoWidth? = ?imgPhoto.Width;
???????????? int ?imgPhotoHeight? = ?imgPhoto.Height;
????????????System.Drawing.Image?imgWatermark? = ? new ?Bitmap(WaterImg);
???????????? int ?imgWatermarkWidth? = ?imgWatermark.Width;
???????????? int ?imgWatermarkHeight? = ?imgWatermark.Height;
???????????? // 計(jì)算水印圖片尺寸
???????????? decimal ?aScale? = ?Convert.ToDecimal(iScale);
???????????? decimal ?pScale? = ? 0.05M ;
???????????? decimal ?MinScale? = ?aScale? - ?pScale;
???????????? decimal ?MaxScale? = ?aScale? + ?pScale;
???????????? // 設(shè)置比例
???????????? int ?imgWatermarkWidthNew? = ?Convert.ToInt32(imgPhotoWidth? * ?aScale);
???????????? int ?imgWatermarkHeightNew? = ?Convert.ToInt32((imgPhotoWidth? * ?aScale? / ?imgWatermarkWidth)? * ?imgWatermarkHeight);
???????????? // 將原圖畫出來
????????????Bitmap?bmPhoto? = ? new ?Bitmap(imgPhotoWidth,?imgPhotoHeight,?System.Drawing.Imaging.PixelFormat.Format24bppRgb);
????????????bmPhoto.SetResolution( 72 ,? 72 );
????????????Graphics?gbmPhoto? = ?Graphics.FromImage(bmPhoto);
????????????gbmPhoto.InterpolationMode? = ?System.Drawing.Drawing2D.InterpolationMode.High;
????????????gbmPhoto.SmoothingMode? = ?System.Drawing.Drawing2D.SmoothingMode.HighQuality;
????????????gbmPhoto.Clear(Color.White);
????????????gbmPhoto.DrawImage(imgPhoto,? new ?Rectangle( 0 ,? 0 ,?imgPhotoWidth,?imgPhotoHeight),? 0 ,? 0 ,?imgPhotoWidth,?imgPhotoHeight,?GraphicsUnit.Pixel);
????????????Bitmap?bmWatermark? = ? new ?Bitmap(bmPhoto);
????????????bmWatermark.SetResolution(imgPhoto.HorizontalResolution,?imgPhoto.VerticalResolution);
????????????Graphics?gWatermark? = ?Graphics.FromImage(bmWatermark);
???????????? // 指定高質(zhì)量顯示水印圖片質(zhì)量
????????????gWatermark.InterpolationMode? = ?System.Drawing.Drawing2D.InterpolationMode.High;
????????????gWatermark.SmoothingMode? = ?System.Drawing.Drawing2D.SmoothingMode.HighQuality;
????????????System.Drawing.Imaging.ImageAttributes?imageAttributes? = ? new ?System.Drawing.Imaging.ImageAttributes();
???????????? // 設(shè)置兩種顏色,達(dá)到合成效果
????????????System.Drawing.Imaging.ColorMap?colorMap? = ? new ?System.Drawing.Imaging.ColorMap();
????????????colorMap.OldColor? = ?Color.FromArgb( 255 ,? 0 ,? 255 ,? 0 );
????????????colorMap.NewColor? = ?Color.FromArgb( 0 ,? 0 ,? 0 ,? 0 );
????????????System.Drawing.Imaging.ColorMap[]?remapTable? = ?{?colorMap?};
????????????imageAttributes.SetRemapTable(remapTable,?System.Drawing.Imaging.ColorAdjustType.Bitmap);
???????????? // 用矩陣設(shè)置水印圖片透明度
???????????? 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 ,??Alpha,? 0.0f },
??????????????? new ? float []?{ 0.0f ,?? 0.0f ,?? 0.0f ,?? 0.0f ,? 1.0f }
????????????};
????????????System.Drawing.Imaging.ColorMatrix?wmColorMatrix? = ? new ?System.Drawing.Imaging.ColorMatrix(colorMatrixElements);
????????????imageAttributes.SetColorMatrix(wmColorMatrix,?System.Drawing.Imaging.ColorMatrixFlag.Default,?System.Drawing.Imaging.ColorAdjustType.Bitmap);
???????????? // 確定水印邊距
???????????? int ?xPos? = ?imgPhotoWidth? - ?imgWatermarkWidthNew;
???????????? int ?yPos? = ?imgPhotoHeight? - ?imgWatermarkHeightNew;
???????????? int ?xPosOfWm? = ? 0 ;
???????????? int ?yPosOfWm? = ? 0 ;
???????????? if ?(xPos? > ?intDistance)
????????????????xPosOfWm? = ?xPos? - ?intDistance;
???????????? else
????????????????xPosOfWm? = ?xPos;
???????????? if ?(yPos? > ?intDistance)
????????????????yPosOfWm? = ?yPos? - ?intDistance;
???????????? else
????????????????yPosOfWm? = ?yPos;
????????????gWatermark.DrawImage(imgWatermark,? new ?Rectangle(xPosOfWm,?yPosOfWm,?imgWatermarkWidthNew,?imgWatermarkHeightNew),? 0 ,? 0 ,?imgWatermarkWidth,?imgWatermarkHeight,?GraphicsUnit.Pixel,?imageAttributes);
????????????imgPhoto? = ?bmWatermark;
????????????imgPhoto.Save(sImgPath,?System.Drawing.Imaging.ImageFormat.Jpeg);
???????????? // 銷毀對象
????????????gbmPhoto.Dispose();
????????????gWatermark.Dispose();
????????????imgPhoto.Dispose();
????????????imgWatermark.Dispose();
???????????? return ? true ;
????????}
???????? catch ?(Exception?ex)
????????{
???????????? return ? false ;
????????}
????}
???? /**/ /// ? <summary>
???? /// ?文字水 印
???? /// ? </summary>
???? /// ? <param?name="ImgFile"> 原圖文件地址 </param>
???? /// ? <param?name="TextFont"> 水印文字 </param>
???? /// ? <param?name="sImgPath"> 文字水印圖片保存地址 </param>
???? /// ? <param?name="Alpha"> 文字透明度?其數(shù)值的范圍在0到255 </param>
???? /// ? <param?name="widthFont"> 文字塊在圖片中所占寬度比例 </param>
???? /// ? <param?name="hScale"> 高度位置 </param>
???? public ? bool ?TextWater( string ?ImgFile,? string ?TextFont,? string ?sImgPath,? int ?Alpha,? float ?widthFont,? float ?hScale)
????{
???????? try
????????{
????????????FileStream?fs? = ? new ?FileStream(ImgFile,?FileMode.Open);
????????????BinaryReader?br? = ? new ?BinaryReader(fs);
???????????? byte []?bytes? = ?br.ReadBytes(( int )fs.Length);
????????????br.Close();
????????????fs.Close();
????????????MemoryStream?ms? = ? new ?MemoryStream(bytes);
????????????System.Drawing.Image?imgPhoto? = ?System.Drawing.Image.FromStream(ms);
???????????? int ?imgPhotoWidth? = ?imgPhoto.Width;
???????????? int ?imgPhotoHeight? = ?imgPhoto.Height;
????????????Bitmap?bmPhoto? = ? new ?Bitmap(imgPhotoWidth,?imgPhotoHeight,?System.Drawing.Imaging.PixelFormat.Format24bppRgb);
????????????bmPhoto.SetResolution( 72 ,? 72 );
????????????Graphics?gbmPhoto? = ?Graphics.FromImage(bmPhoto);
????????????gbmPhoto.Clear(Color.FromName( " white " )); // gif背景色
????????????gbmPhoto.InterpolationMode? = ?System.Drawing.Drawing2D.InterpolationMode.High;
????????????gbmPhoto.SmoothingMode? = ?System.Drawing.Drawing2D.SmoothingMode.HighQuality;
????????????gbmPhoto.DrawImage(imgPhoto,? new ?Rectangle( 0 ,? 0 ,?imgPhotoWidth,?imgPhotoHeight),? 0 ,? 0 ,?imgPhotoWidth,?imgPhotoHeight,?GraphicsUnit.Pixel);
???????????? // 建立字體大小的數(shù)組,循環(huán)找出適合圖片的水印字體
???????????? int []?sizes? = ? new ? int []?{? 1000 ,? 800 ,? 700 ,? 650 ,? 600 ,? 560 ,? 540 ,? 500 ,? 450 ,? 400 ,? 380 ,? 360 ,? 340 ,? 320 ,? 300 ,? 280 ,? 260 ,? 240 ,? 220 ,? 200 ,? 180 ,? 160 ,? 140 ,? 120 ,? 100 ,? 80 ,? 72 ,? 64 ,? 48 ,? 32 ,? 28 ,? 26 ,? 24 ,? 20 ,? 28 ,? 16 ,? 14 ,? 12 ,? 10 ,? 8 ,? 6 ,? 4 ,? 2 ?};
????????????System.Drawing.Font?crFont? = ? null ;
????????????System.Drawing.SizeF?crSize? = ? new ?SizeF();
???????????? for ?( int ?i? = ? 0 ;?i? < ? 43 ;?i ++ )
????????????{
????????????????crFont? = ? new ?Font( " arial " ,?sizes[i],?FontStyle.Bold);
????????????????crSize? = ?gbmPhoto.MeasureString(TextFont,?crFont);
???????????????? if ?(( ushort )crSize.Width? < ?( ushort )imgPhotoWidth? * ?widthFont)
???????????????????? break ;
????????????}
???????????? // 設(shè)置水印字體的位 置
???????????? int ?yPixlesFromBottom? = ?( int )(imgPhotoHeight? * ?hScale);
???????????? float ?yPosFromBottom? = ?((imgPhotoHeight? - ?yPixlesFromBottom)? - ?(crSize.Height? / ? 2 ));
???????????? float ?xCenterOfImg? = ?(imgPhotoWidth? * ? 1 ? / ? 2 );
????????????System.Drawing.StringFormat?StrFormat? = ? new ?System.Drawing.StringFormat();
????????????StrFormat.Alignment? = ?System.Drawing.StringAlignment.Center;
???????????? // 畫兩次制造透明效果
????????????System.Drawing.SolidBrush?semiTransBrush2? = ? new ?System.Drawing.SolidBrush(Color.FromArgb(Alpha,? 0 ,? 0 ,? 0 ));
????????????gbmPhoto.DrawString(TextFont,?crFont,?semiTransBrush2,? new ?System.Drawing.PointF(xCenterOfImg? + ? 1 ,?yPosFromBottom? + ? 1 ),?StrFormat);
????????????System.Drawing.SolidBrush?semiTransBrush? = ? new ?System.Drawing.SolidBrush(Color.FromArgb(Alpha,? 255 ,? 255 ,? 255 ));
????????????gbmPhoto.DrawString(TextFont,?crFont,?semiTransBrush,? new ?System.Drawing.PointF(xCenterOfImg,?yPosFromBottom),?StrFormat);
????????????bmPhoto.Save(sImgPath,?System.Drawing.Imaging.ImageFormat.Jpeg);
????????????gbmPhoto.Dispose();
????????????imgPhoto.Dispose();
????????????bmPhoto.Dispose();
???????????? return ? true ;
????????}
???????? catch ?(Exception?ex)
????????{
???????????? return ? false ;
????????}
????}
???? /**/ /// ? <summary>
???? /// ?縮略圖
???? /// ? </summary>
???? /// ? <param?name="ImgFile"> 原圖文件地址 </param>
???? /// ? <param?name="sImgPath"> 縮略圖保存地址 </param>
???? /// ? <param?name="ResizeWidth"> 縮略圖寬度 </param>
???? /// ? <param?name="ResizeHeight"> 縮略圖高度 </param>
???? /// ? <param?name="BgColor"> 縮略圖背景顏色,注意,背景顏色只能指定KnownColor中的值,如 white,blue,red,green等 </param>
???? public ? bool ?ResizeImg( string ?ImgFile,? string ?sImgPath,? int ?ResizeWidth,? int ?ResizeHeight,? string ?BgColor)
????{
???????? try
????????{
????????????FileStream?fs? = ? new ?FileStream(ImgFile,?FileMode.Open);
????????????BinaryReader?br? = ? new ?BinaryReader(fs);
???????????? byte []?bytes? = ?br.ReadBytes(( int )fs.Length);
????????????br.Close();
????????????fs.Close();
????????????MemoryStream?ms? = ? new ?MemoryStream(bytes);
????????????System.Drawing.Image?imgPhoto? = ?System.Drawing.Image.FromStream(ms);
???????????? int ?imgPhotoWidth? = ?imgPhoto.Width;
???????????? int ?imgPhotoHeight? = ?imgPhoto.Height;
???????????? int ?StartX? = ? 0 ;
???????????? int ?StartY? = ? 0 ;
???????????? int ?NewWidth? = ?imgPhotoWidth;
???????????? int ?NewHeight? = ?imgPhotoHeight;
???????????? // 計(jì)算縮放圖片尺寸
???????????? if ?(NewWidth? > ?ResizeWidth)
????????????{
????????????????NewWidth? = ?ResizeWidth;
????????????????NewHeight? = ?Convert.ToInt32(imgPhotoHeight? * ?Math.Round(Convert.ToDecimal(NewWidth)? / ?Convert.ToDecimal(imgPhotoWidth),? 10 ));
????????????}
???????????? if ?(NewHeight? > ?ResizeHeight)
????????????{
????????????????NewHeight? = ?ResizeHeight;
????????????????NewWidth? = ?Convert.ToInt32(imgPhotoWidth? * ?Math.Round(Convert.ToDecimal(NewHeight)? / ?Convert.ToDecimal(imgPhotoHeight),? 10 ));
????????????}
????????????StartX? = ?ResizeWidth? - ?NewWidth;
????????????StartY? = ?ResizeHeight? - ?NewHeight;
????????????StartX? = ?StartX? > ? 0 ? ? ?StartX? / ? 2 ?:? 0 ;
????????????StartY? = ?StartY? > ? 0 ? ? ?StartY? / ? 2 ?:? 0 ;
????????????Bitmap?bmPhoto? = ? new ?Bitmap(ResizeWidth,?ResizeHeight,?System.Drawing.Imaging.PixelFormat.Format24bppRgb);
????????????bmPhoto.SetResolution( 72 ,? 72 );
????????????Graphics?gbmPhoto? = ?Graphics.FromImage(bmPhoto);
????????????gbmPhoto.Clear(Color.FromName(BgColor));
????????????gbmPhoto.InterpolationMode? = ?System.Drawing.Drawing2D.InterpolationMode.High;
????????????gbmPhoto.SmoothingMode? = ?System.Drawing.Drawing2D.SmoothingMode.HighQuality;
????????????gbmPhoto.DrawImage(imgPhoto,? new ?Rectangle(StartX,?StartY,?NewWidth,?NewHeight),? new ?Rectangle( 0 ,? 0 ,?imgPhotoWidth,?imgPhotoHeight),?GraphicsUnit.Pixel);
????????????bmPhoto.Save(sImgPath,?System.Drawing.Imaging.ImageFormat.Jpeg);
????????????imgPhoto.Dispose();
????????????gbmPhoto.Dispose();
????????????bmPhoto.Dispose();
???????????? return ? true ;
????????}
???????? catch ?(Exception?err)
????????{
???????????? return ? false ;
????????}
????}
???? /**/ /// ? <summary>
???? /// ?圖片剪 切
???? /// ? </summary>
???? /// ? <param?name="ImgFile"> 原圖文件地址 </param>
???? /// ? <param?name="sImgPath"> 縮略圖保存地址 </param>
???? /// ? <param?name="PointX"> 剪切起始點(diǎn)?X坐標(biāo) </param>
???? /// ? <param?name="PointY"> 剪切起始點(diǎn)?Y坐標(biāo) </param>
???? /// ? <param?name="CutWidth"> 剪切寬度 </param>
???? /// ? <param?name="CutHeight"> 剪切高度 </param>
???? public ? bool ?CutImg( string ?ImgFile,? string ?sImgPath,? int ?PointX,? int ?PointY,? int ?CutWidth,? int ?CutHeight)
????{
???????? try
????????{
????????????FileStream?fs? = ? new ?FileStream(ImgFile,?FileMode.Open);
????????????BinaryReader?br? = ? new ?BinaryReader(fs);
???????????? byte []?bytes? = ?br.ReadBytes(( int )fs.Length);
????????????br.Close();
????????????fs.Close();
????????????MemoryStream?ms? = ? new ?MemoryStream(bytes);
????????????System.Drawing.Image?imgPhoto? = ?System.Drawing.Image.FromStream(ms);
???????????? // System.Drawing.Image?imgPhoto?=?System.Drawing.Image.FromFile(ImgFile);
???????????? // 此處只能用filestream,用?System.Drawing.Image則會報(bào)多過進(jìn)程訪問文件的錯(cuò)誤,會鎖定文件
????????????Bitmap?bmPhoto? = ? new ?Bitmap(CutWidth,?CutHeight,?System.Drawing.Imaging.PixelFormat.Format24bppRgb);
????????????bmPhoto.SetResolution( 72 ,? 72 );
????????????Graphics?gbmPhoto? = ?Graphics.FromImage(bmPhoto);
????????????gbmPhoto.InterpolationMode? = ?System.Drawing.Drawing2D.InterpolationMode.High;
????????????gbmPhoto.SmoothingMode? = ?System.Drawing.Drawing2D.SmoothingMode.HighQuality;
????????????gbmPhoto.DrawImage(imgPhoto,? new ?Rectangle( 0 ,? 0 ,?CutWidth,?CutHeight),? new ?Rectangle(PointX,?PointY,?CutHeight,?CutHeight),?GraphicsUnit.Pixel);
????????????bmPhoto.Save(sImgPath,?System.Drawing.Imaging.ImageFormat.Jpeg);
????????????imgPhoto.Dispose();
????????????gbmPhoto.Dispose();
????????????bmPhoto.Dispose();
???????????? return ? true ;
????????}
???????? catch ?(Exception?err)
????????{
???????????? return ? false ;
????????}
????}
}
using ?System.Drawing;
using ?System.IO;
/**/ /// ? <summary>
/// ?ImgEdit?的摘要說 明
/// ? </summary>
public ? class ?ImgEdit
{
???? public ?ImgEdit()
????{
???????? //
???????? // ?TODO:?在此處添加構(gòu)造函數(shù)邏輯
???????? //
????}
???? /**/ /// ? <summary>
???? /// ?圖片水 印
???? /// ? </summary>
???? /// ? <param?name="ImgFile"> 原圖文件地址 </param>
???? /// ? <param?name="WaterImg"> 水印圖片地址 </param>
???? /// ? <param?name="sImgPath"> 水印圖片保存地址 </param>
???? /// ? <param?name="Alpha"> 水印透明度設(shè)置 </param>
???? /// ? <param?name="iScale"> 水印圖片在原圖上的顯示比例(水平) </param>
???? /// ? <param?name="intDistance"> 水印圖片在原圖上的邊距確定,以圖片的右邊和下邊為準(zhǔn),當(dāng)設(shè)定的邊距超過一定大小后參 數(shù)會自動(dòng)失效 </param>
???? public ? bool ?ImgWater( string ?ImgFile,? string ?WaterImg,? string ?sImgPath,? float ?Alpha,? float ?iScale,? int ?intDistance)
????{
???????? try
????????{
???????????? // 裝載圖片
????????????FileStream?fs? = ? new ?FileStream(ImgFile,?FileMode.Open);
????????????BinaryReader?br? = ? new ?BinaryReader(fs);
???????????? byte []?bytes? = ?br.ReadBytes(( int )fs.Length);
????????????br.Close();
????????????fs.Close();
????????????MemoryStream?ms? = ? new ?MemoryStream(bytes);
????????????System.Drawing.Image?imgPhoto? = ?System.Drawing.Image.FromStream(ms);
???????????? int ?imgPhotoWidth? = ?imgPhoto.Width;
???????????? int ?imgPhotoHeight? = ?imgPhoto.Height;
????????????System.Drawing.Image?imgWatermark? = ? new ?Bitmap(WaterImg);
???????????? int ?imgWatermarkWidth? = ?imgWatermark.Width;
???????????? int ?imgWatermarkHeight? = ?imgWatermark.Height;
???????????? // 計(jì)算水印圖片尺寸
???????????? decimal ?aScale? = ?Convert.ToDecimal(iScale);
???????????? decimal ?pScale? = ? 0.05M ;
???????????? decimal ?MinScale? = ?aScale? - ?pScale;
???????????? decimal ?MaxScale? = ?aScale? + ?pScale;
???????????? // 設(shè)置比例
???????????? int ?imgWatermarkWidthNew? = ?Convert.ToInt32(imgPhotoWidth? * ?aScale);
???????????? int ?imgWatermarkHeightNew? = ?Convert.ToInt32((imgPhotoWidth? * ?aScale? / ?imgWatermarkWidth)? * ?imgWatermarkHeight);
???????????? // 將原圖畫出來
????????????Bitmap?bmPhoto? = ? new ?Bitmap(imgPhotoWidth,?imgPhotoHeight,?System.Drawing.Imaging.PixelFormat.Format24bppRgb);
????????????bmPhoto.SetResolution( 72 ,? 72 );
????????????Graphics?gbmPhoto? = ?Graphics.FromImage(bmPhoto);
????????????gbmPhoto.InterpolationMode? = ?System.Drawing.Drawing2D.InterpolationMode.High;
????????????gbmPhoto.SmoothingMode? = ?System.Drawing.Drawing2D.SmoothingMode.HighQuality;
????????????gbmPhoto.Clear(Color.White);
????????????gbmPhoto.DrawImage(imgPhoto,? new ?Rectangle( 0 ,? 0 ,?imgPhotoWidth,?imgPhotoHeight),? 0 ,? 0 ,?imgPhotoWidth,?imgPhotoHeight,?GraphicsUnit.Pixel);
????????????Bitmap?bmWatermark? = ? new ?Bitmap(bmPhoto);
????????????bmWatermark.SetResolution(imgPhoto.HorizontalResolution,?imgPhoto.VerticalResolution);
????????????Graphics?gWatermark? = ?Graphics.FromImage(bmWatermark);
???????????? // 指定高質(zhì)量顯示水印圖片質(zhì)量
????????????gWatermark.InterpolationMode? = ?System.Drawing.Drawing2D.InterpolationMode.High;
????????????gWatermark.SmoothingMode? = ?System.Drawing.Drawing2D.SmoothingMode.HighQuality;
????????????System.Drawing.Imaging.ImageAttributes?imageAttributes? = ? new ?System.Drawing.Imaging.ImageAttributes();
???????????? // 設(shè)置兩種顏色,達(dá)到合成效果
????????????System.Drawing.Imaging.ColorMap?colorMap? = ? new ?System.Drawing.Imaging.ColorMap();
????????????colorMap.OldColor? = ?Color.FromArgb( 255 ,? 0 ,? 255 ,? 0 );
????????????colorMap.NewColor? = ?Color.FromArgb( 0 ,? 0 ,? 0 ,? 0 );
????????????System.Drawing.Imaging.ColorMap[]?remapTable? = ?{?colorMap?};
????????????imageAttributes.SetRemapTable(remapTable,?System.Drawing.Imaging.ColorAdjustType.Bitmap);
???????????? // 用矩陣設(shè)置水印圖片透明度
???????????? 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 ,??Alpha,? 0.0f },
??????????????? new ? float []?{ 0.0f ,?? 0.0f ,?? 0.0f ,?? 0.0f ,? 1.0f }
????????????};
????????????System.Drawing.Imaging.ColorMatrix?wmColorMatrix? = ? new ?System.Drawing.Imaging.ColorMatrix(colorMatrixElements);
????????????imageAttributes.SetColorMatrix(wmColorMatrix,?System.Drawing.Imaging.ColorMatrixFlag.Default,?System.Drawing.Imaging.ColorAdjustType.Bitmap);
???????????? // 確定水印邊距
???????????? int ?xPos? = ?imgPhotoWidth? - ?imgWatermarkWidthNew;
???????????? int ?yPos? = ?imgPhotoHeight? - ?imgWatermarkHeightNew;
???????????? int ?xPosOfWm? = ? 0 ;
???????????? int ?yPosOfWm? = ? 0 ;
???????????? if ?(xPos? > ?intDistance)
????????????????xPosOfWm? = ?xPos? - ?intDistance;
???????????? else
????????????????xPosOfWm? = ?xPos;
???????????? if ?(yPos? > ?intDistance)
????????????????yPosOfWm? = ?yPos? - ?intDistance;
???????????? else
????????????????yPosOfWm? = ?yPos;
????????????gWatermark.DrawImage(imgWatermark,? new ?Rectangle(xPosOfWm,?yPosOfWm,?imgWatermarkWidthNew,?imgWatermarkHeightNew),? 0 ,? 0 ,?imgWatermarkWidth,?imgWatermarkHeight,?GraphicsUnit.Pixel,?imageAttributes);
????????????imgPhoto? = ?bmWatermark;
????????????imgPhoto.Save(sImgPath,?System.Drawing.Imaging.ImageFormat.Jpeg);
???????????? // 銷毀對象
????????????gbmPhoto.Dispose();
????????????gWatermark.Dispose();
????????????imgPhoto.Dispose();
????????????imgWatermark.Dispose();
???????????? return ? true ;
????????}
???????? catch ?(Exception?ex)
????????{
???????????? return ? false ;
????????}
????}
???? /**/ /// ? <summary>
???? /// ?文字水 印
???? /// ? </summary>
???? /// ? <param?name="ImgFile"> 原圖文件地址 </param>
???? /// ? <param?name="TextFont"> 水印文字 </param>
???? /// ? <param?name="sImgPath"> 文字水印圖片保存地址 </param>
???? /// ? <param?name="Alpha"> 文字透明度?其數(shù)值的范圍在0到255 </param>
???? /// ? <param?name="widthFont"> 文字塊在圖片中所占寬度比例 </param>
???? /// ? <param?name="hScale"> 高度位置 </param>
???? public ? bool ?TextWater( string ?ImgFile,? string ?TextFont,? string ?sImgPath,? int ?Alpha,? float ?widthFont,? float ?hScale)
????{
???????? try
????????{
????????????FileStream?fs? = ? new ?FileStream(ImgFile,?FileMode.Open);
????????????BinaryReader?br? = ? new ?BinaryReader(fs);
???????????? byte []?bytes? = ?br.ReadBytes(( int )fs.Length);
????????????br.Close();
????????????fs.Close();
????????????MemoryStream?ms? = ? new ?MemoryStream(bytes);
????????????System.Drawing.Image?imgPhoto? = ?System.Drawing.Image.FromStream(ms);
???????????? int ?imgPhotoWidth? = ?imgPhoto.Width;
???????????? int ?imgPhotoHeight? = ?imgPhoto.Height;
????????????Bitmap?bmPhoto? = ? new ?Bitmap(imgPhotoWidth,?imgPhotoHeight,?System.Drawing.Imaging.PixelFormat.Format24bppRgb);
????????????bmPhoto.SetResolution( 72 ,? 72 );
????????????Graphics?gbmPhoto? = ?Graphics.FromImage(bmPhoto);
????????????gbmPhoto.Clear(Color.FromName( " white " )); // gif背景色
????????????gbmPhoto.InterpolationMode? = ?System.Drawing.Drawing2D.InterpolationMode.High;
????????????gbmPhoto.SmoothingMode? = ?System.Drawing.Drawing2D.SmoothingMode.HighQuality;
????????????gbmPhoto.DrawImage(imgPhoto,? new ?Rectangle( 0 ,? 0 ,?imgPhotoWidth,?imgPhotoHeight),? 0 ,? 0 ,?imgPhotoWidth,?imgPhotoHeight,?GraphicsUnit.Pixel);
???????????? // 建立字體大小的數(shù)組,循環(huán)找出適合圖片的水印字體
???????????? int []?sizes? = ? new ? int []?{? 1000 ,? 800 ,? 700 ,? 650 ,? 600 ,? 560 ,? 540 ,? 500 ,? 450 ,? 400 ,? 380 ,? 360 ,? 340 ,? 320 ,? 300 ,? 280 ,? 260 ,? 240 ,? 220 ,? 200 ,? 180 ,? 160 ,? 140 ,? 120 ,? 100 ,? 80 ,? 72 ,? 64 ,? 48 ,? 32 ,? 28 ,? 26 ,? 24 ,? 20 ,? 28 ,? 16 ,? 14 ,? 12 ,? 10 ,? 8 ,? 6 ,? 4 ,? 2 ?};
????????????System.Drawing.Font?crFont? = ? null ;
????????????System.Drawing.SizeF?crSize? = ? new ?SizeF();
???????????? for ?( int ?i? = ? 0 ;?i? < ? 43 ;?i ++ )
????????????{
????????????????crFont? = ? new ?Font( " arial " ,?sizes[i],?FontStyle.Bold);
????????????????crSize? = ?gbmPhoto.MeasureString(TextFont,?crFont);
???????????????? if ?(( ushort )crSize.Width? < ?( ushort )imgPhotoWidth? * ?widthFont)
???????????????????? break ;
????????????}
???????????? // 設(shè)置水印字體的位 置
???????????? int ?yPixlesFromBottom? = ?( int )(imgPhotoHeight? * ?hScale);
???????????? float ?yPosFromBottom? = ?((imgPhotoHeight? - ?yPixlesFromBottom)? - ?(crSize.Height? / ? 2 ));
???????????? float ?xCenterOfImg? = ?(imgPhotoWidth? * ? 1 ? / ? 2 );
????????????System.Drawing.StringFormat?StrFormat? = ? new ?System.Drawing.StringFormat();
????????????StrFormat.Alignment? = ?System.Drawing.StringAlignment.Center;
???????????? // 畫兩次制造透明效果
????????????System.Drawing.SolidBrush?semiTransBrush2? = ? new ?System.Drawing.SolidBrush(Color.FromArgb(Alpha,? 0 ,? 0 ,? 0 ));
????????????gbmPhoto.DrawString(TextFont,?crFont,?semiTransBrush2,? new ?System.Drawing.PointF(xCenterOfImg? + ? 1 ,?yPosFromBottom? + ? 1 ),?StrFormat);
????????????System.Drawing.SolidBrush?semiTransBrush? = ? new ?System.Drawing.SolidBrush(Color.FromArgb(Alpha,? 255 ,? 255 ,? 255 ));
????????????gbmPhoto.DrawString(TextFont,?crFont,?semiTransBrush,? new ?System.Drawing.PointF(xCenterOfImg,?yPosFromBottom),?StrFormat);
????????????bmPhoto.Save(sImgPath,?System.Drawing.Imaging.ImageFormat.Jpeg);
????????????gbmPhoto.Dispose();
????????????imgPhoto.Dispose();
????????????bmPhoto.Dispose();
???????????? return ? true ;
????????}
???????? catch ?(Exception?ex)
????????{
???????????? return ? false ;
????????}
????}
???? /**/ /// ? <summary>
???? /// ?縮略圖
???? /// ? </summary>
???? /// ? <param?name="ImgFile"> 原圖文件地址 </param>
???? /// ? <param?name="sImgPath"> 縮略圖保存地址 </param>
???? /// ? <param?name="ResizeWidth"> 縮略圖寬度 </param>
???? /// ? <param?name="ResizeHeight"> 縮略圖高度 </param>
???? /// ? <param?name="BgColor"> 縮略圖背景顏色,注意,背景顏色只能指定KnownColor中的值,如 white,blue,red,green等 </param>
???? public ? bool ?ResizeImg( string ?ImgFile,? string ?sImgPath,? int ?ResizeWidth,? int ?ResizeHeight,? string ?BgColor)
????{
???????? try
????????{
????????????FileStream?fs? = ? new ?FileStream(ImgFile,?FileMode.Open);
????????????BinaryReader?br? = ? new ?BinaryReader(fs);
???????????? byte []?bytes? = ?br.ReadBytes(( int )fs.Length);
????????????br.Close();
????????????fs.Close();
????????????MemoryStream?ms? = ? new ?MemoryStream(bytes);
????????????System.Drawing.Image?imgPhoto? = ?System.Drawing.Image.FromStream(ms);
???????????? int ?imgPhotoWidth? = ?imgPhoto.Width;
???????????? int ?imgPhotoHeight? = ?imgPhoto.Height;
???????????? int ?StartX? = ? 0 ;
???????????? int ?StartY? = ? 0 ;
???????????? int ?NewWidth? = ?imgPhotoWidth;
???????????? int ?NewHeight? = ?imgPhotoHeight;
???????????? // 計(jì)算縮放圖片尺寸
???????????? if ?(NewWidth? > ?ResizeWidth)
????????????{
????????????????NewWidth? = ?ResizeWidth;
????????????????NewHeight? = ?Convert.ToInt32(imgPhotoHeight? * ?Math.Round(Convert.ToDecimal(NewWidth)? / ?Convert.ToDecimal(imgPhotoWidth),? 10 ));
????????????}
???????????? if ?(NewHeight? > ?ResizeHeight)
????????????{
????????????????NewHeight? = ?ResizeHeight;
????????????????NewWidth? = ?Convert.ToInt32(imgPhotoWidth? * ?Math.Round(Convert.ToDecimal(NewHeight)? / ?Convert.ToDecimal(imgPhotoHeight),? 10 ));
????????????}
????????????StartX? = ?ResizeWidth? - ?NewWidth;
????????????StartY? = ?ResizeHeight? - ?NewHeight;
????????????StartX? = ?StartX? > ? 0 ? ? ?StartX? / ? 2 ?:? 0 ;
????????????StartY? = ?StartY? > ? 0 ? ? ?StartY? / ? 2 ?:? 0 ;
????????????Bitmap?bmPhoto? = ? new ?Bitmap(ResizeWidth,?ResizeHeight,?System.Drawing.Imaging.PixelFormat.Format24bppRgb);
????????????bmPhoto.SetResolution( 72 ,? 72 );
????????????Graphics?gbmPhoto? = ?Graphics.FromImage(bmPhoto);
????????????gbmPhoto.Clear(Color.FromName(BgColor));
????????????gbmPhoto.InterpolationMode? = ?System.Drawing.Drawing2D.InterpolationMode.High;
????????????gbmPhoto.SmoothingMode? = ?System.Drawing.Drawing2D.SmoothingMode.HighQuality;
????????????gbmPhoto.DrawImage(imgPhoto,? new ?Rectangle(StartX,?StartY,?NewWidth,?NewHeight),? new ?Rectangle( 0 ,? 0 ,?imgPhotoWidth,?imgPhotoHeight),?GraphicsUnit.Pixel);
????????????bmPhoto.Save(sImgPath,?System.Drawing.Imaging.ImageFormat.Jpeg);
????????????imgPhoto.Dispose();
????????????gbmPhoto.Dispose();
????????????bmPhoto.Dispose();
???????????? return ? true ;
????????}
???????? catch ?(Exception?err)
????????{
???????????? return ? false ;
????????}
????}
???? /**/ /// ? <summary>
???? /// ?圖片剪 切
???? /// ? </summary>
???? /// ? <param?name="ImgFile"> 原圖文件地址 </param>
???? /// ? <param?name="sImgPath"> 縮略圖保存地址 </param>
???? /// ? <param?name="PointX"> 剪切起始點(diǎn)?X坐標(biāo) </param>
???? /// ? <param?name="PointY"> 剪切起始點(diǎn)?Y坐標(biāo) </param>
???? /// ? <param?name="CutWidth"> 剪切寬度 </param>
???? /// ? <param?name="CutHeight"> 剪切高度 </param>
???? public ? bool ?CutImg( string ?ImgFile,? string ?sImgPath,? int ?PointX,? int ?PointY,? int ?CutWidth,? int ?CutHeight)
????{
???????? try
????????{
????????????FileStream?fs? = ? new ?FileStream(ImgFile,?FileMode.Open);
????????????BinaryReader?br? = ? new ?BinaryReader(fs);
???????????? byte []?bytes? = ?br.ReadBytes(( int )fs.Length);
????????????br.Close();
????????????fs.Close();
????????????MemoryStream?ms? = ? new ?MemoryStream(bytes);
????????????System.Drawing.Image?imgPhoto? = ?System.Drawing.Image.FromStream(ms);
???????????? // System.Drawing.Image?imgPhoto?=?System.Drawing.Image.FromFile(ImgFile);
???????????? // 此處只能用filestream,用?System.Drawing.Image則會報(bào)多過進(jìn)程訪問文件的錯(cuò)誤,會鎖定文件
????????????Bitmap?bmPhoto? = ? new ?Bitmap(CutWidth,?CutHeight,?System.Drawing.Imaging.PixelFormat.Format24bppRgb);
????????????bmPhoto.SetResolution( 72 ,? 72 );
????????????Graphics?gbmPhoto? = ?Graphics.FromImage(bmPhoto);
????????????gbmPhoto.InterpolationMode? = ?System.Drawing.Drawing2D.InterpolationMode.High;
????????????gbmPhoto.SmoothingMode? = ?System.Drawing.Drawing2D.SmoothingMode.HighQuality;
????????????gbmPhoto.DrawImage(imgPhoto,? new ?Rectangle( 0 ,? 0 ,?CutWidth,?CutHeight),? new ?Rectangle(PointX,?PointY,?CutHeight,?CutHeight),?GraphicsUnit.Pixel);
????????????bmPhoto.Save(sImgPath,?System.Drawing.Imaging.ImageFormat.Jpeg);
????????????imgPhoto.Dispose();
????????????gbmPhoto.Dispose();
????????????bmPhoto.Dispose();
???????????? return ? true ;
????????}
???????? catch ?(Exception?err)
????????{
???????????? return ? false ;
????????}
????}
}
總結(jié)
- 上一篇: div+css 上下左右移动
- 下一篇: 4、协程与asyncio异步框架