|
分類:[C#]
C#のWPFで画像処理のプログラムを書いているのですが,分からないことが,2つあります.
(質問1) bitmap以外のファイルのピクセルの情報が取って来れずに困っています.
bitmap場合,以下の手順でピクセル情報を取ってこれるんですが.... Uri tempUri = new Uri(this.PropMyOpenDialog.FileNames[i], UriKind.RelativeOrAbsolute); BitmapDecoder myBitmapDecoder = BitmapDecoder.Create(tempUri, BitmapCreateOptions.None, BitmapCacheOption.Default); BitmapSource myBitmapSource = myBitmapDecoder.Frames[0]; byte[] data = new byte[画像の幅*画像の高さ*チャンネル数]; data = target.CopyPixels( this.mData, //格納先 this.mPixelWidth * this.mChanelNum, //スライド 0 //オフセット );
たとえば,jpegの場合, 以下のどちらのコードを書いてもbyteの配列の値が全て「255」になってしまいます. 何が足りないのでしょうか??
//サンプル1 Uri tempUri = new Uri(this.PropMyOpenDialog.FileNames[i], UriKind.RelativeOrAbsolute); BitmapDecoder myBitmapDecoder = JpegBitmapDecoder.Create(tempUri, BitmapCreateOptions.None, BitmapCacheOption.Default); BitmapSource myBitmapSource = myBitmapDecoder.Frames[0]; byte[] data = new byte[画像の幅*画像の高さ*チャンネル数]; data = target.CopyPixels( this.mData, //格納先 this.mPixelWidth * this.mChanelNum, //スライド 0 //オフセット );
//サンプル2 Uri tempUri = new Uri(this.PropMyOpenDialog.FileNames[i], UriKind.RelativeOrAbsolute); JpegBitmapDecoder myJpegBitmapDecoder = new JpegBitmapDecoder(tempUri, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default); BitmapSource myBitmapSource = myJpegBitmapDecoder.Frames[0]; byte[] data = new byte[画像の幅*画像の高さ*チャンネル数]; data = target.CopyPixels( this.mData, //格納先 this.mPixelWidth * this.mChanelNum, //スライド 0 //オフセット );
(質問2) ピクセルの情報をbitmapファイルとして書き出す場合に,BitmapSource.Createの引数strideで指定する値が分かりません. 32bitの場合 (PixelWidth * mPixelFormats.Bgr32.BitsPerPixel + 7) / 8 と指定すれば,正常に書き出せるのですが, (PixelWidth * mPixelFormats.Bgr24.BitsPerPixel + 7) / 8 24bitの場合正常に書き出されません. ビットマップのストライドって,「1行分の幅のbyte数が4で割り切れるように,幅のバイト数に余分なbyteを足したもの」ですよね?
質問は以上の2つです. よろしくお願いします!!
|