DOBON.NETプログラミング道掲示板

■34879 / 親記事)  マルチページTIFFをSelectActiveFrameでページ指定するとエラーが発生する
  
□投稿者/ tomy 一般人(11回)-(2021/08/23(Mon) 15:07:37)
  • アイコン環境/言語:[Windows7/C#/VisualStudio2015/.Net Framework4.5] 
    分類:[.NET] 

    2021/08/23(Mon) 19:05:30 編集(投稿者)
    2021/08/23(Mon) 19:05:18 編集(投稿者)

    現在、マルチページTIFFを読み込んで、個別のイメージにバラしたり、各ページを指定して取り出したりできるようなアプリを作成中です。

    サイズが小さいファイルなら問題ないのですが、モノクロ、カラー、グレースケールが混在した9ページのファイル(41MB程度)を読み込むと、4ページ目を表示したときにエラーが発生します。

    読み込み時は単純にImage

    img = System.Drawing.Bitmap.FromFile(filename);
    dimension = new System.Drawing.Imaging.FrameDimension(img.FrameDimensionsList[0]);
    pictureBox1.Image = img;

    としており、ボタンを押すとページを+1して画面に表示しています。

    dispPageNo++;
    img.SelectActiveFrame(dimension, dispPageNo);
    pictureBox1.Image = img;

    最初の3ページは正常に表示できますが、4ページ目になると
    「GDI+ で汎用エラーが発生しました。」
    というエラーが発生してしまいます。

    試しに、サイズの小さなマルチページTIFF(カラー、9ページ、82KB)を作って試してみたらエラーになりませんでした。

    なんとか回避する方法はないものでしょうか・・・。


マルチポストを報告
違反を報告
引用返信 削除キー/
■34880 / ResNo.1)  Re[1]: マルチページTIFFをSelectActiveFrameでページ指定するとエラーが発生する
□投稿者/ 魔界の仮面弁士 大御所(1390回)-(2021/08/23(Mon) 15:36:25)
  • アイコンNo34879に返信(tomyさんの記事)
    > サイズが小さいファイルなら問題ないのですが、モノクロ、カラー、グレースケールが混在した9ページのファイル(41MB程度)を読み込むと、4ページ目を表示したときにエラーが発生します。

    元の TIFF が Dispose されていませんか? (あるいはガベージコレクト)


    > img = System.Drawing.Bitmap.FromFile(filename);
    この img がローカル変数になっている場合は、
    フィールド変数に引き上げてみてください。

    ファイルを開き続けておくことが要件的に難しい場合には、
    元ファイルのバイナリを MemoryStream に読み込んでおき、
    それを Image.FromStream するようにします。
    (元となった MemoryStream はフィールド変数として保持し続ける必要があります)
違反を報告
引用返信 削除キー/
■34881 / ResNo.2)  Re[1]: マルチページTIFFをSelectActiveFrameでページ指定するとエラーが発生する
□投稿者/ tomy 一般人(12回)-(2021/08/23(Mon) 15:36:30)
  • アイコン1点追記です。
    ちょっとだけ条件が分かりました。

    カラーのみ、2値のみではエラーになりません。
    カラーと2値が混在しているとき、2値を表示した後におかしくなるようです。

    カラー、カラー、2値、カラー

    となっている場合、3ページ目の2値は表示できますが、そのあと4ページ目のカラーを表示しようとすると真っ黒になったり、エラーになったりします。

    .Netの不具合っぽい気がしてきました。
    どうしようもないのかな・・・。



違反を報告
引用返信 削除キー/
■34882 / ResNo.3)  Re[2]: マルチページTIFFをSelectActiveFrameでページ指定するとエラーが発生する
□投稿者/ tomy 一般人(13回)-(2021/08/23(Mon) 15:42:26)
  • アイコン
    ・魔界の仮面弁士さんへ

    ありがとうございます。

    >>img = System.Drawing.Bitmap.FromFile(filename);
    > この img がローカル変数になっている場合は、
    > フィールド変数に引き上げてみてください。

    imgはフィールド変数になっています。

    先ほど追記したのですが、入れ違いになってしまいました。

    カラー、カラー、2値、カラー

    というふうに、カラーと2値が混在しているとき、2値を表示したあとカラーを表示するとおかしくなるようです。
    この場合、1枚目から順に表示していって、3枚目が2値、4枚目を表示するとエラーになったり真っ黒の絵になったりします。

    なお、カラーはLZW、2値はFAX Group4で圧縮しています。

    .Netのバグかな・・・。

違反を報告
引用返信 削除キー/
■34883 / ResNo.4)  Re[2]: マルチページTIFFをSelectActiveFrameでページ指定するとエラーが発生する
□投稿者/ 魔界の仮面弁士 大御所(1391回)-(2021/08/23(Mon) 15:44:11)
  • アイコンNo34880に追記(魔界の仮面弁士の記事)
    > 元の TIFF が Dispose されていませんか? (あるいはガベージコレクト)

    以下、参考までに。 C# ではなく VB 向けの話題ですが。
    http://rucio.cloudapp.net/ThreadDetail.aspx?ThreadId=30504
違反を報告
引用返信 削除キー/
■34884 / ResNo.5)  Re[3]: マルチページTIFFをSelectActiveFrameでページ指定するとエラーが発生する
□投稿者/ tomy 一般人(14回)-(2021/08/23(Mon) 16:41:17)
  • アイコン魔界の仮面弁士さん
    ありがとうございます。

    ご指摘いただいた内容も考慮して、MemoryStreamにしてみたりしましたが、やはりダメです・・・。

    やってみたことは、

    MemoryStreamをフィールド変数とする。
    ファイルから読み込んだTIFFのデータをMemoryStreamに格納する。
    ImageにはFromStreamで読み込む。

    TIFFファイルは、前から順番に

    カラー、カラー、2値、カラー

    と、カラーと2値が混在しているファイル。

    この条件ですと、やはり4ページ目(ようするに2値を表示したあとのカラーを表示しようとしたところで)でエラーが発生します。

    全てのページがカラー、すべてのページが2値の場合では問題ないため、カラーと2値が混在するときのみの問題だと考えています。


違反を報告
引用返信 削除キー/
■34885 / ResNo.6)  Re[4]: マルチページTIFFをSelectActiveFrameでページ指定するとエラーが発生する
□投稿者/ 魔界の仮面弁士 大御所(1392回)-(2021/08/23(Mon) 17:10:32)
  • アイコンNo34884に返信(tomyさんの記事)
    > TIFFファイルは、前から順番に
    > カラー、カラー、2値、カラー
    > と、カラーと2値が混在しているファイル。

    現象を再現させることのできる画像ファイルを提示できますか?

    41MB だと、この掲示板の添付上限を超えてしまうので
    OneDrive の公開フォルダー等の URL でご提示頂けると助かります。
違反を報告
引用返信 削除キー/
■34886 / ResNo.7)  Re[5]: マルチページTIFFをSelectActiveFrameでページ指定するとエラーが発生する
□投稿者/ tomy 一般人(15回)-(2021/08/23(Mon) 17:20:33)
  • アイコン
    > 現象を再現させることのできる画像ファイルを提示できますか?

    ファイルを添付します。

    グレー、グレー、2値、グレー

    でも同様でしたので、グレーと2値の混在ファイルを作成しました。
    なお、このファイルではエラーにはならなくて、4枚目の画像が黒くなってしまいます(正しく表示できない)

    Windowsのフォトビューアーなどでは正常に表示できます。

    また、色々テストした結果、

    カラーおよびグレーの圧縮形式は問わない。
    2値がFAX Group3またはFAX Group4のときに現象が再現する。
    2値がPackbits、無圧縮のときは再現しない。

    ようです。


イメージ
1629706833.zip
/16KB
違反を報告
引用返信 削除キー/
■34887 / ResNo.8)  Re[6]: マルチページTIFFをSelectActiveFrameでページ指定するとエラーが発生する
□投稿者/ 魔界の仮面弁士 大御所(1393回)-(2021/08/23(Mon) 18:00:19)
  • アイコンNo34886に返信(tomyさんの記事)
    > ファイルを添付します。

    下記のコードで実験しましたが、特に問題は発生しませんでした。

    private System.IO.MemoryStream ms = null;
    private Bitmap bmp = null;
    private int maxPage = 0;
    private int currentPage = 0;
    private void Form1_Load(object sender, EventArgs e)
    {
      string filePath = @"C:\test\MultiTiff_グレー2値混在.tif";
      this.bmp = new Bitmap(this.ms = new System.IO.MemoryStream(System.IO.File.ReadAllBytes(filePath)));
      this.maxPage = bmp.GetFrameCount(FrameDimension.Page);
      this.pictureBox1.Image = this.bmp;
      this.currentPage = 1;
      this.button1.Text = currentPage + "/" + this.maxPage;
    }

    private void button1_Click(object sender, EventArgs e)
    {
      if (this.currentPage == this.maxPage)
      {
        this.currentPage = 1;
      }
      else
      {
        this.currentPage++;
      }
      this.bmp.SelectActiveFrame(FrameDimension.Page, currentPage - 1);
      this.button1.Text = this.currentPage + "/" + this.maxPage;
      this.pictureBox1.Invalidate();
    }
違反を報告
引用返信 削除キー/
■34888 / ResNo.9)  Re[7]: マルチページTIFFをSelectActiveFrameでページ指定するとエラーが発生する
□投稿者/ tomy 一般人(16回)-(2021/08/23(Mon) 19:02:13)
  • アイコンソースをコピペのうえ、
    using System.Drawing.Imaging;
    を追加して、ファイルの場所だけ変更して実行しましたが、やはりおかしくなってしまいます。
    環境の差でしょうか・・・。

    ちょっと気になったのでVisual Studio 2017、Visual Studio 2019で同じソースにて実験してみたら正常に動きました。
    Visual Studio 2015ではダメなのかもしれません。

673×526 => 250×195
イメージ
MultiTiffError.png
/9KB
違反を報告
引用返信 削除キー/

次のレス10件>

スレッド内ページ移動 / << 0 | 1 >>

このスレッドに書きこむ

Mode/  Pass/


- Child Tree -