2012年1月23日月曜日

[C#]画像に文字を埋め込んで保存する

画像の中心に指定の文字列を埋め込んで保存する処理です。
DOBON.NETさんを参考に保存のあたりの処理を加えています。


  1. private void drawString(FileInfo copiedfi,string s,Font font)  
  2. {  
  3.  int quality = 85;  
  4.   
  5.  //一時ファイルの作成  
  6.  string tmpFilename = copiedfi.FullName + ".tmp";  
  7.  FileInfo tmpFi = copiedfi.CopyTo(tmpFilename, true);  
  8.   
  9.  //Bitmapオブジェクトの生成  
  10.  using (Bitmap bmp = new Bitmap(tmpFi.FullName))  
  11.  {  
  12.   //解像度の設定  
  13.   bmp.SetResolution(72, 72);  
  14.   
  15.   //Graphicsオブジェクトを取得  
  16.   using (Graphics g = Graphics.FromImage(bmp))  
  17.   {  
  18.    //画像を描画する  
  19.    g.DrawImage(bmp, 0, 0, bmp.Width, bmp.Height);  
  20.   
  21.    //白のブラシを作成する  
  22.    using( Brush b = new SolidBrush(System.Drawing.Color.White))  
  23.    {  
  24.     //文字の領域サイズを取得する  
  25.     StringFormat sf = new StringFormat();  
  26.     SizeF stringSize = g.MeasureString(s, font, bmp.Width, sf);  
  27.   
  28.     //文字を描画する  
  29.     g.DrawString(s, font, b, (bmp.Width / 2) - (stringSize.Width / 2), (bmp.Height / 2) - (stringSize.Height / 2));  
  30.    }  
  31.   
  32.   }  
  33.   
  34.   //品質を指定  
  35.   System.Drawing.Imaging.EncoderParameters eps = new System.Drawing.Imaging.EncoderParameters(1);  
  36.   eps.Param[0] = new System.Drawing.Imaging.EncoderParameter(System.Drawing.Imaging.Encoder.Quality, quality);  
  37.   
  38.   //エンコーダーを取得する  
  39.   System.Drawing.Imaging.ImageCodecInfo ici = this.getEncoderInfo("image/jpeg");  
  40.   
  41.   bmp.Save(copiedfi.FullName, ici, eps);  
  42.   
  43.  }  
  44.   
  45.  //一時ファイルの削除  
  46.  if( File.Exists(tmpFilename) )File.Delete(tmpFilename);  
  47.   
  48. }  
  49.   
  50. //MimeTypeで指定されたImageCodecInfoを探して返す  
  51. private System.Drawing.Imaging.ImageCodecInfo getEncoderInfo(string mineType)  
  52. {  
  53.  //GDI+ に組み込まれたイメージ エンコーダに関する情報をすべて取得  
  54.  System.Drawing.Imaging.ImageCodecInfo[] encs = System.Drawing.Imaging.ImageCodecInfo.GetImageEncoders();  
  55.  //指定されたMimeTypeを探して見つかれば返す  
  56.  foreach (System.Drawing.Imaging.ImageCodecInfo enc in encs)  
  57.   if (enc.MimeType == mineType)  
  58.    return enc;  
  59.  return null;  
  60. }  

0 件のコメント: