討論區快速選單
知識庫快速選單
程式設計俱樂部Facebook粉絲團 虛擬社群公民行為研究
[ 回上頁 ] [ 討論區發言規則 ]
該如何將彩色圖片黑白化呢
更改我的閱讀文章字型大小
作者 : seikolk(姚小憲)
[ 貼文 12 | 人氣 3077 | 評價 0 | 評價/貼文 0 | 送出評價 5 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2008/1/3 下午 05:38:17
如題 我有稍微的爬一下文
關於使用VB將彩色圖片黑白化的詳細說明甚少
有些說明實在過於複雜
實屬小弟我無法知會的領域

假設今天我有一個PictureBox裡面有一張彩色的圖
而我要設一各閥值
讓圖形的每一點只要大於我所設的閥值 則此點便轉換為白色
反之則變回黑色

另有一問
如果我想將上述的成果呈現出來
是要先將彩色轉灰階再轉黑白
還是能直接能將彩色轉黑白呢

新手小弟我其實很有心要好好學習
不知有沒有大大願意提供一些將圖片黑白化的相關知識嗎??
當然內容愈詳細愈好嚕^^"
感激不盡^^
作者 : 168(阿戊) Visual Basic一代宗師貼文超過2000則
[ 貼文 2957 | 人氣 7614 | 評價 11710 | 評價/貼文 3.96 | 送出評價 99 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
主題發起人seikolk註記此篇回應為很有道理 2008/1/3 下午 10:30:17
>假設今天我有一個PictureBox裡面有一張彩色的圖
>而我要設一各閥值
>讓圖形的每一點只要大於我所設的閥值 則此點便轉換為白色
>反之則變回黑色
>
>另有一問
>如果我想將上述的成果呈現出來
>是要先將彩色轉灰階再轉黑白
>還是能直接能將彩色轉黑白呢

彩色要轉黑白所需的 閥值 是以 亮度 為基準,所以要先把 RGB 轉為 HLS (Hue、Lightness、Saturation)再來決定黑或白,而轉灰階的原理亦同,只是從HLS還原為rgb時,R=G=B 三者的值必需一樣而已,如果將RGB想成3D之X,Y,Z軸,則BMP的RGB為(r,g,b)與座標(Y,Y,Y)距離最小時的Y即為灰階值,轉灰階值有公式可套,查一下就有!
作者 : seikolk(姚小憲)
[ 貼文 12 | 人氣 3077 | 評價 0 | 評價/貼文 0 | 送出評價 5 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2008/1/3 下午 10:54:31
多謝阿戊兄的回答
小弟我大概有各基本概念了
但可否有語法和書籍可以參考學習的嗎?
能夠提供各方向嗎?

作者 : 168(阿戊) Visual Basic一代宗師貼文超過2000則
[ 貼文 2957 | 人氣 7614 | 評價 11710 | 評價/貼文 3.96 | 送出評價 99 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
主題發起人seikolk註記此篇回應為最佳解答 2008/1/4 上午 08:57:15
'rgb轉hls的副程式
Private Type HSL: Hue As Integer: Saturation As Integer: Luminance As Integer: End Type

Private Function RGBtoHSL(ByVal Red As Integer, ByVal Green As Integer, ByVal Blue As Integer) As HSL
 Dim pRed As Single, pGreen As Single, pBlue As Single, RetVal As HSL
 Dim pMax As Single, pMin As Single, pLum As Single, pSat As Single, pHue As Single
 pRed = Red / 255: pGreen = Green / 255: pBlue = Blue / 255
 If pRed > pGreen Then pMax = pRed: pMin = pGreen Else pMax = pGreen: pMin = pRed
 If pBlue > pMax Then pMax = pBlue
 If pBlue < pMin Then pMin = pBlue
 pLum = (pMax + pMin) / 2
 If pMax = pMin Then
  pSat = 0: pHue = 0
 Else
  If pLum < 0.5 Then pSat = (pMax - pMin) / (pMax + pMin) Else pSat = (pMax - pMin) / (2 - pMax - pMin)
  Select Case pMax!
  Case pRed
   pHue = (pGreen - pBlue) / (pMax - pMin)
  Case pGreen
   pHue = 2 + (pBlue - pRed) / (pMax - pMin)
  Case pBlue
   pHue = 4 + (pRed - pGreen) / (pMax - pMin)
  End Select
 End If
 RetVal.Hue = pHue * 239 \ 6
 If RetVal.Hue < 0 Then RetVal.Hue = RetVal.Hue + 240
 RetVal.Saturation = Int(pSat * 239)
 RetVal.Luminance = Int(pLum * 239)
 RGBtoHSL = RetVal
End Function

'-----------轉換應用--------------
 C = 某一點的顏色值
 '分解出R、G、B
 R = C And &HFF
 G = (C And &HFF00&) \ &HFF
 B = (C And &HFF0000) \ &HFFFF&
 a = RGBtoHSL(R, G, B) '轉為HSL
 If a.Luminance > 閥值 Then
 ....
 else
 ....
 end if
作者 : 168(阿戊) Visual Basic一代宗師貼文超過2000則
[ 貼文 2957 | 人氣 7614 | 評價 11710 | 評價/貼文 3.96 | 送出評價 99 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
主題發起人seikolk註記此篇回應為很有道理 2008/1/4 上午 09:40:07
另一種方法(使用GFLAX):

Private Sub Command1_Click()
 Dim a As New GflAx.GflAx
 For i = -255 To 255
  a.SetPicture Picture1.Picture '轉入已存在的圖
  a.Adjust i, 1, 1 '調整整體亮度
  a.ChangeColorDepth 1, 0, 1 '轉黑白
  Picture2.Picture = a.GetPicture '將結果貼到另一個pic好比對原圖
  For j = 1 To 10000: DoEvents: Next '純粹為了讓它慢一點好看漸變的效果
 Next i
 Set a = Nothing '釋放GFLAX(建議一定要做...)
End Sub

'ps:因GFLAX的ChangeColorDepth轉黑白圖之閥值是固定的,所以改用調整原圖亮度來達到和改變閥值的效果一樣
作者 : seikolk(姚小憲)
[ 貼文 12 | 人氣 3077 | 評價 0 | 評價/貼文 0 | 送出評價 5 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2008/1/10 上午 12:31:47
謝謝阿戊兄的解答唷
最近電腦主機板壞掉了 所以拖到現在才跟你說謝謝
深感抱歉QQ
作者 : 168(阿戊) Visual Basic一代宗師貼文超過2000則
[ 貼文 2957 | 人氣 7614 | 評價 11710 | 評價/貼文 3.96 | 送出評價 99 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2008/1/10 上午 12:34:50
不客氣~在這個版回答後沒再接到回應已經習慣了...泥算是"異類"了~^+++^
作者 : seikolk(姚小憲)
[ 貼文 12 | 人氣 3077 | 評價 0 | 評價/貼文 0 | 送出評價 5 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2008/1/10 下午 04:51:57
能否請敎阿戊兄你說的

使用另一種方法(使用GFLAX):

但該如何引用GflAx.dll
還有GflAx.dll要去哪抓呢?
麻煩阿戊兄解答了
作者 : 168(阿戊) Visual Basic一代宗師貼文超過2000則
[ 貼文 2957 | 人氣 7614 | 評價 11710 | 評價/貼文 3.96 | 送出評價 99 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2008/1/10 下午 08:50:13
http://pagesperso-orange.fr/pierre.g/xnview/endownloadgflwin.html
視泥柱己的需要下載吧~
 板主 : 小樓
 > Visual Basic 6.0/VBA - 討論區
 - 最近熱門問答精華集
 - 全部歷史問答精華集
 - Visual Basic 6.0/VBA - 知識庫
  ■ 全站最新Post列表
  ■ 我的文章收藏
  ■ 我最愛的作者
  ■ 全站文章收藏排行榜
  ■ 全站最愛作者排行榜
  ■  月熱門主題
  ■  季熱門主題
  ■  熱門主題Top 20
  ■  本區Post排行榜
  ■  本區評價排行榜
  ■  全站專家名人榜
  ■  全站Post排行榜
  ■  全站評價排行榜
  ■  全站人氣排行榜
 請輸入關鍵字 
  開始搜尋
 
Top 10
評價排行
Visual Basic 6.0/VBA
1 阿戊 10670 
2 小樓 8650 
3 Jones 5270 
4 水瓶天賞 2340 
5 joe 2200 
6 史努比 1940 
7 阿呆紅 1440 
8 tt's 1250 
9 青衫 1150 
10 羅啟章 1020 
Visual Basic 6.0/VBA
  專家等級 評價  
  一代宗師 10000  
  曠世奇才 5000  
  頂尖高手 3000  
  卓越專家 1500  
  優秀好手 750  
Microsoft Internet Explorer 6.0. Screen 1024x768 pixel. High Color (16 bit).
2000-2014 程式設計俱樂部 http://www.programmer-club.com.tw/
0.3115234