問題タブ [stretchblt]
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.
stretchblt - StretchBlt() による問題の縮小
ソース ビットマップに基づいて独自の長方形のボタンを描画するコードがいくつかあります。
ほとんどの場合、宛先ボタンはソース ビットマップ イメージよりも大きく、StretchBlt は正常に動作します。ただし、宛先がソース イメージより小さい場合、StretchBlt は宛先領域全体を塗りつぶすことを拒否します。
画像の縮小に関しては、StretchBlt の品質が良くないことは知っていますが、それについてはあまり心配していません。欠落したピクセルが欲しくないだけです。
上部にソース画像、下部に宛先のリンクがあります。
リンク テキスト 注、実際にはソース イメージの一部を宛先に縮小しています。画像全体を縮小しているわけではありません。たとえば、BitBlt() を使用して角のサイズをサイズにコピーし、ソース イメージの角の間の水平方向のピクセル データを転送先の DC に引き伸ばします (押しつぶします)。
出発地と目的地の座標に問題はありません。SRCCOPY から WHITENESS に変更すると、予想どおり、領域全体が白で塗りつぶされます。上の Broken.bmp 画像に見られるように、ピクセルがコピーされていない灰色のバーはありません。
誰かが以前にこの問題を抱えていましたか? もしそうなら、誰かが解決策を提案できますか?
乾杯
delphi - 8087CW モードの変更による System.Move のメモリ破損 (png + stretchblt)
奇妙なメモリ破損の問題があります。何時間もデバッグして試した後、何かを見つけたと思います。
例: 簡単な文字列割り当てを行います。
ただし、結果が次のようになる場合があります。
したがって、_ は 0 バイトに置き換えられます。
System.Move 関数で、高速メモリ コピーに FPU スタック (fild、fistp) を使用する場合 (9 バイトから 32 バイトまで移動する場合)、これが 1 回発生するのを見たことがあります (タイミングによっては、再現が難しい場合があります)。
FPU ビューと 2 つのメモリ デバッグ ビュー (Delphi -> View -> Debug -> CPU -> Memory) を使用すると、うまくいかないことがわかりました...一度...再現できませんでしたが...
今朝、私は 8087CW モードについて何か読みました。はい、これを $27FI に変更すると、メモリが破損します! 通常は $133F です。
$133F と $027F の違いは、$027F が FPU を設定して、精度の低い計算 (Extended ではなく Double に制限) と、異なる無限処理 (古い FPU で使用されていましたが、現在は使用されていません) を行うことです。
さて、理由はわかりましたが、いつではありません!
簡単なチェックでAsmProfilerの動作を変更しました(そのため、すべての関数は出入り時にチェックされます)。
いくつかのユニットと dll とビンゴを「プロファイリング」しました (スタックを参照):
だから、それは StretchBlt で起こっています...
今何をする?Windows のせいですか、それとも PNG のバグですか (D2007 に含まれています)。または、System.Move 関数はフェイルセーフではありませんか?
注:単純に再現しようとしてもうまくいきません:
それはもっとエキゾチックなようです...しかし、「Get8087CW = $27F」のデバッグブレークにより、別の文字列で再現できました: FPU パート 1:
FPU パート 2:
FPU パート 3:
FPU 最終: 破損!:
注 2: System.Move で FPU スタックをクリアする必要があるのではないでしょうか?
c++ - StretchBlt とアルファ チャネルのフィルタリング
で画像を縮小していStretchBlt()
ます。
http://img684.imageshack.us/img684/2152/stretchblt.png
ご覧のとおり、現在、品質フィルタリングと透明度のどちらかを選択する必要があるようです。両方手に入れる方法はありますか?実行する必要があるイメージ操作はこれだけなので、余分なライブラリは避けたいと思います。
私のコード:
bitmap - Graphics.DrawImageによってスケーリングされたピクセルを正確にマッピングする
Graphics.DrawImage
ビットマップのストレッチと描画に使用するWinformsアプリケーションがあり、ソースピクセルが宛先にどのようにマップされるかを正確に理解するための支援が必要です。
理想的には、次のような関数を記述したいと思います。
これは、ソース画像のピクセル座標を取得し、スケーリングされた宛先のそれに対応する「左上」ピクセルの座標を返します。
わかりやすくするために、2x2ビットマップが4x4にスケーリングされる簡単な例を次に示します。
矢印は、ポイント(1,0)をMapPixelにフィードする方法を示しています。
(2,0)の結果を与える必要があります。
次のようなロジックを使用して、上記の例でMapPixelを機能させるのは簡単です。
dst.Width
ただし、この単純な実装では、がの倍数ではない場合、丸めが原因でエラーが発生することに気付きましたsrc.Width
。この場合、DrawImageは、画像をフィットさせるために他のピクセルよりも大きく描画するためにいくつかのピクセルを選択する必要があり、そのロジックを複製するのに問題があります。
次のコードは、2x1ビットマップをいくつかの異なる幅にスケーリングすることで問題を示しています。
元のsrc
画像と出力dst
画像は次のようになり、MapPixelが青いピクセルをどのようにマッピングする必要があるかを示すいくつかの数字が表示されます。
DrawImageがどのピクセルを大きくするかをどのように決定するかを私は一生理解できません。切り上げることもあれば、切り下げることもあるようです。どちらを選択するかは気にしませんが、関数が正しく機能するためには予測可能である必要があります。
上記のMapPixelの例を使用するように変更してみましたが、最も近い奇数MidpointRounding.AwayFromZero
に丸める関数に置き換えました(結果はわずかに改善されますが、それでも完全ではありません)。また、Graphicsクラスにスケーリングを処理させてみました。つまり、設定し、呼び出してから、を使用して座標を変換しようとしました。興味深いことに、TransformPointsメソッドの結果は、DrawImageおよびDrawImageUnscaledの結果とも常に一致するとは限りません。Math.Round
ScaleTransform
DrawImageUnscaled
TransformPoints
また、ヒントを得るためにGDI +を掘り下げてみましたが、まだ有用なものは何も見つかりませんでした。
着地する場所の予測可能性を維持するためだけに、各ピクセルを個別にペイントする必要はありません。
ご参考までに、私が使用している理由はInterpolationMode.NearestNeighbor
アンチエイリアシングを回避するためであり(個々のピクセルの忠実度を維持する必要があります)、PixelOffsetMode.Half
そこにない場合はDrawImageがビットマップを0.5ピクセルパンするため含まれています。
問題点のさらにいくつかの例には、4pxから13pxにスケーリングする場合のx = 7、および4pxから17pxにスケーリングする場合のx=8が含まれます。
必要に応じて、完全な単体テストコードを投稿できます。これにより、MapPixel関数をドロップインして検証できます。これまでのところ、100%の精度を達成できた唯一の方法は、各ピクセルが一意の色に設定された「ヒント」ソース画像を生成する醜いハックを使用することです。ヒント画像の色を確認し、拡大縮小したヒント画像でその色を探すことで、座標をマッピングします。最適化は可能です(たとえば、ヒント画像は1ピクセルの幅または高さであり、上記の単純なロジックを使用しておおよその答えを推測し、そこから外側に向かって作業します)が、それでも醜いです。
誰かがDrawImageの背後にある配管に光を当てて、MapPixelのより単純な(しかしまだ正確な)実装を考え出すのを手伝ってくれたら幸いです。
.net - StretchBlt が失敗する
COM コンポーネントがあります。この COM コンポーネントは、画面に画像を表示します。イメージ ビットは、次のようにバッファーを介してコピーされます。
image
cv::Mat はどこにありますか。特定の条件では、これはトリミングされた cv::Mat です。raw_image(x0, y0, w, h)
whereの戻り値raw_image
は別の cv::Mat です。
その後、アプリケーションはStretchBlt
画像を表示するために呼び出します。
If I'm running this COM component inside a .NET application (and only when inside a .NET application this doesn't occurs on a pure unmanaged environment) the call to StretchBlt
fails when (again, only when) image
has been cropped. It does not fail on the code path where image isn't cropped. The drawing code is the same for both code paths. GetLastError()
will return the error 8.
Can someone shed a light on this issue?
c++ - StretchBltシュリンク破損
私はWindows(7とXPの両方-両方とも32ビット)を使用しており、C++でコーディングしています
外部ソースからビットマップを受信しています。これらのビットマップは固定解像度(384x288)です
ビットマップを受け取った後、可変サイズのレイアウトに基づいてサイズを変更する必要があるため、現在、StretchBltを使用してこれらのタスクを実行しています。
画面上の画像でビットマップのサイズを大きくすると、これはうまく機能します。
ただし、着信ビットマップを小さいバージョンに縮小して画面に配置すると、画像上で発生する奇妙な「ボクシング」タイプの効果が得られます。
次の例では、ソース画像は3つのパネルのそれぞれで同じです。ただし、左側の2つ(サイズを小さく)は両方ともボクシング/ライン効果があります。
実際のStretchBlt呼び出しでは、次のようにします。
しかし、おそらく問題は他の場所にあるのだろうかと思います。
他の誰かが、私がそれを修正する方法を知っているこの種のサイズ変更画像の破損の経験がありますか?
c++ - StretchBlt() はミラー イメージを作成しません
MSDNによると:
nWidthSrc パラメータと nWidthDest パラメータの符号が異なる場合、または nHeightSrc パラメータと nHeightDest パラメータが異なる場合、StretchBlt はビットマップのミラー イメージを作成します。
ということで、逆さ画像を作ってみました。次のようなクラスがあります。
そして私はこの方法を持っています:
しかし、それは機能しません、何も起こりません。DC互換性があるのだろうか、その背後にあるロジックを理解するのに常に問題がありました。
では、ビットマップを反転させるにはどうすればよいでしょうか?
visual-c++ - 出力としてモノクロ ビットマップを与える StretchBlt
VC++ で画像を縮小するためのコードを書いています。宛先ビットマップを保存すると、モノクロ画像になります。コード:
誰かがここで私を助けてくれたら、とても感謝します。前もって感謝します
performance - StretchBlt は遅すぎますが、とにかく速いですか?
サイズ変更されたリアルタイム ビデオを描画するために StretchBlt を使用しています。
ただし、StretchBlt API は遅すぎます。私のコンピューターでは、StretchBlt が実行されるたびに約 100 ミリ秒かかります。速度を改善する他の API または方法はありますか?