前提・実現したいこと
Writeablebitmapイメージを用いて、画像を白黒画像に変換するプログラムを書こうと思っています。
そのためにこちらのサイトを参考にさせていただきました。
C#で画像を描いてみた(WPFでWritableBitmap編)
こちらのサイトでは、まずバイト情報書き込む配列を作り、バイト情報を書き込んでいます。
###方針
今回、画像を白黒画像に変換するためには、まずバイト情報を取得して、RGBの平均値を出し、Writeablebitmapイメージを用いて書き込んでいこうと考えています。
発生している問題・エラーメッセージ
System.IndexOutOfRangeException: 'インデックスが配列の境界外です。'
該当のソースコード
C#
1using System; 2using System.Collections.Generic; 3using System.Linq; 4using System.Text; 5using System.Threading.Tasks; 6using System.Windows; 7using System.Windows.Controls; 8using System.Windows.Data; 9using System.Windows.Documents; 10using System.Windows.Input; 11using System.Windows.Media; 12using System.Windows.Media.Imaging; 13using System.Windows.Navigation; 14using System.Windows.Shapes; 15using Microsoft.Win32; 16 17 18 19namespace WpfApplication_writablebitmap 20{ 21 /// <summary> 22 /// MainWindow.xaml の相互作用ロジック 23 /// </summary> 24 public partial class MainWindow : Window 25 { 26 public MainWindow() 27 { 28 InitializeComponent(); 29 } 30 31 //TODO:グレーのボタンが押されたとき 32 private void MenuItem_Click_1(object sender, RoutedEventArgs e) 33 { 34 OpenFileDialog ofd = new OpenFileDialog(); 35 if(ofd.ShowDialog() == true) 36 { 37 BitmapImage bitmapimage = new BitmapImage(new Uri(ofd.FileName)); 38 39 40 // BitmapImageの準備 41 int image_width = bitmapimage.PixelWidth; 42 int image_height = bitmapimage.PixelHeight; 43 int image_dpi = 96; 44 45 46 //writeablebitmapをインスタンス化 47 WriteableBitmap writeableBitmap = new WriteableBitmap(image_width, image_height, image_dpi, image_dpi, PixelFormats.Pbgra32, null); 48 49 50 // 計算用のバイト列の準備 51 int pixelsSize = (int)(image_width * image_height * 4); 52 byte[] byteimagedata = System.IO.File.ReadAllBytes(ofd.FileName); 53 54 55 //色情報を入れる 56 for (int x = 0; x < image_width * image_height * 4; x = x + 4) 57 { 58 //RGBの平均取得 59 byte byte_gray = (byte)(Math.Round((double)(byteimagedata[x] + (double)byteimagedata[x + 1] + (double)byteimagedata[x + 2]) / 3)); 60 61 byte alpha = 255; 62 63 byteimagedata[x] = byte_gray; 64 byteimagedata[x + 1] = byte_gray; 65 byteimagedata[x + 2] = byte_gray; 66 byteimagedata[x + 3] = alpha; 67 } 68 69 // 一行あたりのバイトサイズ 70 int stride = image_width * 4; 71 writeableBitmap.WritePixels(new Int32Rect(0, 0, image_width, image_height), byteimagedata, stride, 0, 0); 72 73 //imageBoxに表示 74 imageBox.Source = writeableBitmap; 75 76 77 } 78 } 79 } 80} 81
どうかご教授お願いします。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。