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

    ソートされた検索、ターゲット値未満の数をカウント

  3. 3

    Unity:未知のスクリプトをGameObject(カスタムエディター)に動的にアタッチする方法

  4. 4

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

  5. 5

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

  6. 6

    Reactでclsxを使用する方法

  7. 7

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

  8. 8

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

  9. 9

    Pythonを使用して同じ列の同じ値の間の時差を取得する方法

  10. 10

    PowerShellの分割ファイルへのヘッダーの追加

  11. 11

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

  12. 12

    BLOBストレージからデータを読み取り、Azure関数アプリを使用してデータにアクセスする方法

  13. 13

    Crashlytics:コンパイラー生成とはどういう意味ですか?

  14. 14

    GoDaddyでのCKEditorとKCfinderの画像プレビュー

  15. 15

    Windows 10の起動時間:以前は20秒でしたが、現在は6〜8倍になっています

  16. 16

    MLでのデータ前処理の背後にある直感

  17. 17

    モーダルダイアログを自動的に閉じる-サーバーコードが完了したら、Googleスプレッドシートのダイアログを閉じます

  18. 18

    reCAPTCHA-エラーコード:ユーザーの応答を検証するときの「missing-input-response」、「missing-input-secret」(POSTの詳細がない)

  19. 19

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

  20. 20

    ファイル内の2つのマーカー間のテキストを、別のファイルのテキストのセクションに置き換えるにはどうすればよいですか?

  21. 21

    ネットワークグラフで、ネットワークコンポーネントにカーソルを合わせたときに、それらを強調表示するにはどうすればよいですか?

ホットタグ

アーカイブ