🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C#

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

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

Q&A

解決済

2回答

932閲覧

C# 値型のエラーが解決できない

退会済みユーザー

退会済みユーザー

総合スコア0

C#

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

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

0グッド

0クリップ

投稿2019/11/23 10:28

前提・実現したいこと

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

どうかご教授お願いします。

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

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

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

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

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

guest

回答2

0

画像でいろいろ遊んでみたいってことで、グレイスケールにするのが目的ではないんですよね?
方法: イメージをグレースケールに変換する | Microsoft Docs

画像関係は全然わからないんですが、bmpでも必ずしもそのまま並んでいるわけじゃないんじゃないでしょうか?

参考サイトの別のページに、byteに読み込む部分がありました。
C#でBitmapImageをByte配列に変換してみた
pngから変換してたりと、速度を求めていないのであればより汎用的になりそうですがどうでしょうか。

投稿2019/11/24 08:56

編集2024/03/04 09:31
TN8001

総合スコア9855

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

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

0

ベストアンサー

配列の範囲を超えてるというエラーです
そのときのその配列のサイズ、xの値をチェックしてみては。

投稿2019/11/23 10:36

y_waiwai

総合スコア88038

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

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

退会済みユーザー

退会済みユーザー

2019/11/23 10:42

わかりました。 ありがとうございます。 方針はこれで合っていますか?
y_waiwai

2019/11/23 10:46

とりあえずそれで完成させてみては。 実際に実行させればあってるかどうかわかるでしょ
退会済みユーザー

退会済みユーザー

2019/11/23 12:11

わかりました! やってみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問