PictureBoxで画像のブレンドを無効にする

TheRealSuicune

私のWindowsフォームプログラムには、がありPictureBoxます。その中のビットマップ画像は小さい5 x 5ピクセルです。
に割り当てると、PictureBox非常にぼやけます。

ブレンディングモード、ブラーモード、アンチエイリアシングモードなどを見つけてみましたが、うまくいきませんでした。

Image1 Image2

   This is what I want     This is not what I want
ジミ

問題
表示に使用されるコンテナよりもはるかに小さいサイズのビットマップがぼやけており、明確に定義された色の領域の鋭いエッジが不用意にブレンドされています。
これは、ズームインしたときに非常に小さい画像(数ピクセル)にバイリニアフィルターを適用した結果です。

望ましい結果は、代わりに、画像が拡大されている間、単一ピクセルの元の色を維持することです。

この結果を得るには、GraphicsオブジェクトのInterpolationModeを次のように設定するだけで十分です。

e.Graphics.InterpolationMode = InterpolationMode.NearestNeighbor

このフィルターは、とも呼ばれPoint Filter、評価されるピクセルの色に最も近い色を選択するだけです。色の均一な領域を評価すると、結果はすべてのピクセルで同じピクセル色になります。
問題は1つだけです。それは、GraphicsオブジェクトのPixelOffsetModeのデフォルト値です。

e.Graphics.PixelOffsetMode = PixelOffsetMode.None

このモードをアクティブにすると、(通常の画像サンプリングでは)画像の上部と左側の境界に対応する外側のピクセルが、コンテナ(宛先ビットマップまたはデバイスコンテキスト)によって定義された長方形領域のエッジの中央に描画されます。 。

このため、ソース画像が小さく、そのピクセルがかなり拡大されているため、最初の水平線と垂直線のピクセルが視覚的に半分にカットされます。
これは、他の 方法を使用し解決できますPixelOffsetMode

e.Graphics.PixelOffsetMode = PixelOffsetMode.Half

このモードで、画像のレンダリング位置が0.5ピクセル戻ります
結果のサンプル画像は、これをよりよく説明できます。

InterpolationModeNearestNeighbor

      Default Filter         InterpolationMode        InterpolationMode
    InterpolationMode         NearestNeighbor          NearestNeighbor
         Bilinear           PixelOffsetMode.None     PixelOffsetMode.Half


.NetのMSDNドキュメントでは、PixelOffsetModeパラメーターについて十分に説明されていませんあなたは6つの明らかに異なる選択肢を見つけることができます。ピクセルオフセットモードは、実際には
PixelOffsetMode.None(デフォルト)との2つだけですPixelOffsetMode.Half

PixelOffsetMode.DefaultPixelOffsetMode.HighSpeedはと同じPixelOffsetMode.Noneです。
PixelOffsetMode.HighQualityと同じPixelOffsetMode.Halfです。
.Net Docsを読むと、どちらかを選択するとき速度に影響があるようです。違いは実際にはごくわずかです。

本件に関するC ++のドキュメント(一般的にはとGDI +)は、はるかに明示的かつ正確である、それは代わりに、ネットの1の使用すべきです。

進め方

小さなソースビットマップを新しい大きなビットマップに描画し、それをPictureBox.Imageプロパティに割り当てることができます。

ただし、ある時点でPictureBoxのサイズが変更されたと仮定します(レイアウトが変更されたため、および/またはDPI認識が損なわれたため)、(ほぼ)正方形に戻ります。

簡単な解決策は、新しいビットマップをコントロールの表面に直接描画し、必要に応じてディスクに保存することです。

これにより、品質を損なうことなく、必要に応じてビットマップをスケーリングすることもできます。

PixelOffsetModeスケールビットマップ

Imports System.Drawing
Imports System.Drawing.Drawing2D

Private pixelBitmap As Bitmap = Nothing

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    pixelBitmap = DirectCast(New Bitmap("File Path").Clone(), Bitmap)
End Sub

Private Sub PictureBox1_Paint(sender As Object, e As PaintEventArgs) Handles PictureBox1.Paint
    e.Graphics.InterpolationMode = InterpolationMode.NearestNeighbor
    e.Graphics.PixelOffsetMode = PixelOffsetMode.Half
    e.Graphics.DrawImage(pixelBitmap, GetScaledImageRect(pixelBitmap, DirectCast(sender, Control)))
End Sub

Private Sub PictureBox1_Resize(sender As Object, e As EventArgs) Handles PictureBox1.Resize
    PictureBox1.Invalidate()
End Sub

GetScaledImageRect コンテナ内の画像を拡大縮小するために使用されるヘルパーメソッドです。

Public Function GetScaledImageRect(image As Image, canvas As Control) As RectangleF
    Return GetScaledImageRect(image, canvas.ClientSize)
End Function

Public Function GetScaledImageRect(image As Image, containerSize As SizeF) As RectangleF
    Dim imgRect As RectangleF = RectangleF.Empty

    Dim scaleFactor As Single = CSng(image.Width / image.Height)
    Dim containerRatio As Single = containerSize.Width / containerSize.Height

    If containerRatio >= scaleFactor Then
        imgRect.Size = New SizeF(containerSize.Height * scaleFactor, containerSize.Height)
        imgRect.Location = New PointF((containerSize.Width - imgRect.Width) / 2, 0)
    Else
        imgRect.Size = New SizeF(containerSize.Width, containerSize.Width / scaleFactor)
        imgRect.Location = New PointF(0, (containerSize.Height - imgRect.Height) / 2)
    End If
    Return imgRect
End Function

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

Summernoteでの画像のアップロードを無効にする

スプリングブートで特定のレストエンドポイントを有効/無効にする方法は?

Eclipseでブレッドクラムを無効にする方法

SeleniumPythonで画像を無効にする

React Nativeで画像のフェードイン効果を無効にするにはどうすればよいですか?

1つのアプリケーションのWindows10タブレットモードで仮想キーボードを無効にする

RecyclerViewアイテムドラッグのバイブレーションを無効にする

セレンウェブドライバー(Python)でChromeの「パスワードを保存」ポップアップを無効にする方法

Firefoxのすべてのブレークポイントを無効にすることはできません

Unityでプレハブのコンポーネントを有効/無効にする

ブラウザで画像のキャッシュを無効にする

Wagtail管理者で、画像とドキュメントの要約アイテムを無効にする方法は?

フルカレンダーでボタンのバブリングを無効にする方法は?

スレッドの動作中にボタンを有効/無効にする

Reactで画像を無効にする方法

CoreTextで描画するときにブレンドを無効にする

PHPでコマンドの出力を無効にする方法

Firefoxでの画像の読み込みを無効にする

CD / DVDドライブのボタンを無効にするにはどうすればよいですか?

キャンバス、画像のダウンロードを無効にする

通知のバイブレーションを無効にする

KDEでブレッドクラムナビゲーションを無効にする

画像が無効な場合はPictureboxを非表示にする

特定のレコードのAccessサブフォームのコントロールを無効/有効にすることは可能ですか?Access 2000-VBA

C#でポケットベルテンプレートの画像ボタンを無効にする

vb.netでpicturebox_clickイベントを無効にする

サブグリッドの外部キー列がテンプレートを無効にする

Apartmentでサブドメインを無効にする

Djangoで画像のクリーンアップを無効にする

TOP 一覧

  1. 1

    セレンのモデルダイアログからテキストを抽出するにはどうすればよいですか?

  2. 2

    PictureBoxで画像のブレンドを無効にする

  3. 3

    Postmanを使用してファイル付きの(ネストされた)jsonオブジェクトを送信する

  4. 4

    テキストフィールドの値に基づいて UIslider を移動します

  5. 5

    Windows 10 Pro 1709を1803、1809、または1903に更新しますか?

  6. 6

    追加後、ブートストラップマルチセレクトがテーブルで機能しない

  7. 7

    MyBatisがネストされたオブジェクト属性を参照するとOgnlExceptionが発生します

  8. 8

    Ansibleで複数行のシェルスクリプトを実行する方法

  9. 9

    tf.nn_conv2dとtf.nn.depthwise_conv2dの違い

  10. 10

    Python / SciPyのピーク検出アルゴリズム

  11. 11

    PyCharmリモートインタープリターはプロジェクトタブにサイトパッケージのコンテンツを表示しません

  12. 12

    「埋め込みブラウザのOAuthログイン」を有効にしてコールバックURLを指定した後でも、Facebookのコールバックエラーが発生する

  13. 13

    Dynamics365からローカルファイルにアクセスできます。ローカルリソースは許可されていません

  14. 14

    STSでループプロセス「クラスパス通知の送信」のループを停止する方法

  15. 15

    Rパッケージ「AppliedPredictiveModeling」のインストール中にエラーが発生しました

  16. 16

    Chromeウェブアプリのウェブビューの高さの問題

  17. 17

    ZScalerと証明書の問題により、Dockerを使用できません

  18. 18

    C ++でのcURLとマルチスレッドの使用

  19. 19

    mutate_allとifelseを組み合わせるにはどうすればよいですか

  20. 20

    tkinterウィンドウを閉じてもPythonプログラムが終了しない

  21. 21

    java.lang.NoClassDefFoundError:com / sun / istack / tools / DefaultAuthenticator $ Receiver

ホットタグ

アーカイブ