2012年1月23日月曜日

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

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


private void drawString(FileInfo copiedfi,string s,Font font)
{
 int quality = 85;

 //一時ファイルの作成
 string tmpFilename = copiedfi.FullName + ".tmp";
 FileInfo tmpFi = copiedfi.CopyTo(tmpFilename, true);

 //Bitmapオブジェクトの生成
 using (Bitmap bmp = new Bitmap(tmpFi.FullName))
 {
  //解像度の設定
  bmp.SetResolution(72, 72);

  //Graphicsオブジェクトを取得
  using (Graphics g = Graphics.FromImage(bmp))
  {
   //画像を描画する
   g.DrawImage(bmp, 0, 0, bmp.Width, bmp.Height);

   //白のブラシを作成する
   using( Brush b = new SolidBrush(System.Drawing.Color.White))
   {
    //文字の領域サイズを取得する
    StringFormat sf = new StringFormat();
    SizeF stringSize = g.MeasureString(s, font, bmp.Width, sf);

    //文字を描画する
    g.DrawString(s, font, b, (bmp.Width / 2) - (stringSize.Width / 2), (bmp.Height / 2) - (stringSize.Height / 2));
   }

  }

  //品質を指定
  System.Drawing.Imaging.EncoderParameters eps = new System.Drawing.Imaging.EncoderParameters(1);
  eps.Param[0] = new System.Drawing.Imaging.EncoderParameter(System.Drawing.Imaging.Encoder.Quality, quality);

  //エンコーダーを取得する
  System.Drawing.Imaging.ImageCodecInfo ici = this.getEncoderInfo("image/jpeg");

  bmp.Save(copiedfi.FullName, ici, eps);

 }

 //一時ファイルの削除
 if( File.Exists(tmpFilename) )File.Delete(tmpFilename);

}

//MimeTypeで指定されたImageCodecInfoを探して返す
private System.Drawing.Imaging.ImageCodecInfo getEncoderInfo(string mineType)
{
 //GDI+ に組み込まれたイメージ エンコーダに関する情報をすべて取得
 System.Drawing.Imaging.ImageCodecInfo[] encs = System.Drawing.Imaging.ImageCodecInfo.GetImageEncoders();
 //指定されたMimeTypeを探して見つかれば返す
 foreach (System.Drawing.Imaging.ImageCodecInfo enc in encs)
  if (enc.MimeType == mineType)
   return enc;
 return null;
}

0 件のコメント: