ab.com コミュニティ https://www.activebasic.com/forum/ |
|
色の反転処理 https://www.activebasic.com/forum/viewtopic.php?t=2489 |
ページ 1 / 1 |
作成者: | papa [ 2008年10月22日(水) 11:18 ] |
記事の件名: | 色の反転処理 |
ImageBoxに取り込んだ画像の白と黒を入れ替えたいのですが、どうすれば良いのでしょう? ・白に近い色は、黒っぽい色にする。 ・黒に近い色は、白っぽい色にする。 ・赤や青や黄色は反転しない。 白は&HFFFFFFなので、ビットを反転すると黒になりますし、黒はその逆で行けると思います。 Dos画面の様な画像を印刷すると鉛筆でメモを書き込めないので、反転を思いつきました。 (インクの節約にもなりますし・・) 画像の事は良くわからいので、サンプルコードを示して頂けると助かります。 よろしくお願いします。 |
作成者: | konisi [ 2008年10月22日(水) 14:24 ] |
記事の件名: | |
赤や青を反転したくないなら、自前のライブラリを組む必要があると思います。 1.RGB値を取得 2.RGB→HSV変換をする 3.Hの値を逆転する 4.HSV→RGB変換をする 5.RGB値を返す てな具合。 単に反転するだけならBitBltでNOTSRCCOPYを指定すればいけるのではないかと。 |
作成者: | papa [ 2008年10月23日(木) 00:04 ] |
記事の件名: | |
konisiさんどうも。 HSVを調べてみました。 >>2.RGB→HSV変換をする ネットで検索したら、C++とかJavaとかのコードが見つかったのですが、Basicのサンプルはありませんか? >>3.Hの値を逆転する 色相(H)では無く明度(V)を逆転するのでは?? Vだとすると0~100%なので、0→100、1→99・・・の様な関数を作れば良いのですね。 |
作成者: | konisi [ 2008年10月23日(木) 00:20 ] |
記事の件名: | |
>色相(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 |
ページ 1 / 1 | 全ての表示時間は UTC+09:00 です |
Powered by phpBB® Forum Software © phpBB Limited https://www.phpbb.com/ |