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

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

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

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

Q&A

解決済

1回答

4482閲覧

グレースケール画像をカラー画像に変換したい

rnmr

総合スコア7

C#

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

0グッド

0クリップ

投稿2020/01/16 05:18

グレースケール画像をカラー画像に変換したい

Visual studio 2019 Widowsフォームアプリケーションでグレースケールの画像を輝度値を基に疑似カラー画像に変換したいと思い、(https://imagingsolution.net/program/csharp/setcolorpalette/)こちらのサイトから(疑似カラー画像の項目)コードを拝借しまして画像を変換しようとしたところコード自体にエラーはなかったのですが、下記のように色を設定する箇所で例外が発生してしまい、プログラムが実行できない状態となりました。調査はしておりますが原因が依然特定できておりません。何か間違いがあれば御指摘願えないでしょうか?
宜しくお願い致します。

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

pal.Entries[i] = System.Drawing.Color.FromArgb(r, g, b); ↑ 型 'System.IndexOutOfRangeException' のハンドルされていない例外が image.exe で発生しました インデックスが配列の境界外です。

該当のソースコード

public void SetPalettePseudoColor(Bitmap bmp) { var pal = bmp.Palette; int r, g, b; // 疑似カラー for (int i = 0; i < 52; i++) { r = 0; g = (int)((Math.Cos(Math.PI * (i * 900 / 255.0 - 180) / 180.0) + 1) * 110.0); b = 255; pal.Entries[i] = System.Drawing.Color.FromArgb(r, g, b); } for (int i = 52; i < 102; i++) { r = 0; g = 220; b = (int)((Math.Cos(Math.PI * (i * 900 / 255.0 - 180) / 180.0) + 1) * 127.5); pal.Entries[i] = System.Drawing.Color.FromArgb(r, g, b); } for (int i = 102; i < 154; i++) { r = (int)((Math.Cos(Math.PI * (i * 900 / 255.0 - 180) / 180.0) + 1) * 127.5); g = 220; b = 0; pal.Entries[i] = System.Drawing.Color.FromArgb(r, g, b); } for (int i = 154; i < 204; i++) { r = 255; g = (int)((Math.Cos(Math.PI * (i * 900 / 255.0 - 180) / 180.0) + 1) * 110.0); b = 0; pal.Entries[i] = System.Drawing.Color.FromArgb(r, g, b); } for (int i = 204; i < 256; i++) { r = 255; g = 0; b = (int)((Math.Cos(Math.PI * (i * 900 / 255.0 - 180) / 180.0) + 1) * 127.5); pal.Entries[i] = System.Drawing.Color.FromArgb(r, g, b); } // カラーパレットの設定 bmp.Palette = pal; }        using (var bmp = new Bitmap(img)) { SetPalettePseudoColor(bmp); bmp.Save(@"D:\sources\new4.jpg"); }

試したこと

8bit画像、32bit画像で試しておりますがどちらも同様のエラーとなりました。
色を格納する配列に過大な値が格納されたものと思われます。

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

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

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

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

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

Wind

2020/01/16 05:38 編集

「思われます」では無く明らかに配列より大きいインデックスを入れた時に発生するエラーです。 デバッガを使用して、エラーの発生している行を特定し、配列のサイズや入れているインデックスから、何が原因なのか自力で特定してください。 (前回の追加質問も、これで特定出来ました。) なお、カラーパレットを使用するのは8bitのBitmapフォーマットだけです。
rnmr

2020/01/16 06:38

>Wind様 申し訳ありませんがデバック時にどの位置で計算が止まっているか見方を教えていただけないでしょうか?
takabosoft

2020/01/16 07:16

例外が出た時点でVisual Studioは該当箇所を指し示してくれていると思いますが・・・
guest

回答1

0

ベストアンサー

SetPalettePseudoColorに引き渡しているbmpをどうやって構築しているか書いてありませんが、
ファイルから読み込んでいるのであれば、そのファイルの画像フォーマットを確認してください。

.bmp型式であればビットの深さが8である必要があります。
参考サイト先の
https://imagingsolution.net/wordpress/wp-content/uploads/2018/03/SetColorPalette_LENNA.bmp
の画像でしたらそれに相当しますので、こちらの画像でテストしてみてはいかがでしょうか。


追記:

using (var bmp = new Bitmap(img))

オリジナルの画像?をここで複製しているようですが、これをやると元が8ビットでもbmpは32ビットになります。

imgがなんなのかわかりませんが、imgもBitmap型であれば(Bitmap)img.Clone()で正確な複製が作れます。

投稿2020/01/16 07:15

編集2020/01/16 07:29
takabosoft

総合スコア8356

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

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

rnmr

2020/01/16 07:18

フォーマットは8bitの画像でも試しておりますが同様のエラーが発生しております。
takabosoft

2020/01/16 07:29

変換処理が入っていたので追記しました。
takabosoft

2020/01/16 07:30

とりあえず困ったら using (var bmp = new Bitmap(@"C:...\SetColorPalette_LENNA.bmp")) などと直指定で一度やってみればうまくいくと思います。
rnmr

2020/01/16 07:40

変換処理でそうなっているとは知りませんでした。おっしゃる通り直で指定し直したらできました。 お手数をお掛けして申し訳ありません。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問