問題タブ [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.

0 投票する
1 に答える
700 参照

stretchblt - StretchBlt() による問題の縮小

ソース ビットマップに基づいて独自の長方形のボタンを描画するコードがいくつかあります。

ほとんどの場合、宛先ボタンはソース ビットマップ イメージよりも大きく、StretchBlt は正常に動作します。ただし、宛先がソース イメージより小さい場合、StretchBlt は宛先領域全体を塗りつぶすことを拒否します。

画像の縮小に関しては、StretchBlt の品質が良くないことは知っていますが、それについてはあまり心配していません。欠落したピクセルが欲しくないだけです。

上部にソース画像、下部に宛先のリンクがあります。

リンク テキスト 注、実際にはソース イメージの一部を宛先に縮小しています。画像全体を縮小しているわけではありません。たとえば、BitBlt() を使用して角のサイズをサイズにコピーし、ソース イメージの角の間の水平方向のピクセル データを転送先の DC に引き伸ばします (押しつぶします)。

出発地と目的地の座標に問題はありません。SRCCOPY から WHITENESS に変更すると、予想どおり、領域全体が白で塗りつぶされます。上の Broken.bmp 画像に見られるように、ピクセルがコピーされていない灰色のバーはありません。

誰かが以前にこの問題を抱えていましたか? もしそうなら、誰かが解決策を提案できますか?

乾杯

0 投票する
4 に答える
1623 参照

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パート1 FPU パート 2: FPUパート2 FPU パート 3: FPUパート3 FPU 最終: 破損!: FPU Final: 破損しています!

注 2: System.Move で FPU スタックをクリアする必要があるのではないでしょうか?

0 投票する
1 に答える
2822 参照

c++ - StretchBlt とアルファ チャネルのフィルタリング

で画像を縮小していStretchBlt()ます。

http://img684.imageshack.us/img684/2152/stretchblt.png

ご覧のとおり、現在、品質フィルタリングと透明度のどちらかを選択する必要があるようです。両方手に入れる方法はありますか?実行する必要があるイメージ操作はこれだけなので、余分なライブラリは避けたいと思います。

私のコード:

0 投票する
1 に答える
1186 参照

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.RoundScaleTransformDrawImageUnscaledTransformPoints

また、ヒントを得るためにGDI +を掘り下げてみましたが、まだ有用なものは何も見つかりませんでした。

着地する場所の予測可能性を維持するためだけに、各ピクセルを個別にペイントする必要はありません。

ご参考までに、私が使用している理由はInterpolationMode.NearestNeighborアンチエイリアシングを回避するためであり(個々のピクセルの忠実度を維持する必要があります)、PixelOffsetMode.Halfそこにない場合はDrawImageがビットマップを0.5ピクセルパンするため含まれています。

問題点のさらにいくつかの例には、4pxから13pxにスケーリングする場合のx = 7、および4pxから17pxにスケーリングする場合のx=8が含まれます。

必要に応じて、完全な単体テストコードを投稿できます。これにより、MapPixel関数をドロップインして検証できます。これまでのところ、100%の精度を達成できた唯一の方法は、各ピクセルが一意の色に設定された「ヒント」ソース画像を生成する醜いハックを使用することです。ヒント画像の色を確認し、拡大縮小したヒント画像でその色を探すことで、座標をマッピングします。最適化は可能です(たとえば、ヒント画像は1ピクセルの幅または高さであり、上記の単純なロジックを使用しておおよその答えを推測し、そこから外側に向かって作業します)が、それでも醜いです。

誰かがDrawImageの背後にある配管に光を当てて、MapPixelのより単純な(しかしまだ正確な)実装を考え出すのを手伝ってくれたら幸いです。

0 投票する
1 に答える
335 参照

.net - StretchBlt が失敗する

COM コンポーネントがあります。この COM コンポーネントは、画面に画像を表示します。イメージ ビットは、次のようにバッファーを介してコピーされます。

imagecv::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?

0 投票する
2 に答える
2244 参照

c++ - StretchBltシュリンク破損

私はWindows(7とXPの両方-両方とも32ビット)を使用しており、C++でコーディングしています

外部ソースからビットマップを受信して​​います。これらのビットマップは固定解像度(384x288)です

ビットマップを受け取った後、可変サイズのレイアウトに基づいてサイズを変更する必要があるため、現在、StretchBltを使用してこれらのタスクを実行しています。

画面上の画像でビットマップのサイズを大きくすると、これはうまく機能します。

ただし、着信ビットマップを小さいバージョンに縮小して画面に配置すると、画像上で発生する奇妙な「ボクシング」タイプの効果が得られます。

次の例では、ソース画像は3つのパネルのそれぞれで同じです。ただし、左側の2つ(サイズを小さく)は両方ともボクシング/ライン効果があります。

ここに画像の説明を入力してください

実際のStretchBlt呼び出しでは、次のようにします。

しかし、おそらく問題は他の場所にあるのだろうかと思います。

他の誰かが、私がそれを修正する方法を知っているこの種のサイズ変更画像の破損の経験がありますか?

0 投票する
1 に答える
2686 参照

c++ - StretchBlt() はミラー イメージを作成しません

MSDNによると:

nWidthSrc パラメータと nWidthDest パラメータの符号が異なる場合、または nHeightSrc パラメータと nHeightDest パラメータが異なる場合、StretchBlt はビットマップのミラー イメージを作成します。

ということで、逆さ画像を作ってみました。次のようなクラスがあります。

そして私はこの方法を持っています:

しかし、それは機能しません、何も起こりません。DC互換性があるのだろうか、その背後にあるロジックを理解するのに常に問題がありました。

では、ビットマップを反転させるにはどうすればよいでしょうか?

0 投票する
1 に答える
380 参照

visual-c++ - 出力としてモノクロ ビットマップを与える StretchBlt

VC++ で画像を縮小するためのコードを書いています。宛先ビットマップを保存すると、モノクロ画像になります。コード:

誰かがここで私を助けてくれたら、とても感謝します。前もって感謝します

0 投票する
1 に答える
700 参照

performance - StretchBlt は遅すぎますが、とにかく速いですか?

サイズ変更されたリアルタイム ビデオを描画するために StretchBlt を使用しています。

ただし、StretchBlt API は遅すぎます。私のコンピューターでは、StretchBlt が実行されるたびに約 100 ミリ秒かかります。速度を改善する他の A​​PI または方法はありますか?