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

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

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

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

Q&A

解決済

1回答

7301閲覧

C#にて通常のビットマップ画像をインデックスカラーに変換出来ない

dubaisc

総合スコア11

C#

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

0グッド

0クリップ

投稿2017/02/27 11:23

C#にて通常のビットマップ画像をインデックスカラーに変換して
再度ビットマップ画像として保存するプログラムの作成を試みていますが、上手くいきません。
下記のコードを実行しても、
「使用されたパラメーターが有効ではありません。」というエラーを出力します。

Bitmap dest;
using (Bitmap bitmap = new Bitmap(files[indexNo])) {
dest = new Bitmap(bitmap);
}
using (dest) {
ColorPalette palette = dest.Palette;
for (int i = 0; i < palette.Entries.Length; i++) {
palette.Entries[i] = Color.FromArgb(i, i, i);
}
dest.Palette = palette;
dest2.Save("indexcolor.bmp");
}

そもそも「dest.Palette」で取得したパレット自体が「palette.Entries.Length」の
ところで「0」となってしまっているようで、その原因が解らずに居る状況です。
是非、皆さんのお力を貸してください。
宜しくお願い致します。

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

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

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

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

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

guest

回答1

0

ベストアンサー

通常のビットマップといっているのはたぶん24ビット以上のビットマップのことだと思いますが、パレットがありません。ですのでパレットの数が0です。
パレットのないBMPからインデックスあり(256色以下)のビットマップに変換するには単純なものだとcloneでできます。

c#

1using (var srcFs = new FileStream(@"src.bmp", FileMode.Open)) 2{ 3 using (var srcBmp = new Bitmap(srcFs)) 4 { 5 using (var dstFs = new FileStream(@"dst.bmp", FileMode.Create, FileAccess.Write)) 6 { 7 var dstBmp = srcBmp.Clone(new Rectangle(0, 0, srcBmp.Width, srcBmp.Height), PixelFormat.Format8bppIndexed); 8 dstBmp.Save(dstFs, ImageFormat.Bmp); 9 } 10 } 11}

投稿2017/02/27 11:48

編集2017/02/27 13:32
turbgraphics200

総合スコア4267

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

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

dubaisc

2017/02/27 12:29

早速のご回答ありがとうございます! 今、こちらのソースを移植させていただき実施してみたところ、 gr.DrawImage(img, new Rectangle(0, 0, img.Width, img.Height)); のタイミングで「インデックス付きのピクセル形式をもつイメージからグラフィックス オブジェクトを作成することはできません。」というエラーが出力されてしまいました。 何かお分かりになりますでしょうか。。
turbgraphics200

2017/02/27 13:33

すみません。回答修正しました。
dubaisc

2017/02/28 02:56

修正頂きありがとうございます。 おかげさまで生成することができましたが、 あるbitmap画像をGIMPでインデックスカラーに変換して保存した画像と、 同様の画像を今回頂いたソースで生成した画像は同等にはならない様です。 これは違うアプローチで対応しなければならないということでしょうか。
turbgraphics200

2017/02/28 03:06

ええ、これはデフォルトのカラーパレットを使用して変換します。 GIMPなどで変換を行うとアルゴリズムを使用して変換します。 有名どころは, Octrees quantizationという量子化を使用した変換です。
dubaisc

2017/02/28 06:11

ご回答ありがとうございます! そういうことなのですね。。 Octrees quantizationを使っての変換をC#でどのようにすべきかもし可能であればご教授いただけないでしょうか。 別質問として質問すべきであれば仰ってください。
dubaisc

2017/02/28 06:32

すみません!私の勘違いでした、、 教えていただいた変換で、行いたいその後の処理も実行できるようになりました!! turbgraphics200さんありがとうございました!!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問