C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

反転カラーの使い方

[トピック内 9 記事 (1 - 9 表示)]  << 0 >>

■103043 / inTopicNo.1)  反転カラーの使い方
  
□投稿者/ ぴーよ (1回)-(2024/04/06(Sat) 13:07:33)

分類:[.NET 全般] 

VB2015を使っております。
イメージ上にイメージの色の反転色を使ったラインを描画したいと考えています。

https://qiita.com/kimisyo/items/49bbeeb3454721335622

このページに書かれた方法を使うと、
Private Sub PictureBox1_Paint(ByVal sender As Object, ByVal e As PaintEventArgs) Handles PictureBox1.Paint
上で、実行するとうまく反転色のラインを描画することができました。



しかし、以下のようになぜかPictureBox以外の場所で
画像を保存する際などに使おうとすると反転色にならず
グレー色のラインになってしまいます。


Dim canvas As New Bitmap(img1.Width, img1.Height, PixelFormat.Format32bppPArgb)

Using g As Drawing.Graphics = Graphics.FromImage(canvas)


End Using

どのようにすれば、PictureBox以外の場所でも
反転色を使えるようになりますか?

引用返信 編集キー/
■103044 / inTopicNo.2)  Re[1]: 反転カラーの使い方
□投稿者/ とっちゃん (820回)-(2024/04/06(Sat) 16:17:24)
No103043 (ぴーよ さん) に返信
No103043 (ぴーよ さん) に返信

> しかし、以下のようになぜかPictureBox以外の場所で
> 画像を保存する際などに使おうとすると反転色にならず
> グレー色のラインになってしまいます。
>
LineTo なので

SetROP2( R2_NOT )
GetStockObject( BLACK_PEN )

または

SetROP2( R2_XORPEN )
GetStockObject( BLACK_PEN )

の組み合わせのどちらか(あるいはどちらでも)で
行けると思います。

手元で手軽に試せるコードを用意していないのでどちらがいけるかわからないですけど。

引用返信 編集キー/
■103045 / inTopicNo.3)  Re[1]: 反転カラーの使い方
□投稿者/ ぴーよ (2回)-(2024/04/06(Sat) 17:46:36)
ありがとうございます。

Dim oldROP As Integer = SetROP2(hDC, BinaryRasterOperations.R2_NOTXORPEN)
のところを
Dim oldROP As Integer = SetROP2(hDC, BinaryRasterOperations.R2_XORPEN)
にしてみたところ、ラインは描画されませんでした。

Dim oldROP As Integer = SetROP2(hDC, BinaryRasterOperations.R2_NOT)
にすると、ラインは描画されるものの、やはりグレーのラインになってしまいます。


GetStockObject( BLACK_PEN )
というのはどこで使えば良いのでしょうか?

SelectObject(hDC, oldPen)
辺りを置き換えれば良いのでしょうか?


引用返信 編集キー/
■103046 / inTopicNo.4)  Re[2]: 反転カラーの使い方
□投稿者/ とっちゃん (821回)-(2024/04/06(Sat) 21:29:01)
No103045 (ぴーよ さん) に返信
>
> GetStockObject( BLACK_PEN )
> というのはどこで使えば良いのでしょうか?
>
CreatePen して割り当てる代わりに
ブラシ同様 GetStockObject したGDIOBJECTを割り当てます。

もし、それでもグレーになってしまうとしたら
おそらくGDI+でビットマップへの描画がうまくいかないか
そもそも画像の種類がダメ(ARGBだとだめなどもあるかもしれない)かの
どちらかになってしまうと思います(GDI+の持つ制限事項に当たる)。

引用返信 編集キー/
■103047 / inTopicNo.5)  Re[2]: 反転カラーの使い方
□投稿者/ ぴーよ (3回)-(2024/04/07(Sun) 12:17:58)
ありがとうございます。

こういうことでしょうか?

Dim hDC As IntPtr = g.GetHdc()

'Dim Pen As IntPtr = CreatePen(CType(ds, PenStyle), pWidth, ReversibleColor)

Dim oldROP As Integer = SetROP2(hDC, BinaryRasterOperations.R2_NOT)
' Dim oldROP As Integer = SetROP2(hDC, BinaryRasterOperations.R2_XORPEN)

' Dim oldROP As Integer = SetROP2(hDC, BinaryRasterOperations.R2_NOTXORPEN)


Dim oldPen As IntPtr = SelectObject(hDC, GetStockObject(StockObjects.BLACK_PEN))
Dim oldBrush As IntPtr = SelectObject(hDC, GetStockObject(StockObjects.BLACK_BRUSH))

SetBkColor(hDC, ReversibleBackColor)

MoveToEx(hDC, x1, y1, IntPtr.Zero)
LineTo(hDC, x2, y2)

SelectObject(hDC, oldPen)
SelectObject(hDC, oldBrush)
SetROP2(hDC, oldROP)
'DeleteObject(Pen)

g.ReleaseHdc(hDC)



Dim oldROP As Integer = SetROP2(hDC, BinaryRasterOperations.R2_NOT)
だとグレーのラインが描画されるのですが反転はされません。
また、ラインの太さが1ptになってしまいます。
Dim oldROP As Integer = SetROP2(hDC, BinaryRasterOperations.R2_XORPEN)
だと何もラインが描画されません。


Format32bppRgb
Format24bppRgb
Format32bppArgb
Format32bppPArgb

と試してみましたが、いずれも結果は変わりませんでした。

どのようにしたら良いでしょうか?


引用返信 編集キー/
■103048 / inTopicNo.6)  Re[3]: 反転カラーの使い方
□投稿者/ KOZ (440回)-(2024/04/07(Sun) 18:42:01)
2024/04/10(Wed) 04:57:46 編集(投稿者)
BufferedGraphicsManager(Windows Forms のダブルバッファ) に描画してから転送するとうまくいくみたいです。

Dim bmpSize = New Size(100, 100)
Dim bmp As New Bitmap(bmpSize.Width, bmpSize.Height)
Using g = Graphics.FromImage(bmp)
    Dim dc = g.GetHdc()
    ' ダブルバッファを作成
    Dim bufferContext = BufferedGraphicsManager.Current
    Using bufferedGraphics = bufferContext.Allocate(dc, New Rectangle(Point.Empty, bmpSize))

        ' bufferedGraphics.Graphics に対して描画
        bufferedGraphics.Graphics.Clear(backColor) 
        DrawReversibleLine(bufferedGraphics.Graphics, New Point(0, 0), New Point(100, 100)..... 

        '描画内容を転送 
        bufferedGraphics.Render() 
    End Using
    g.ReleaseHdc()
End Using

引用返信 編集キー/
■103049 / inTopicNo.7)  Re[4]: 反転カラーの使い方
□投稿者/ ぴーよ (4回)-(2024/04/08(Mon) 20:51:19)
KOZさん

ありがとうございます。

うまくいきました。
このような裏技が必要になるのですね。


ところで、この方法って、
Formのダブルバッファーを使うわけなので、
GUIスレッドを使用しているのでしょうか?

もし、そうなら、とっちゃんさんの方法でうまくいくのなら
そちらの方が完全にバックグラウンドスレッドで実行できるので
良いような気がしたのですが、
そちらの方法はご存じないでしょうか?

引用返信 編集キー/
■103050 / inTopicNo.8)  Re[5]: 反転カラーの使い方
□投稿者/ KOZ (441回)-(2024/04/08(Mon) 22:17:15)
2024/04/10(Wed) 04:59:11 編集(投稿者)
No103049 (ぴーよ さん) に返信
> Formのダブルバッファーを使うわけなので、
> GUIスレッドを使用しているのでしょうか?

マルチスレッドで使う場合は、BufferedGraphicsContext を作成してください。

Dim bmp As New Bitmap(bmpSize.Width, bmpSize.Height)
Using g = Graphics.FromImage(bmp)
    Dim dc = g.GetHdc()
    Using bufferContext As New BufferedGraphicsContext()
        Using bufferedGraphics = bufferContext.Allocate(dc, New Rectangle(Point.Empty, bmpSize))
            bufferedGraphics.Graphics.Clear(backColor) 
            DrawReversibleLine(bufferedGraphics.Graphics, ......
            bufferedGraphics.Render()
        End Using
    End Using
    g.ReleaseHdc()
End Using

引用返信 編集キー/
■103051 / inTopicNo.9)  Re[6]: 反転カラーの使い方
□投稿者/ ぴーよ (5回)-(2024/04/09(Tue) 11:33:51)
こんな素晴らしい方法があったのですね。

どうもありがとうございました。

解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ