前提・実現したいこと
音声波形をFFTで周波数を解析し、その情報を8bitグレースケールの画像として保存することが当初の目的ですが、
32bit bitmapでSetPixelを用いて描画した際は想定通りに出力できたものが
8bit bitmapで実装した際にどうしても画像が崩れてしまうため、
挙動を確かめようとしたところ想定の結果とかなりピクセルが
ずれて描画されていることがわかりました。
発生している問題・エラーメッセージ
「画像の上半分をグレーに、下半分を真っ黒に塗る」ものを組んだはずが
「下半分だけ黒塗りになるはずの画像が、黒塗り部分が少しずれて出力される問題」についての解決策を
お伺いしたいです。
※ネット上での検索は試行済みで、解決につながる情報を捕捉できませんでした。
※32あるいは24bit bitmapで作成してから8bitに変換、などは避け、
なるべく自前のバイト配列から8bit画像を出力する方向性を保ちたいです。
該当のソースコード
Windows Forms上で組んだものから抜粋します。
C#
1//8bit グレースケール 2bitmap = new Bitmap(78, 256, PixelFormat.Format8bppIndexed); 3byte[] res = new byte[bitmap.Width * bitmap.Height]; 4 5//パレット設定、白黒反転 6var palette = bitmap.Palette; 7for (int p = 0; p < 256; p++) 8{ 9 palette.Entries[p] = Color.FromArgb(255 - p, 255 - p, 255 - p); 10} 11bitmap.Palette = palette; 12 13//画像の下半分が真っ黒になるはず 14for (int y = 0; y < res.Length; y++) 15{ 16 if (y > res.Length / 2) res[y] = 255; 17 //追記:グレーにする処理を忘れてました 18 else res[y] = 128; 19} 20 21//byte情報流し込み 22BitmapData bmpdata = bitmap.LockBits( 23 new Rectangle(0, 0, bitmap.Width, bitmap.Height), 24 ImageLockMode.WriteOnly, 25 PixelFormat.Format8bppIndexed 26 ); 27 28Marshal.Copy(res, 0, bmpdata.Scan0, res.Length); 29bitmap.UnlockBits(bmpdata); 30 31bitmap.Save($"chunk.png", ImageFormat.Png); 32bitmap.Dispose();
試したこと
bitmapの横サイズを2の累乗にするとピッタリ半分に分かれて色が塗られていそうなことを確認しました。
右の失敗例では黒塗が半分より少し前からずれて始まっており、一番下に白い部分が余っています。
例:左・タテヨコ256px 右・ヨコ78px * タテ256px
補足情報(FW/ツールのバージョンなど)
C# Visual Studio 2019
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/01/10 13:53
2021/01/10 13:57
2021/01/10 14:08
2021/01/10 14:30