中の技術日誌
 ホーム / 上へ

わんくまライブラリ Wankuma.Drawing.Imageクラス Version4

2005/01/25

この文書はVisual Studio 2003(.NET1.1)をベースに記述されています。それ以降のバージョンや、あなたが読んでいる時点では変更されている可能性があります。
またバージョンアップされている場合にはなんらかかの不具合を含んでいる可能性があります。

ドキュメントへ
Wankuma.Drawing.Image4d.htm

利用規約へ
../kiyaku.htm

#region Using
using System;
using System.Collections;
using System.IO;
#endregion
namespace Wankuma.Drawing
{
 /// <summary>
 /// Image の概要の説明です。
 /// </summary>
 public sealed class Image
 {
  #region private Image()
  /// <summary>
  /// 隠蔽用コンストラクタ
  /// </summary>
  private Image()
  {
  }
  #endregion
  #region public static ArrayList FromFiles(string 画像ファイル名)
  /// <summary>
  /// 指定されたファイルを読み込みます。
  /// 画像として読み込めなかったものはスキップされます。
  /// サポート対象外の画像形式が入っていた場合でもArrayListはLength0で帰ります。
  /// </summary>
  /// <param name="画像ファイル名">読み込みを行う画像ファイル名</param>
  /// <returns>読み込んだ画像の入ったArrayList</returns>
  public static ArrayList FromFiles(string 画像ファイル名)
  {
   return Image.FromFiles(new string[]{画像ファイル名});
  }
  #endregion
  #region public static ArrayList FromFiles(string[] 画像ファイル名)
  /// <summary>
  /// 指定されたファイルを読み込みます。
  /// 画像として読み込めなかったものはスキップされます。
  /// サポート対象外の画像形式が入っていた場合でもArrayListはLength0で帰ります。
  /// </summary>
  /// <param name="画像ファイル名">読み込みを行う画像ファイル名</param>
  /// <returns>読み込んだ画像の入ったArrayList</returns>
  public static ArrayList FromFiles(string[] 画像ファイル名)
  {
   ArrayList al = new ArrayList();
   try
   {
    foreach( string file in 画像ファイル名)
    {
     try
     {
      al.AddRange(Image.FromFileMultiPages(file));
     }
     catch(NotSupportedException)
     {
     }
    }
    return al;
   }
   catch(Exception er)
   {
    foreach(System.Drawing.Image target in al)
    {
     if ( target != null )
     {
      target.Dispose();
     }
    }
    throw er;
   }
  }
  #endregion
  #region  public static ArrayList FromFileMultiPages(string 画像ファイル名)
  /// <summary>
  /// ファイルから画像を読み取ります。
  /// ファイルをロックしません。
  /// </summary>
  /// <param name="画像ファイル名">取得するファイル名</param>
  /// <returns>取得したイメージ</returns>
  /// <exception cref="NotSupportedException">サポート対象外画像形式であった場合発生</exception>
  public static ArrayList FromFileMultiPages(string 画像ファイル名)
  {
   FileStream fs = null;
   ArrayList al = new ArrayList();
   try
   {
    //画像ストリームの作成
    fs = new FileStream(画像ファイル名, FileMode.Open, FileAccess.Read);
   }
   catch(Exception er)
   {
    throw new FileNotFoundException("ファイルが見つかりませんでした。", er);
   }
   try
   {
    //画像の読み取り
    System.Drawing.Image ReadImage = System.Drawing.Image.FromStream(fs);
    //ディメンジョンリストを作成する
    Guid[] DimensionList = ReadImage.FrameDimensionsList;
    //ディメンジョンが続く限りループ
    foreach(Guid dimens in DimensionList )
    {
     //フレームディメンジョンを作成し
     System.Drawing.Imaging.FrameDimension fd = new System.Drawing.Imaging.FrameDimension(dimens);
     //ページ数を取得する
     int Pages = ReadImage.GetFrameCount(fd);
     //全頁処理対象
     for( int frameIndex = 0; frameIndex < Pages; frameIndex++ )
     {
      //アクティブフレームを切り替える
      ReadImage.SelectActiveFrame(fd, frameIndex);
      //新しいビットマップにコピーする
      System.Drawing.Bitmap bmp = new System.Drawing.Bitmap(ReadImage);
      bmp.SetResolution(ReadImage.HorizontalResolution, ReadImage.VerticalResolution);
      //配列に追加する
      al.Add(bmp);
     }
    }
   }
   catch(Exception er)
   {
    foreach(System.Drawing.Image target in al)
    {
     if ( target != null )
     {
      target.Dispose();
     }
    }
    throw new NotSupportedException("対応していない画像形式です。", er);
   }
   finally
   {
    if ( fs != null )
    {
     fs.Close();
     ((IDisposable)fs).Dispose();
    }
   }
   return al;
  }
  #endregion
  #region public static System.Drawing.Image FromFile(string 画像ファイル名)
  /// <summary>
  /// ファイルから画像を読み取ります。
  /// ファイルをロックしません。
  /// </summary>
  /// <param name="画像ファイル名">取得するファイル名</param>
  /// <returns>取得したイメージ</returns>
  /// <exception cref="NotSupportedException">サポート対象外画像形式であった場合発生</exception>
  /// <exception cref="FileNotFoundException">ファイルが読み取れなかった場合に発生</exception>
  public static System.Drawing.Image FromFile(string 画像ファイル名)
  {
   //画像の読み込み
   FileStream fs = null;
   try
   {
    fs = new FileStream(画像ファイル名, FileMode.Open, FileAccess.Read);
    try
    {
     return System.Drawing.Image.FromStream(fs);
    }
    catch(Exception er)
    {
     throw new NotSupportedException("対応していない画像形式です。", er);
    }
    finally
    {
     fs.Close();
    }
   }
   catch(NotSupportedException er)
   {
    throw er;
   }
   catch(Exception er)
   {
    throw new FileNotFoundException("ファイルが見つかりませんでした。", er);
   }
   finally
   {
    if ( fs != null )
    {
     ((IDisposable)fs).Dispose();
    }
   }
  }
  #endregion
  #region public static System.Drawing.Image FromFileThumbnailWidth(string 画像ファイル名, int Width)
  /// <summary>
  /// ファイルから画像サムネイルを読み取ります。
  /// サイズは幅を指定すればその幅で変換します。
  /// </summary>
  /// <param name="画像ファイル名">取得するファイル名</param>
  /// <param name="Width">幅</param>
  /// <returns>取得したイメージ</returns>
  public static System.Drawing.Image FromFileThumbnailWidth(string 画像ファイル名, int Width)
  {
   return FromFileThumbnail(画像ファイル名, Width, 0 );
  }
  #endregion
  #region public static System.Drawing.Image FromFileThumbnailHeight(string 画像ファイル名, int Height)
  /// <summary>
  /// ファイルから画像サムネイルを読み取ります。
  /// サイズはを指定すればその高さで変換します。
  /// </summary>
  /// <param name="画像ファイル名">取得するファイル名</param>
  /// <param name="Height">高さ</param>
  /// <returns>取得したイメージ</returns>
  public static System.Drawing.Image FromFileThumbnailHeight(string 画像ファイル名, int Height)
  {
   return FromFileThumbnail(画像ファイル名, 0, Height );
  }
  #endregion
  #region public static System.Drawing.Image FromFileThumbnail(string 画像ファイル名, int Width, int Height)
  /// <summary>
  /// ファイルから画像サムネイルを読み取ります。
  /// サイズは幅を指定すればその幅で変換します。
  /// </summary>
  /// <param name="画像ファイル名">取得するファイル名</param>
  /// <param name="Width">幅</param>
  /// <param name="Height">高さ</param>
  /// <returns>取得したイメージ</returns>
  public static System.Drawing.Image FromFileThumbnail(string 画像ファイル名, int Width, int Height)
  {
   System.Drawing.Bitmap bmp;
   using ( System.Drawing.Image 元画像 = FromFile(画像ファイル名) )
   {
    //元画像からの縮尺を取得する
    float WidthPer = 0;
    float HeightPer = 0;
    if ( Width != 0 )
    {
     WidthPer = (float)Width / (float)元画像.Width;
    }
    if ( Height != 0 )
    {
     HeightPer = (float)Height / (float)元画像.Height;
    }
    //縮尺を採用する。
    //片方しか指定がないときには小さい方を採用
    float Percent;
    if ( Width == 0 )
    {
     Percent = HeightPer;
    }
    else if ( Height == 0 )
    {
     Percent = WidthPer;
    }
    else
    {
     Percent = WidthPer > HeightPer ? HeightPer : WidthPer;
    }
    
    
    bmp = new System.Drawing.Bitmap((int)(元画像.Width * Percent), (int)(元画像.Height * Percent) );
    using ( System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(bmp) )
    {
     //実際に描画する
     g.DrawImage( 元画像, 0, 0, 元画像.Width * Percent, 元画像.Height * Percent );
    }
   }
   return bmp;
  }
  #endregion
  #region public static System.Drawing.Image StretchImage(System.Drawing.Image 元画像, int TargetWidth, int TargetHeight)
  /// <summary>
  /// 画像を縦横のどちらかの比率でストレッチさせます。
  /// </summary>
  /// <param name="元画像">元の画像</param>
  /// <param name="TargetWidth">表示予定領域の幅です。</param>
  /// <param name="TargetHeight">表示予定領域高さです。</param>
  /// <returns>新しい画像を</returns>
  public static System.Drawing.Image StretchImage(System.Drawing.Image 元画像, int TargetWidth, int TargetHeight)
  {
   //表示する画像サイズの比率を取得する。
   float 横比率 = Convert.ToSingle(TargetWidth) / Convert.ToSingle(元画像.Width);
   float 縦比率 = Convert.ToSingle(TargetHeight ) / Convert.ToSingle(元画像.Height);
   float 比率 = (縦比率 > 横比率) ? 横比率 : 縦比率;
   //新しい画像サイズを決定する
   int NewWidth = Convert.ToInt32( 元画像.Width * 比率);
   int NewHeight = Convert.ToInt32( 元画像.Height * 比率);
   //サイズが0いかになる場合には処理のしようが無いので処理しない。
   if ( NewWidth <= 0 || NewHeight <= 0 )
   {
    return new System.Drawing.Bitmap(1, 1);
   }
   return new System.Drawing.Bitmap( 元画像, NewWidth, NewHeight );
  }
 #endregion
 }
}

勉強会: 05/18 大阪 登録受付中

中の技術日誌
コンテンツ
わんくま同盟
わんくま同盟
わんくま同盟
広告
バナー
MVP LOGO
MSMVP Visual C# Since 2004/04-2007/03
MCP LOGO
070-316
姉妹サイト
姉妹サイト:じゃんぬのC#, VB.NET 入門
じゃんぬの
C#, VB.NET 入門
検索
Google

ブログ本家
広告