ImageBoxに取り込んだ画像の白と黒を入れ替えたいのですが、どうすれば良いのでしょう?
・白に近い色は、黒っぽい色にする。
・黒に近い色は、白っぽい色にする。
・赤や青や黄色は反転しない。
白は&HFFFFFFなので、ビットを反転すると黒になりますし、黒はその逆で行けると思います。
Dos画面の様な画像を印刷すると鉛筆でメモを書き込めないので、反転を思いつきました。
(インクの節約にもなりますし・・)
画像の事は良くわからいので、サンプルコードを示して頂けると助かります。
よろしくお願いします。
色の反転処理
赤や青を反転したくないなら、自前のライブラリを組む必要があると思います。
1.RGB値を取得
2.RGB→HSV変換をする
3.Hの値を逆転する
4.HSV→RGB変換をする
5.RGB値を返す
てな具合。
単に反転するだけならBitBltでNOTSRCCOPYを指定すればいけるのではないかと。
1.RGB値を取得
2.RGB→HSV変換をする
3.Hの値を逆転する
4.HSV→RGB変換をする
5.RGB値を返す
てな具合。
単に反転するだけならBitBltでNOTSRCCOPYを指定すればいけるのではないかと。
Website→http://web1.nazca.co.jp/himajinn13sei/top.html
ここ以外の場所では「暇人13世」というHNを主として使用。
に署名を書き換えて欲しいと言われたので暇だしやってみるテスト。
ここ以外の場所では「暇人13世」というHNを主として使用。
に署名を書き換えて欲しいと言われたので暇だしやってみるテスト。
>色相(H)では無く明度(V)を逆転するのでは??
その通りですね、どうも寝ぼけてたようです。
随分前にある目的で作ったコード片ならあります。
コメントが少ないしテストも殆どしてないと思うのですが、参考までに。
その通りですね、どうも寝ぼけてたようです。
随分前にある目的で作ったコード片ならあります。
コメントが少ないしテストも殆どしてないと思うのですが、参考までに。
[ここをクリックすると内容が表示されます]
コード: 全て選択
Type RGB
R As Double'[0.0 .. 1.0]
G As Double'[0.0 .. 1.0]
B As Double'[0.0 .. 1.0]
End Type
Type RGBd
R As Double'[0.0 .. 1.0]
G As Double'[0.0 .. 1.0]
B As Double'[0.0 .. 1.0]
End Type
Type HSV
H As Double'[0 .. 360]
S As Double'[0.0 .. 1.0]
V As Double'[0.0 .. 1.0]
End Type
Type XYZ
X As Double'[0.0 .. 1.0]
Y As Double'[0.0 .. 1.0]
Z As Double'[0.0 .. 1.0]
End Type
Type YCbCr
Y As Double'[16 .. 235]
Cb As Double'[16 .. 240]
Cr As Double'[16 .. 240]
End Type
Type YC1C2
Y As Double'[0.0 .. 1.0]
C1 As Double'[0.0 .. 1.0]
C2 As Double'[0.0 .. 1.0]
End Type
Type YUV
Y As Double'[0 .. 255]
U As Double'[-112 .. 112]
V As Double'[-157 .. 157]
End Type
Type YIQ
Y As Double'[0 .. 255]
I As Double'[0 .. 255]
Q As Double'[0 .. 255]
End Type
Type Gray
Y As Double'[0 .. 255]
End Type
Type CMY
C As Double'[0.0 .. 1.0]
M As Double'[0.0 .. 1.0]
Y As Double'[0.0 .. 1.0]
End Type
Type CMYK
C As Double'[0.0 .. 1.0]
M As Double'[0.0 .. 1.0]
Y As Double'[0.0 .. 1.0]
K As Double'[0.0 .. 1.0]
End Type
Sub RGBColor2RGB(src As Long,ByRef dst As RGB)
dst.R=(src and &HFF)/255
dst.G=((src>>8) and &HFF)/255
dst.B=((src>>16) and &HFF)/255
End Sub
Sub RGB2RGBd(ByRef src As RGB,ByRef dst As RGBd)
If src.R<0.018 then
dst.R=4.5*src.R
Else
dst.R=1.099*(src.R^0.45)-0.099
End If
If src.G<0.018 then
dst.G=4.5*src.G
Else
dst.G=1.099*(src.G^0.45)-0.099
End If
If src.B<0.018 then
dst.B=4.5*src.B
Else
dst.B=1.099*(src.B^0.45)-0.099
End If
End Sub
Sub RGBd2RGB(ByRef src As RGBd,ByRef dst As RGB)
If src.R<0.0812 then
dst.R=src.R/4.5
Else
dst.R=((src.R+0.099)/1.099)^(1/0.45)
End If
If src.G<0.0812 then
dst.G=src.G/4.5
Else
dst.G=((src.G+0.099)/1.099)^(1/0.45)
End If
If src.B<0.0812 then
dst.B=src.B/4.5
Else
dst.B=((src.B+0.099)/1.099)^(1/0.45)
End If
End Sub
Sub RGBd2YCbCr(ByRef src As RGBd,ByRef dst As YCbCr)
dst.Y =( 0.257*src.R+0.504*src.G+0.098*src.B)*255+16
dst.Cb=(-0.148*src.R-0.291*src.G+0.439*src.B)*255+128
dst.Cr=( 0.439*src.R-0.368*src.G-0.071*src.B)*255+128
End Sub
Sub YCbCr2RGBd(ByRef src As YCbCr,ByRef dst As RGBd)
dst.R=(1.164*(src.Y-16)+1.596*(src.Cr-128))/225
dst.G=(1.164*(src.Y-16)-0.813*(src.Cr-128)-0.392*(src.Cb-128))/225
dst.B=(1.164*(src.Y-16)+2.017*(src.Cb-128))/225
End Sub
Sub RGBd2YCC(ByRef src As RGBd,ByRef dst As YC1C2)
dst.Y=0.299*src.R+0.587*src.G+0.114*src.B
dst.C1=src.B-dst.Y
dst.C2=src.R-dst.Y
dst.Y=1/1.402*dst.Y
dst.C1=111.4/255*dst.C1+156/225
dst.C2=135.64/255*dst.C2+137/225
End Sub
Sub YCC2RGBd(ByRef src As YC1C2,ByRef dst As RGBd)
Dim dum As YC1C2
dum.Y=1.3584*src.Y
dum.C1=2.2179*(src.C1-156/255)
dum.C2=1.8215*(src.C2-137/255)
dst.R=dum.Y+dum.C2
dst.G=dum.Y-0.194*dum.C1-0.509*dum.C2
dst.B=dum.Y+dum.C1
End Sub
Sub RGBd2YUV(ByRef src As RGBd,ByRef dst As YUV)
dst.Y=0.299*src.R+0.587*src.G+0.114*src.B
dst.U=0.492*255*(src.B-dst.Y)
dst.V=0.877*255*(src.R-dst.Y)
dst.Y=dst.Y*255
End Sub
Sub YUV2RGBd(ByRef src As YUV,ByRef dst As RGBd)
dst.R=(src.Y+1.140*src.V)/255
dst.G=(src.Y-0.394*src.U-0.581*src.V)/255
dst.B=(src.Y+2.032*src.U)/255
End Sub
Sub RGBd2YIQ(ByRef src As RGBd,ByRef dst As YIQ)
dst.Y=(0.299*src.R+0.587*src.G+0.114*src.B)*255
dst.I=(0.596*src.R-0.274*src.G-0.322*src.B)*255
dst.Q=(0.211*src.R-0.522*src.G+0.311*src.B)*255
End Sub
Sub YIQ2RGBd(ByRef src As YIQ,ByRef dst As RGBd)
dst.R=(src.Y+0.956*src.I+0.621*src.Q)/255
dst.G=(src.Y-0.273*src.I-0.647*src.Q)/255
dst.B=(src.Y-1.107*src.I+1.704*src.Q)/255
End Sub
Sub RGBd2Gray(ByRef src As RGBd,ByRef dst As Gray)
dst.Y=(0.299*src.R+0.587*src.G+0.114*src.B)*255
End Sub
Sub RGB2XYZ(ByRef src As RGB,ByRef dst As XYZ)
dst.X=0.412453*src.R+0.35758*src.G+0.180423*src.B
dst.Y=0.212671*src.R+0.71516*src.G+0.072169*src.B
dst.Z=0.019334*src.R+0.119193*src.G+0.950227*src.B
End Sub
Sub XYZ2RGB(ByRef src As XYZ,ByRef dst As RGB)
dst.R=3.240479*src.X-1.53715*src.Y-0.498535*src.Z
dst.G=-0.969254*src.X+1.875991*src.Y+0.041556*src.Z
dst.B=0.055648*src.X-0.204043*src.Y+1.57311*src.Z
End Sub
Sub RGB2CMY(ByRef src As RGB,ByRef dst As CMY)
dst.C=1-src.R
dst.M=1-src.G
dst.Y=1-src.B
End Sub
Sub CMY2RGB(ByRef src As CMY,ByRef dst As RGB)
dst.R=1-src.C
dst.G=1-src.M
dst.B=1-src.Y
End Sub
Function min3(a As Double,b As Double,c As Double) As Double
min3=min(a,min(b,c))
End Function
Function min(a As Double,b As Double) As Double
If a<b then
min=a
Else
min=b
End If
End Function
Function max3(a As Double,b As Double,c As Double) As Double
max3=max(a,max(b,c))
End Function
Function max(a As Double,b As Double) As Double
If a<b then
max=b
Else
max=a
End If
End Function
Sub RGB2CMYK(ByRef src As RGB,ByRef dst As CMYK)
dst.K=min3(1-src.R,1-src.G,1-src.B)
dst.C=(1-src.R-dst.K)/(1-dst.K)
dst.M=(1-src.G-dst.K)/(1-dst.K)
dst.Y=(1-src.B-dst.K)/(1-dst.K)
End Sub
Sub CMYK2RGB(ByRef src As CMYK,ByRef dst As RGB)
dst.R=1-min(1,src.C*(1-src.K)+src.K)
dst.G=1-min(1,src.M*(1-src.K)+src.K)
dst.B=1-min(1,src.Y*(1-src.K)+src.K)
End Sub
Sub RGB2HSV(ByRef src As RGB,ByRef dst As HSV)
Dim MAX As Double,MIN As Double
Dim Cr As Double,Cg As Double,Cb As Double
MAX=max3(src.R,src.G,src.B)
MIN=min3(src.R,src.G,src.B)
If MAX=0 then
dst.H=0
dst.S=0
dst.V=0
Else
dst.V=MAX
dst.S=(MAX-MIN)/MAX
Cr=(MAX-src.R)/(MAX-MIN)
Cg=(MAX-src.G)/(MAX-MIN)
Cb=(MAX-src.B)/(MAX-MIN)
If MAX=src.R then
dst.H=(Cb-Cg)*60
ElseIf MAX=src.G then
dst.H=(2+Cr-Cb)*60
Else
dst.H=(4+Cg-Cr)*60
End If
If dst.H<0 then dst.H=dst.H+360
End If
End Sub
Sub HSV2RGB(ByRef src As HSV,ByRef dst As RGB)
Dim I As Double,F As Double
If src.S=0 then
dst.R=src.V
dst.G=src.V
dst.B=src.V
Else
I=Fix(src.H/60)
F=src.H/60-I
Select Case I
Case 0
dst.R=src.V
dst.G=src.V*(1-src.S*(1-F))
dst.B=src.V*(1-src.S)
Case 1
dst.R=src.V*(1-src.S*F)
dst.G=src.V
dst.B=src.V*(1-src.S)
Case 2
dst.R=src.V*(1-src.S)
dst.G=src.V
dst.B=src.V*(1-src.S*(1-F))
Case 3
dst.R=src.V*(1-src.S)
dst.G=src.V*(1-src.S*F)
dst.B=src.V
Case 4
dst.R=src.V*(1-src.S*(1-F))
dst.G=src.V*(1-src.S)
dst.B=src.V
Case 5
dst.R=src.V
dst.G=src.V*(1-src.S)
dst.B=src.V*(1-src.S*F)
End Select
End If
End Sub
Website→http://web1.nazca.co.jp/himajinn13sei/top.html
ここ以外の場所では「暇人13世」というHNを主として使用。
に署名を書き換えて欲しいと言われたので暇だしやってみるテスト。
ここ以外の場所では「暇人13世」というHNを主として使用。
に署名を書き換えて欲しいと言われたので暇だしやってみるテスト。