PIXNET Logo登入

程式狂想曲

跳到主文

這裡是程式的筆記,與對未來的狂想 分享,是學習的開始~

部落格全站分類:數位生活

  • 相簿
  • 部落格
  • 留言
  • 名片
  • 7月 16 週三 201416:52
  • .net Bitmap 圖檔放大 出現格子

一般來說  將圖檔放大時,影像會被做插值處理
當把圖檔放大,如果想看到 Pixel 呈現格狀,需要調整參數才有辦法
(系統內定是有做插值處理的)
 
(繼續閱讀...)
文章標籤

Rh 發表在 痞客邦 留言(0) 人氣(88)

  • 個人分類:GDI+
▲top
  • 1月 22 週六 201110:54
  • GDI+ 8bit 24bit 快速灰階處理

在8 bit 圖處理上  並沒有 RGB 的值可以計算 ,由於 8 bits 的圖像是 指標圖像(類似GIF)
只需要調整  調色盤,就可以快速變成灰階
以一張  100*100 8bit  的圖為例
        Dim colorPalette1 as ColorPalette
        Dim bmpalette As Bitmap = New Bitmap(100, 100, PixelFormat.Format8bppIndexed)
        colorPalette1 = bmpalette.Palette
        For i As Integer = 0 To 255
            colorPalette1.Entries(i) = Color.FromArgb(i, i, i)
        Next
      
這樣  就轉成灰階了
24bit 的,雖然用Lockbit後計算也很快,但圖檔一大,計算起來也是很恐怖,在實用上不夠好
這時可以用 ColorMatrix 來實作,速度就跟  8 bit的圖處理一樣快
(ps 24bit 沒有調色盤)
唯一需要的是  需要 2倍的記憶體
先設定等會要拿來處理的 資料型態 與 陣列
           
    Dim cm As System.Drawing.Imaging.ColorMatrix = New System.Drawing.Imaging.ColorMatrix(New Single()() _
                {New Single() {0.3, 0.3, 0.3, 0, 0}, _
               New Single() {0.59, 0.59, 0.59, 0, 0}, _
               New Single() {0.11, 0.11, 0.11, 0, 0}, _
               New Single() {0, 0, 0, 1, 0}, _
               New Single() {0, 0, 0, 0, 1}})
     Dim ia As System.Drawing.Imaging.ImageAttributes   = New System.Drawing.Imaging.ImageAttributes()
     ia.SetColorMatrix(cm)                                                                                                                                       '轉換灰階的資料型態
    Dim bm as Bitmap = New Bitmap("C:\test.bmp")                                                                                               '<---取得 24bit彩色圖
    Dim newBm as bitmap = New Bitmap( bm.Width, bm.Height, bm.PixelFormat)                                                  '<---設定一個一樣大小的 bitmap
    Dim g as Graphic = Graphic.FromImage(newBm)
    Dim rect as Rectangle = New Rectangle( 0,0, bm.width, bm .Height)                                                                 '<--設定要轉換圖片的大小
    '再來就把原來的圖  繪到  新的圖上  順便轉成灰階
     g.DrawImage( bm, rect, 0, 0, bm.width, bm.height, GraphicsUnit.Pixel, ia)                       
    轉灰階的速度比取出 一維陣列再來計算快多了
(繼續閱讀...)
文章標籤

Rh 發表在 痞客邦 留言(2) 人氣(2,824)

  • 個人分類:GDI+
▲top
  • 1月 22 週六 201110:11
  • GDI+ bitmap Lockbit(三) 轉換灰階

在 .Net 下 24bit bitmap 儲存  圖片的格式並不是大家熟悉的  RGB
儲存的方式是  BGR   剛好顛倒過來
如果要計算灰階
以 100 *100 的 24 bit 圖為例
Dim bits as integer = 100*100 * 3
Dim tempByte as byte
for i = 0 to 100-1
    for j = 0 to  bits -1 step 3
            
            B = bgrValue( j  + i * bits)
            G = bgrValue( j + 1 + i * bits)
            R = bgrValue( j + 2 + i * bits)
            tempByte = (B + G + R ) /3
            bgrValue( j  + i * bits)          = tempByte
            bgrValue( j + 1 + i * bits)    = tempByte
            bgrValue( j + 2 + i * bits)    = tempByte
    next
next
這樣就可以得到 此圖片的灰階 一維陣列
但如果是要比較精確的灰階  要改成
 tempByte = B * 0.114 + G * 0.587 + R * 0.299
只是如果圖片一大   灰階用這兩種計算都會被拖慢,尤其是  第二種方法
(繼續閱讀...)
文章標籤

Rh 發表在 痞客邦 留言(0) 人氣(490)

  • 個人分類:GDI+
▲top
  • 1月 22 週六 201109:48
  • GDI+ bitmap Lockbit(二)

當bitmap Lockbit 時 有三種屬性可以選擇
ImageLockMode.ReadWrite                可讀可寫
ImageLockMode.ReadOnly                 只可讀
ImageLockMode.WriteOnly                 只可寫
ps 第四種 UserInputBuffer 看不太懂........  )
在效能上  使用沒有感覺,只有使用的模式的差別
Lock bit後需要可以用  Marshal.Copy 倒出  陣列
倒出陣列後要計算每個pixel 的值   需要知道一開始的  PixelFormat
PixelFormat.Format24bppRgb       24/8 = 3 bytes
PixelFormat.Format16bppRgb       24/8 = 2 bytes
PixelFormat.Format8bppIndexed  8/8   = 1 bytes
如果一張 100*100 的 24bit 的圖
在一開始宣告陣列的長度  
Dim bits = 100*100 * 8  (共80000個)
Dim tempbitmap As Imaging.BitmapData = bmSnap.LockBits(rect, ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb)
System.Runtime.InteropServices.Marshal.Copy(tempbitmap.scan0, rgbValue, 0, bits)
bmSnap.UnlockBits(tempbitmap)
BitmapData 物件有幾個參數很好用
tempbitmap.Scan0        <---取得圖片記憶體指標(記憶體的第一個位置)
tempbitmap.Width        <---取得圖片的寬度
tempbitmap.Height       <---取得圖片的高度
tempbitmap.Stride        <---取得單Row 的寬度
.Stride  並不一定 =  width * bytes
(ps bytes = 圖片的 bit / 8 )
由於圖片記憶體每行儲存必須為 4的倍數
以25*25 24bit 為例
圖片單行    為 25*3 = 75 但不能被 4 整除   所以必須存 76  
所以此圖片的           .Stride = 76
但此圖片的     width*bytes = 75
(繼續閱讀...)
文章標籤

Rh 發表在 痞客邦 留言(0) 人氣(774)

  • 個人分類:GDI+
▲top
  • 1月 02 週日 201112:23
  • Bitmap 進階繪圖(二) 可移動 改變大小的圓

Circle1.JPG在上一篇  介紹完  可改變大小的直線後,這篇是進階版
上一篇有個問題 不能直接移動直線,但 直線不是我的重點,有興趣的人可以參考這篇的移動
 
 
(繼續閱讀...)
文章標籤

Rh 發表在 痞客邦 留言(5) 人氣(3,865)

  • 個人分類:GDI+
▲top
  • 1月 02 週日 201112:03
  • Bitmap 進階繪圖(一) 可移動 改變長度的 直線

Line1.bmp最近在工作上需要 用到 可移動的直線  與 可 改變的圓
網路上很多介紹可以用 API 畫,但我真的不想用  gdi32
也都沒找到 相關的介紹 或 範例,只好自己想辦法寫了一個
 
(繼續閱讀...)
文章標籤

Rh 發表在 痞客邦 留言(3) 人氣(2,895)

  • 個人分類:GDI+
▲top
  • 12月 30 週四 201021:52
  • GDI+ 繪圖方式比較 與 Graphicpath

在 .Net 環境下,GDI+ 是新的繪圖工具
繪圖模式主要有三種
1. 在物件上繪圖
2. 在bitmap 上繪圖在放入視窗物件
3. 存在Graphicpath後在繪製到Bitmap 放到視窗物件
在使用的方便上就如上面  依序 (字越多越不方便)
但在效能上  剛好反過來
第一種直接在物件上繪圖,是直接顯示給使用者,最簡單使用,但顯示效果最差(容易閃爍)
在Form 表單上的物件,如 buttom  picturebox,可直接在 plant  事件中執行
e.Graphic.drawLine(pen1,p1,p2)
第二種在Bitmap上繪圖,速度比較快,因為是先在 記憶體中處理好後才顯示出來
Dim bm as bitmap(500,600)
Dim g as Graphic  = Graphic.FromImage(bm)
g.drawLine(pen1,p1,p2)
picturebox1.backgroundimage = bm
第二種的優點是   可以對 畫布(Bitmap) 做一些處理,比如 灰階、二值化、放大縮小.........
如果只是做簡單繪圖是蠻方便的
 效能比我是用   畫一個太陽系  第一種直接畫在 picturebox 上,   第二種畫在Bitmap後 在存放到 Picturebox
以每秒畫30次  顯示太陽系的  公轉(由水星 到地球)  與月球繞地球轉
第一種雖然已經開啟 DoubleBuffer,但效果有限,第二種可以清楚看到  整個   公轉的狀況,所以評估 第二種直接在Bitmap上繪圖較優
(但缺點是 會比較吃記憶體)
第三種   就是 Graphicpath
就如同這功能的名, 繪圖的路徑。使用的概念如同一些繪圖軟體一樣,將要繪圖的 字  線   圖,將他們括印在記憶體
最後再一次畫出,主要針對 一次就要 顯示 或 重繪 多樣物件
這樣一方面比較省記憶體,一方面省去 繪圖的時間   (繪圖10次   變成   最後一次畫上去就好)
要先引用  System.Drawing.Drawing2D
程式碼片段
               Rect = new Rectangle(O.X - l / 2, O.Y - l / 2, l, l)
               mp[0].move(new Point(O.X, O.Y - l / 2))
               mp[1].move(new Point(O.X - l / 2, O.Y))
               mp[2].move(new Point(O.X + l / 2, O.Y))
               mp[3].move(new Point(O.X, O.Y + l / 2))
              
                Dim gp as GraphicPath= new GraphicsPath()
             
                gp.AddEllipse(Rect)
                gp.AddRectangle(mp[0].rect)
                gp.AddRectangle(mp[1].rect)
                gp.AddRectangle(mp[2].rect)
                gp.AddRectangle(mp[3].rect)
                g.DrawPath(pen1,gp)
                picturebox1.backgroundimage = bm
本來要分五次畫     (畫1個圓  與 5個框)
改成用 Graphicpath  一次就畫好了
(繼續閱讀...)
文章標籤

Rh 發表在 痞客邦 留言(0) 人氣(3,139)

  • 個人分類:GDI+
▲top
  • 12月 26 週日 201013:40
  • GDI+ Bitmap(一) LockBit

在 VB.Net 下 可以利用指標加陣列 取出 圖檔裡的資料
運用:要二值化圖檔
step1 Lockbit 圖檔
step2 取得指標   temp.scan0  
step3 copy
step4 解除lockbit

首先  
imports system.Drawing
imports system.Drawing.imaging
Dim bmtemp as bitmap = image.Fromfile("C:\.........")
Dim bits as integer = bmtemp.weight*bm.Height *3       <---取得圖檔元素     目前定此圖檔是 24bits 的圖
Dim rgbValue(bits -1 ) as byte                                         <---等會要儲存的空間
Dim rect as Rectangle = new Rectangle(0,0,bmtemp.weight,bmtemp.Height)
Dim temp as BitmapData = bmtemp.Lockbit(rect,image,ReadOnly,bmtem.pixelFormat)   <---Lockbit
System.Runtime.InteropServices.Marshal.Copy(temp.scan0,rgbvalue,0,bits)        <--取得指標後   由第1個 到 bits 個  copy到  rgbValue()
bmtemp.unlockBits(temp)


如此  就可以把 圖檔裡 的每個pixel copy 進陣列      速度會比 getpixel 速度快很多



(繼續閱讀...)
文章標籤

Rh 發表在 痞客邦 留言(0) 人氣(667)

  • 個人分類:GDI+
▲top
  • 8月 03 週二 201022:24
  • Color Matrix

前一陣子看到這篇,跳了過去,但就是因為這樣讓自己轉了很大的一個彎
喔 應該說是跑到月球又跑了回來 -.-!!
利用矩陣的方式將色彩轉換
[R,G,B,A,1] X | 1 0 0 0 0|
| 0 1 0 0 0|
(繼續閱讀...)
文章標籤

Rh 發表在 痞客邦 留言(0) 人氣(249)

  • 個人分類:GDI+
▲top
  • 7月 28 週三 201017:27
  • 由記憶體取圖

這兩天在弄 uEye CCD 終於成功了,但也告訴我必須要放棄
由於用的CCD是黑白的CCD,如果是彩色那還沒問題,但問題是黑白
在VB.net中提供的Bitmap的格式並沒有8 Byte的灰階 只有 8byte 指標的256色
由記體體中取出的資料是沒問題的
由uEye提供的Function取得指標
(繼續閱讀...)
文章標籤

Rh 發表在 痞客邦 留言(1) 人氣(1,111)

  • 個人分類:GDI+
▲top
12»

個人資訊

Rh
暱稱:
Rh
分類:
數位生活
好友:
累積中
地區:

參觀人氣

  • 本日人氣:
  • 累積人氣:

程式碼

熱門文章

  • (27,567)Form Show 與 ShowDialog 的比較
  • (6,188)XML 與 Linq 的結合一 之Xelement
  • (3,525)With 與 美化DataGridView
  • (2,851)List 資料的查詢 用 Find 方法
  • (6,503)委派其實很簡單(二)---跨執行緒
  • (1,122)Interface 與 DLL 動態聯結運用
  • (1,083)修改 Form表單上的物件的形狀
  • (3,434).Net 2010 遇到導入Dll 錯誤-混合模式組件是針對版本 'v2.0.50727' 的執行階段建置
  • (10,127)Halcon 學習(ㄧ)
  • (478)Datagridview Row Heade 設定文字 與 消除 選擇三角

文章分類

  • SQL (1)
  • Halcon (5)
  • 電腦應用 (3)
  • 影像處理 (3)
  • 影像處理 (7)
  • VC++ (1)
  • 生活狂想 (5)
  • C#.NET and VB.NET (51)
  • GDI+ (11)
  • Jsp Servlet 專題 (1)
  • Excel (1)
  • 程式狂想 (5)
  • 未分類文章 (1)

最新文章

  • MIT Yolo V9 rd 使用:三、強化訓練參數設定
  • MIT Yolo V9 rd 使用:二、影像訓練
  • MIT Yolo V9 rd 使用:一、 Anaconda 環境設定
  • Windows 11 (Win11) 設置 Visual studio 默認以管理者權限啟用
  • WIFI DHCP 的DNS異常
  • VMware 無法使用鍵盤處裡
  • 七夕求人緣桃花
  • 台灣房價開始起跌 (青壯年人口與結婚人數會影響買房的需求) II
  • Halcon 形狀物件特性
  • 多點手眼標定

文章搜尋