質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

Q&A

解決済

3回答

8473閲覧

C# tiffからpngへの変換

Kuroiwa_asena

総合スコア12

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

0グッド

0クリップ

投稿2020/06/02 04:31

編集2020/06/02 09:58

前提・実現したいこと

前提
  • .NET Framework 4.7.2 コンソールアプリケーション
  • TIFF:ピクセルサイズ 325*325、カラー形式 RGB、圧縮形式 なし
実現したい事:

C#でtiffファイルをpngファイルに変換するプログラムを作りたいです。
まずはtiffファイルを読み込み、bitmapに代入したいです。

試した事

1.Bitmap.Fromfileで直接読み込む
2.Filestreamに入れ、Bitmap.FromStreamで読み込む
3.TiffBitmapDecoderを使う。deccoder.Frame[]はBitmapSource形式で、それをBitmapに変換した

該当のソースコード

C#

11. 2var image = Bitmap.FromFile(path);

C#

12. 2Stream tiffStream = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read); 3var image = Bitmap.FromStream(tiffStream);

C#

13. 2Stream tiffStream = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read); 3Stream pngStream = new FileStream(savePath, FileMode.Create); 4 5var decoder = new TiffBitmapDecoder(tiffStream, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default); 6if(decoder.Frames.Count() > 1) 7{ 8 Console.WriteLine("the number is {0}, we need other process", decoder.Frames.Count()); 9} 10else 11{ 12 BitmapSource bitmapSource = decoder.Frames[0]; 13 Bitmap bmp = new Bitmap( 14 bitmapSource.PixelWidth, 15 bitmapSource.PixelHeight, 16 System.Drawing.Imaging.PixelFormat.Format32bppPArgb 17 ); 18 System.Drawing.Imaging.BitmapData data = bmp.LockBits( 19 new Rectangle(System.Drawing.Point.Empty, bmp.Size), 20 System.Drawing.Imaging.ImageLockMode.WriteOnly, 21 System.Drawing.Imaging.PixelFormat.Format32bppPArgb 22 ); 23 bitmapSource.CopyPixels( 24 Int32Rect.Empty, 25 data.Scan0, 26 data.Height * data.Stride, 27 data.Stride 28 ); 29 bmp.UnlockBits(data); 30 31 bmp.Save(savePath, System.Drawing.Imaging.ImageFormat.Png); 32 bmp.Dispose(); 33 34} 35tiffStream.Dispose(); 36pngStream.Dispose();

発生している問題・エラーメッセージ

実行前のエラーではなく、実行時に発生した「ハンドルされていない例外」です。

error

11. 2System.OutOfMemoryException: 'メモリが不足しています。'

error

12. 2System.ArgumentException: '使用されたパラメーターが有効ではありません。'

error

13. 2 3 bitmapSource.CopyPixels( 4 Int32Rect.Empty, 5 data.Scan0, 6 data.Height * data.Stride, 7 data.Stride 8 ); 9 10System.ArgumentOutOfRangeException: 'パラメーター値は、'2600' 未満にできません。 11パラメーター名:stride'

補足情報(FW/ツールのバージョンなど)

エラーの原因や解消法もちろん知りたいですが、
それより、目的のプログラムをどう作ればよいのかわかりません。
よろしくお願いいたします。

参考したサイト

https://stackoverflow.com/questions/1566188/converting-tiff-files-to-png-in-net
https://docs.microsoft.com/ja-jp/dotnet/framework/wpf/graphics-multimedia/how-to-encode-and-decode-a-tiff-image
https://dobon.net/vb/dotnet/graphics/saveimage.html
https://qiita.com/YSRKEN/items/a24bf2173f0129a5825c

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2020/06/02 04:50

エラーメッセージは、いらぬ翻訳省略せずに、そのままコピペで提示しましょう
Kuroiwa_asena

2020/06/02 05:21 編集

gentaro さんへ: そのサイトを参照してやっていました。わたしが扱ったのは1,600Kbのデータです。 y_waiwai さんへ: 実行前にエラーがなくて、実行中に発生した「ハンドルされていない例外」をそのままコピペしています。
退会済みユーザー

退会済みユーザー

2020/06/02 09:50

TIFFといってもフォーマット色々あると思うんですが、ピクセルサイズ、カラー形式、圧縮形式とか詳細に書いた方がいいです
Kuroiwa_asena

2020/06/02 09:55

redian さんへ: なるほど、助言ありがとうございます。追加しておきます。
退会済みユーザー

退会済みユーザー

2020/06/02 10:06

325*325にしては、1600kbってファイルサイズ大きくないです? 325x325xRGB24bitだと無圧縮でも310kくらいですけど、マルチページTIFFとか?
Kuroiwa_asena

2020/06/02 10:17

redian さんへ: TiffBitmapDecoderのFramesは1でしたから、マルチページではないと思います。私もマルチページでない事を想定して作っていました。他の判断方法ありますか?
退会済みユーザー

退会済みユーザー

2020/06/02 10:25

他の画像処理ライブラリに入れて読み込めるか試してみるくらいしかないですねぇ。
guest

回答3

0

Image.FromFile メソッドにおいて
OutOfMemoryExceptionが発生する場合は、ファイルのイメージ形式が有効ではない場合と、GDI+ はファイルのピクセル形式をサポートしません。
とありますので、そのTiffファイルが実はTiffファイルじゃないとか、ぶっ壊れている可能性があるので、Tiffを生成したアプリケーションとは別のアプリケーションで保存し直してみると読み込み時のエラーがなくなるかもしれません。

私の環境では、GIMP2で生成したTiffですが、コード的には以下でPNGに変換することができました。

C#

1 static void Main(string[] args) { 2 var img = System.Drawing.Bitmap.FromFile("test.tiff"); 3 img.Save("test.png", System.Drawing.Imaging.ImageFormat.Png); 4 }

投稿2020/06/02 11:45

Hey_CH

総合スコア437

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Hey_CH

2020/06/02 12:09

すいません、英語ができないので、SpaceNet 2についてはよくわかりませんでした。 Tiffがぶっ壊れているかの判断は、バイナリエディタでヘッダー等を確認する必要があるのですが、かなり手間がかかるので、フォトショップとかGIMP2とかのTiffが開けるアプリケーションで保存し直した方が早いと思います。
Hey_CH

2020/06/02 12:27

ちなみに、僕の場合はバイナリエディタは「Stirling」を使用しておりGIMP2から出力したTiffのヘッダーは「49 49 2A 00 D4 D5 04 00」となっています。 https://jprogramer.com/libtiffcate/3188 の「TIFFのヘッダ」辺りが参考になると思います。
Kuroiwa_asena

2020/06/03 02:09

公開のデータセットであるため、ぶっ壊れた可能性は小さいと思われます。 私が使っているTIFFがラベルなどの付加情報があり、GIMP2で読み込もうとすると「Extra channels with unspecified data」とのエラーが出ます。 また、Stirlingを使用してヘッダは「49 49 2A 00 08 00 00...」となっていました。
Hey_CH

2020/06/03 04:19

とすると、TIFFがラベルなどの付加情報を持つ場合.NET標準では読み取ることができないことが考えられますね。 TIFFに何かしら問題があると思って書いた回答なので、この回答はもう無視してください。 radianさんのご回答にあるMagick.NET等別のライブラリで読み込む必要がありそうですね。
退会済みユーザー

退会済みユーザー

2020/06/03 05:57 編集

TIFF自体が拡張されまくってるカオスなフォーマットなので、利用する予定のTIFFを読めるローダーを地道に探すしかないですね。汎用的なライブラリでNGな場合は、TIFFに特化したものの方が良いかもしれません。(LibTiff.NetはLibTIFFベースだしなんか行けそう)
Hey_CH

2020/06/03 07:26

あーなるほど、TIFFってカオスなんですね。その辺知らずに回答しちゃって混乱させてしまいましたね。 申し訳ありませんでした。
guest

0

マルチページTIFFを疑ってみるとか。
マルチTIFFやGIFアニメーションに含まれるすべてのイメージを表示する

Magick.NET
以前画像コンバータ作った時に使ったライブラリですが、このへんを試してみるのもいいかもしれません。

投稿2020/06/02 10:26

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

自己解決

BitMiracle.LibTiff.NETというライブラリを使用し、解決しました。

投稿2020/06/03 23:14

Kuroiwa_asena

総合スコア12

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問