問題タブ [lockbits]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
vb.net - RGB 値はこの配列のどこに格納されていますか?
ビットマップ内のピクセルをより速く変更できるように作成しているコントロールで次のサブを使用しています。
これらはすべて機能し、後で操作後に実際の画像を取得するときにも正常に機能します。問題は、それらの実際のピクセルを設定することです。
この配列は何ですか?私はそれが満たされていることを知っていIntegersますが、それぞれの指標は何を表していますか? 最初は、次のように設定されていると思いました。
配列 -> [ピクセル 0,0 の R][ピクセル 0,0 の G][ピクセル 0,0 の B][ピクセル 2,0 の R][ピクセル 2,0 の G][ピクセル 2,0 の B] ]
ただし、これは正しく機能していないようです。
vb.net - VB.Net - ロックビット - 大なり/小なり関数
次のコードは、私がやっていることに対してうまく機能します。ただし、必要以上に時間がかかっています。問題は、大なり/小なり関数ごとに反復処理が行われ、時間がかかることです。いくつかの調査を行いましたが、すべてをスリムにして高速に実行する方法がわかりません。
ピクセルの RGB 値は、次のテストを実行する必要があります。(1) 1 つの値が 250 より大きい場合、他の値は 5 未満でなければなりません (2) 1 つの値が 5 未満の場合、他の値は 250 より大きい必要があります。 (3) 1 つの値がゼロに等しい場合、他の値は 0 より大きくなければなりません (4) 2 つの値の差は 15 (または私が設定したその他のしきい値) 未満でなければなりません (5) 2 つの値がゼロに等しいかどうかを確認します
また、これらの関数のそれぞれの後に「Exit For」を実行すると役に立ちますか?
.net - LockBits によるメモリの破損 (DirectShow Webcam)
.NET (VB 2010) で画像操作を行っています。私は次のコードを使用しています(まだ何もしません):
これは単純な目的 (画像を明るくするなど) には完全に機能しますが、私のアルゴリズムにはいくつかの大きな変数が必要です (上記の「foo」を参照)。それを宣言するとき(その行のコメントを外す)、突然例外が発生します:
「foo」のサイズに応じて...
...最初の Marshal.Copy() が
AccessViolationException: Attempted to read or write protected memory をスローします。これは多くの場合、他のメモリが破損していることを示しています。
...または「bytes」の宣言は
FatalExecutionEngineError をスローします: ランタイムで致命的なエラーが発生しました。エラーのアドレスは、スレッド 0x3690 の 0x6819d142 でした。エラー コードは 0xc0000005 です。このエラーは、CLR のバグ、またはユーザー コードの安全でない部分または検証不可能な部分のバグである可能性があります。このバグの一般的な原因には、COM 相互運用機能または PInvoke のユーザー マーシャリング エラーが含まれ、スタックが破損する可能性があります。
...または例外はまったくなく、すべて正常に動作します。
何が起こっている?
追加情報: DirectShow を使用して Web カメラから画像オブジェクトを取得します。
vb.net - 2つの画像間の画像認識 vb.net Lockbits
Pixel を使用して、大きな画像と小さな画像の間で検索を行っていました。私はそれを正常に動作させましたが、lockbits バージョンでやりたいことを実行するのに問題があります。
まず、大きな画像をループして、その中の小さな画像の最初のピクセルを見つけたいと思います。次に、数学の方程式を実行する最初のピクセルを見つけて、それが何パーセントの精度を達成したかを教えてくれます。そうすることで、大きな画像内の小さな画像の最初のピクセル(左上)にある画面上のその場所にマウスを移動する基準を満たしている場合。これは成功率が高く、GetPixel 形式に比べて非常に高速です。
問題 小さな画像の開始ピクセルがどこにあるかの大きな画像上の位置を取得できず、マウスをその位置に移動できません。以下はコードです:
Foundit: mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0) mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0) Catch End Try
マウスを画面上で移動させる方法を理解できれば、それを理解できたでしょう。残念ながら、私はこれに数日間取り組んできましたが、成功しませんでした。お役に立てれば幸いです。前もって感謝します。
c# - Lockbitsは私の画像に影響を与えません
私は3D(赤、シアン)プログラムを作成しています。うまくいきましたが、組み合わせると「画像」(コードを参照)は影響を受けていないようです。
私の間違いは何ですか?
推定:
CImage、RImageはコードの下にあります。画像の結果は完全に黒の透明な画像です。テストとデバッグのために、Alphaにコメントしました(結果は同じです)。
画像:

c# - Lockbitsを使用してビットマップからRGB値を取得する.Net
以下のコードを使用して画像から RGB 値を抽出していますが、これが機能することもありますが、特定のファイル (ストライドがビットマップの幅で割り切れないように見える) では、混合値が返されます。
結果の色をグループ化すると、値は次のようになります。
または、そのいくつかのバリエーション:
正しい方向に私を指摘してください、ところで私のソース bmp は PixelFormat.Format24bppRgb にもあるので、それが問題だとは思いません。また、C# でしか答えられない場合でも問題ありません。
c# - LockBits を使用してピクセル データにアクセスする際のメモリ エラー
以下のコードを使用して 3 つの異なるビットマップのピクセル データにアクセスすると、このエラーが発生します。
保護されたメモリを読み書きしようとしました。これは多くの場合、他のメモリが破損していることを示しています。
C# コード:
デバッガーを使用すると、変数npixels= 921600 であり、エラーが発生すると (for ループ) 変数i= 691200 であることがわかります。問題が何であるかはわかりません。ピクセル形式を 32bppRgb に変更しても問題はなく、正常に動作します。24bppRgb で作業したくないだけです。何か案は?ありがとう。:)
c# - ロックビットには修正が必要ですか?
「AccessViolationExceptionがユーザーコードによって処理されませんでした:保護されたメモリの読み取りまたは書き込みを試みました...」というエラーのあるコードがあります。
問題のある関数の縮小版は次のとおりです。
次の行でエラーが発生します。
に置き換えられた場合でも:
反復変数はクラッシュするたびに異なる値yを持つため、外部関数がビットマップを変更していると私は信じています。xCanvas
これが実際に私の問題である場合、外部から変更されないようfastBackgroundにする方法はありますか?Canvas私LockBitsはそれをすることになっていたと思った...
それだけでは答えられない場合は、もう少し試してみました。行を追加しました
fastBackground Canvasまたは寸法が他の関数によって変更されている場合は、OnPaintを終了します。
ミューテックスを使用して、ビットマップを変更し、ペイントと同時に実行されないようにすることもできますが(必要だと思います)、Canvasが公開されているため、別の方法でブロックしたいと思います。クラスからミューテックスを渡す必要があります。fastBackgroundCanvas
@usrの提案によると、このさらに縮小されたバージョンは失敗しません...PTDエラーであったに違いありません。(プログラマーがあまりにも馬鹿げている)すなわち算術エラー
c# - この方法でロックビットを使用してビットマップ領域をコピーするのは安全ですか(しゃれを意図しています)?
私はc#でビットマップをコピーするためのはるかに高速な方法を見つけたと思います。(それが有効であれば、私は最初ではなかったと確信していますが、まだどこにも見ていません。)
私がこれを尋ねることができる最も簡単な方法は、私が私の考えに基づいていることを主張することであり、誰もそれに穴を開けない場合は、その考えが健全であると仮定します。
1)LockBitsピクセルデータのブロックをビットマップから固定メモリにコピーして編集し、を使用してコピーし直すだけです。UnlockBits
2)使用LockBitsしてもコピーされたメモリブロックには影響しないため、コピー元のイメージには影響しません。
3)unsafeコードを入力することはないので、メモリが破損するリスクはありません。
私が見る可能性のある穴:
1)PixelFormat2つのビットマップのが異なる場合、このメソッドは常に正しくコピーされるとは限りません。ただし、LockBitspixelformatを指定する必要があるため、これは処理されているようです。(もしそうなら、ピクセルフォーマットを切り替えていない他の99.9%の時間、そのオーバーヘッドにご期待ください!/ EndSarcasm)
2)2つのビットマップのストライドが一致しない場合、問題が発生している可能性があります(strideコピー操作の外側のforループのインクリメンターであるため)。この問題により、ストライドが等しいビットマップへのコピーが制限されます。
編集:アサーション#2は間違っているに違いないと思います...後でCopyMeを介して渡されたビットマップにアクセスしようとしたときにエラーが見つかりました。以下の回避策がありますが、固定メモリのブロックが残っているかどうかはわかりません。(メモリリークアラート!)
c# - Bitmap.LockBitsはビットマップをメモリに「固定」しますか?
最近、ロックされたビットマップを頻繁に使用していますが、「無効なメモリにアクセスしようとしました」というエラーが発生し続けます。これは主に、ビットマップがメモリ内で移動されたためです。GCHandle.Alloc()CLRにメモリを割り当てて固定するために使用する人もいます。同じことをしますかBitmap.LockBits()?「ロック」メモリと「ピン」メモリの違いがわかりません。用語と違いがある場合は、それについても説明できますか?