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

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

新規登録して質問してみよう
ただいま回答率
85.48%
.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

解決済

1回答

1322閲覧

白黒2値のTIFF画像ファイルの各座標の色を高速に取得したい

dotnetuseryamag

総合スコア16

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

1クリップ

投稿2019/03/22 03:00

編集2019/03/22 08:45

前提・実現したいこと

.NET Framework 4.5.2にて、白黒2値のTIFF画像ファイルを読み込み、各座標の色を配列に編集しようとしています。
この処理を高速で行う手法・方法を探しています。

発生している問題・エラーメッセージ

下記の流れでinteger配列に編集する処理を作成してみました。

VB.NET

1Dim img As Bitmap = Image.FromFile("TIFF画像ファイルのパス") 2Dim colors(img.Width - 1, img.Height - 1) As Integer 3 4For x = 0 To img.Width - 1 5 6 For y = 0 To img.Height - 1 7 8 colors(x, y) = img.GetPixel(x, y).ToArgb 9 10 Next 11 12Next

しかし、実際に複数の画像を処理させようとしたところ、
処理ファイル数が多くなった際の動作が遅かった為、
別の実装がないか調査しています。
(100 x 100のTIFF画像で1秒当たり100ファイル程度でした。)

前提にある通り、処理対象を白黒2値のTIFF画像に限定した場合、
配列に各座標の色を高速に編集する手法・方法はないでしょうか?

試したこと

白黒のみを判定できればいい為、ARGBの取得を下記の通りRのみに変更してみましたが、
速度はほぼ変わらずでした。

VB.NET

1Dim colors(img.Width - 1, img.Height - 1) As Byte 'IntegerからByteへ変更 2 3For x = 0 To img.Width - 1 4 5 For y = 0 To img.Height - 1 6 7 colors(x, y) = img.GetPixel(x, y).R 'ToArgbからRへ変更 8 9 Next 10 11Next

補足情報

Microsoft Docs Bitmap.GetPixel
https://docs.microsoft.com/ja-jp/dotnet/api/system.drawing.bitmap.getpixel?view=netframework-4.5.2

解決したコード

VB.NET

1Dim img As Bitmap = Image.FromFile("TIFF画像ファイルのパス") 2 3'ロック 4Dim bmpData As BitmapData = img.LockBits(New Rectangle(0, 0, img.Width, img.Height), ImageLockMode.ReadWrite, img.PixelFormat) 5 6'ピクセルデータをバイト型配列で取得する 7Dim pixels As Byte() = New Byte(bmpData.Stride * img.Height - 1) {} 8Runtime.InteropServices.Marshal.Copy(bmpData.Scan0, pixels, 0, pixels.Length) 9 10'ロック解除 11img.UnlockBits(bmpData)

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

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

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

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

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

guest

回答1

0

ベストアンサー

Bitmapをロックして、バイト配列にコピーして編集し書き戻すと早く処理できるようです。
色を反転させた画像(ネガティブイメージ)を表示する
もっと早くしたい場合はポインタを使うと良いみたいです。(C#側にしかサンプルはありませんが)

投稿2019/03/22 03:52

hihijiji

総合スコア4150

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

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

dotnetuseryamag

2019/03/22 08:53

回答ありがとうございます。 教えて頂いたサイトの情報を元に処理を作成したところ、 10倍以上の処理速度に高速化することができました。 コードは#解決したコード#として追記しました。 取得された配列は2色のbitをbyte配列化したものになりましたので、 各座標にアクセスする際はx,y座標に加えてBitmapDataのStrideを使用してバイト位置を取得し、 その中のbitにアクセスすることで色を取得することとしました。 大変助かりました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問