2013/12/18

Embed Javascript in Blogger



在Blogger 裡面加入JavaScript 的想法
找了很多的方法,終於完成了

這邊主要分成兩個部分
1.將JavaScript找一個網路空間放置
2.將 JavaScript(html) 嵌入 Blogger

第一個部分花了點時間去尋找
主因是因為不想要花錢.....

後來找到Dropbox 跟Site44的結合
就可以顯示靜態網頁(也可以放入JavaScript)

教學網址:
Site44:讓你在 Dropbox 免費雲端空間上架設網頁

設定完成之後,在Dropbox裡面就初出現以下的路徑
這邊就可以放想放的網頁了




第二個部分比較簡單
只要使用 iframe 的標籤就可以將其他的網頁嵌到Blogger裡面了

frameborder -> 邊框
height -> 高度
width -> 寬度
src -> URL 來源

<iframe frameborder="0" height="380" src="//mrj.site44.com/LeafLet/leaflet.htm" width="570"></iframe>

將上面區塊程式碼的內容貼到Blogger的HTML模式中




2013/11/1

[PowerShell] cannot be loaded because the execution of scripts is disabled on this system - Server 2008 R2

最近在研究PowerShell,在執行的時候遇到了一些問題
直接打開PowerShell執行 xxx.ps1 的Script是可以正常運作的
但是要使用C# 去呼叫寫好的 xxx.ps1就會發生問題了

xxx.ps1 檔案無法載入,因為這個系統上已停用指令碼執行。如需詳細資訊,請參閱 \"get-help about_signing\"。"}

英文版

xxx.ps1 cannot be loaded because the execution of scripts is disabled on this system.

依照他的提示打指令"get-help about_signing"看了一下 
PowerShell有些執行上的政策去限制了檔案(.ps1)的執行

有四種執行的政策

Restricted - 限制任何的.ps1的執行....這是預設值

AllSigned - 要執行的.ps1都要經過信任者的簽名發行

RemoteSigned - 這是允許存取本機電腦上.ps1,但是透過網路去存取的就不行

UnRestricted - 完全不限制.ps1的執行
指令"Get-ExecutionPolicy" 可以取得目前的政策狀況
如果是自己寫的.ps1應該是 RemoteSigned 的權限就可以執行了
指令"Set-ExecutionPolicy RemoteSigned" 可以去更改執行政策



如畫面顯示我的執行政策已經是 UnRestricted 但是還是出現一樣的錯誤

後來才發現我使用的作業系統是 Server 2008 R2
同時會存在著 X86 和 X64兩種版本
需要檢查兩個版本是否都是可以執行的權限

X86的路徑
C:\Windows\system32\cmd.exe



X86的執行政策是 UnRestricted

接下來檢查X64的設定
C:\Windows\SysWOW64\cmd.exe

就會發現X64的執行政策是 Restricted,難怪一直都不能執行!!!
只要修改X64的政策就能執行了


這個問題困擾了我一陣子,經過這一次的經驗
下次在處理Server的問題時,就會多注意到X64和X86的版本問題

從失敗中學經驗~~

參考資料:
http://stackoverflow.com/questions/4037939/powershell-execution-of-scripts-is-disabled-on-this-system

2013/10/31

[PowerShell] get-wmiobject invalid class - 模組多次Import 錯誤

最近在研究使用PowerShell 跟Hyper-V 互動
寫了一個 Script(.ps1)去建立&設定VM

Import-Module hyperv

$newvm = "JJ_VM1-3"
$vhdpath="C:\Users\Public\Documents\Hyper-V\Virtual hard disks\jj1-3.vhd"
$cpu=2
$memsize=1024
$memlimit=2048
$vmVirtualSwitch="Test2"


New-VM $newvm

Add-VMDisk -VM $newvm -Path $vhdpath 0 0

Set-VMCPUCount -VM $newvm -CPUCount $cpu 

Set-VMMemory -VM $newvm -Memory $memsize

Add-VMNic -VM $newvm -VirtualSwitch $vmVirtualSwitch

就可以成功的建立VM了

但是要再次執行時就發生了問題....
就會出現下面的錯誤訊息

Get-WmiObject : Invalid class

想說奇怪剛剛不是好好的嗎??
同樣的程式卻不能執行兩次...
重複試了很多次,還是出現相同的錯誤

最後關掉了PowerShell的視窗,重新開一個
執行Script,又成功建立VM了
但是當我要在執行第二次的時候又出現了相同的錯誤...

重複試了幾次只要是開視窗的第一次執行
都可以成功,後面就都會出現錯誤訊息了




仔細看了一下錯誤的訊息,好像是找不到模組
可是我的Script 的第一行不就 Import-Module
如果沒有Import 第一次也不會成功阿....

找很久之後終於找到了答案
原來是模組多次 Import造成這樣的問題....
以為頂多是 On 跟 Off 狀態而已

但是看看錯誤訊息跟上一篇沒有 Import模組的不一樣
一旦重複 Import之後就回不去了....只能重開視窗了

那有什麼方法可以避免重複 Import呢??

if(!(get-module hyperv))
{
   import-module hyperv
}
其實只要改成要Import前,先判斷模組是否已經存在了
如果沒有的話再Import,這樣就沒問題了


參考資料:
http://pshyperv.codeplex.com/discussions/230371

2013/10/30

[PowerShell]使用 PowerShell 來操控 Hyper-V

最近開始接觸到了Hyper-V,想著要如何去做到自動化的功能(建立VM等....)
找些網路上的文章有使用 PowerShell 和 C#
最後考量到 PowerShell 的彈性比較大,所以選用

我使用的是 Windows Server 2008 R2, 上面搭載Hyper-V 2.0 的版本
但是我手邊的參考書都是 Windows Server 2012 使用的都是 Hyper-V 3.0
書上沒有特別強調要去安裝設定 PowerShell ,我就以為 Windows Server 2008 R2也不用設定
但是在打第一句指令的時候就出錯了....

Get-VM 這個指令是取得機器上有那些VM


上網找了資料才發現原來還要替 PowerShell安裝 Hyper-V的套件才能使用

下載解壓縮之後,找到 install.cmd 用系統管理員的身分去執行


在安裝的過程會出現兩個錯誤,但是不會造成影響

接著會要確認登錄編輯程式,就按"是"



接著會跳出一個視窗就可以打 Get-VM 這個指令
就會跳出機器上的VM了

以為這樣就可以使用了,關掉視窗之後再打開就還是不行....
後來才發現使用之前 Import-Module ,但是還是出錯了...
奇怪剛剛登錄程式不是有按"是"...

後來知道要經過重開機之後才會重新登錄程式
也才找的到Hyper-V 的 Module


這時候Get-VM 這個指令就可找出VM了


這是我第一次接觸PowerShell & Hyper-V
所有的資訊都是Google來的,只是在這邊留個紀錄
我遇到了這個問題並且解決了這個問題

參考資料:

2013/10/6

[c#] 錄音程式

先前有寫到有使用WebCam錄影的功能
但是錄製的影片只有影像沒有聲音的
想要加入聲音,但是研究後發現 EmguCV無法加入聲音
而且只支援.avi格式的限制

所以就先來個寫個錄音的小程式
之後再來做整合

首先先拉畫面
有三個按鈕 "錄音"、"結束"、"播放"
接著是下面的 WindowsMediaPlayer的元件
這邊會遇到一些小問題,可能會在工具箱裡面找不到
在工具 -->選擇工具箱項目  可以設定

選擇 COM元件 ,將 Windows Media Player打勾

之後在工具箱裡就可以找到了



接著就可以開始寫程式碼了
這邊遇到一個新的東西 -- DllImport
稍微研究一下是說要使用第三方非在管理範圍中DLL的方法
還沒有完全研究完,等之後有比較清楚再進行補充

        //使用非託管(Unmanaged)的DLL
        [DllImport("winmm.dll", EntryPoint = "mciSendString", CharSet = CharSet.Auto)]
        public static extern int mciSendString(
         string lpstrCommand,
         string lpstrReturnString,
         int uReturnLength,
         int hwndCallback
        );

mciSendString 是用來播放多媒體資料的API
參考文獻

開始錄音,有一些的參數設定
可以依據需求去調整
        //開始錄音
        private void button1_Click(object sender, EventArgs e)
        {
            mciSendString("set wave bitpersample 8", "", 0, 0);
            mciSendString("set wave samplespersec 20000", "", 0, 0);
            mciSendString("set wave channels 2", "", 0, 0);
            mciSendString("set wave format tag pcm", "", 0, 0);
            mciSendString("open new type WAVEAudio alias movie", "", 0, 0);
            mciSendString("record movie", "", 0, 0);

            button1.Enabled = false;
            button2.Enabled = true;
        }

結束錄音時,將檔案存在我們定義的路徑跟檔名
//結束錄音
        private void button2_Click(object sender, EventArgs e)
        {
            //檔案存放的路徑
            fileName = string.Format("{0}{1}{2}", voiceDirectory, DateTime.Now.ToString("yyyyMMddHmmss"), ".avi");

            mciSendString("stop movie", "", 0, 0);
            mciSendString("save movie " + fileName, "", 0, 0);  
            mciSendString("close movie", "", 0, 0);

            button1.Enabled = true;
            button2.Enabled = false;
            button3.Enabled = true;
        }



之後我們可以播放一下剛剛的錄音檔
看錄製的效果如何
//播放錄音檔
        private void button3_Click(object sender, EventArgs e)
        {
            if (!playing)
            {
                playing = true;
                button3.Text = "停止";
                //播放錄製的檔案
                this.axWindowsMediaPlayer1.URL = fileName;
                axWindowsMediaPlayer1.Ctlcontrols.play();
            }
            else
            {
                axWindowsMediaPlayer1.Ctlcontrols.stop();
                playing = false;
                button3.Text = "播放";
            }  
        }

這樣就可以達成簡單的錄音程式
如果要陽春一點,這邊就可以跟之前的WebCam錄影程式整合
雖然會是影像跟音效檔分開,但是只要在程式裡面使用兩個WindowsMediaPlayer的元件
就可以同時有影像跟聲音了....

但是這使用上還是很不方便
之後再來研究有沒有更完整的方法吧

DEMO

2013/9/7

[C#] 動態產生文字圖片(Generated Image dynamic text)& 圖片疊加(Image Overlap)

在之前的例子中使用 WebCam QRCode Reader
在成功擷取圖片之後,會把圖片擷取下來
想說如果存下來的照片能有解碼的結果會更好



這邊需要兩個功能
一個是要能動態產生文字圖片 (Generated Image dynamic text)
一個是將兩張圖片做疊合 (Image Overlap)

有關對圖片做編輯或是其他相關的設定都是使用
Graphics 這個類別
要動態產生文字圖片其實很簡單
首先先準備一張底圖 (Background.png)

其實也可以依據各人喜歡在底圖上做些變化

        /// <summary>
        /// 動態在背景上Key上文字
        /// </summary>
        /// <param name="str"></param>
        /// <returns></returns>
        private Image GenerateFontMark(string str)
        {        
            //取得背景的底圖
            string path = _phtoDirectory + "Background.png";
            //讀取圖片
            System.Drawing.Image imgSrc = System.Drawing.Image.FromFile(path);

            using (Graphics g = Graphics.FromImage(imgSrc))
            {
                g.DrawImage(imgSrc, 0, 0, imgSrc.Width, imgSrc.Height);
                //文字要使用的字體及文字大小
                using (Font f = new Font("宋體", 13))
                {
                    using (Brush b = new SolidBrush(Color.Yellow))
                    {
                        //在圖片上加上文字
                        //(要加入的文字,字體,X軸位置,Y軸位置)
                        g.DrawString(str, f, b, 5, 5);
                    }
                }
            }

            return imgSrc;
        }

呼叫上面的Function就可以動態的產生文字圖片了

先來講對圖片縮放的小技巧
原本以為會很難,其實只要一行就可以改變圖片的大小
這邊縮小圖片是為了讓產生的圖片有邊框的效果

                //縮小照片尺寸
                //(要縮小的照片,寬度(Width),高度(Height))
                Image newPic = new Bitmap(frame.ToBitmap(), 630, 440);

做好底圖之後接著就是把拍下的結果疊在一起了

        private void GenerateWaterMark(Image tempPic, string result)
        {
            //在背景圖片中加上文字
            System.Drawing.Image imgSrc = GenerateFontMark(result);
            //要疊在上層的圖片
            System.Drawing.Image imgWarter = tempPic;

            //進行圖片的疊加 
            using (Graphics g = Graphics.FromImage(imgSrc))
            {
                //要疊的是哪張圖片
                g.DrawImage(imgWarter, 
                    //上層圖片從底圖的哪個位置開始疊(X,Y)
                    new Rectangle(5,35,imgWarter.Width,imgWarter.Height),
                    0, 0, imgWarter.Width, imgWarter.Height, GraphicsUnit.Pixel);
            }

            imgSrc.Save(_fileName);
        
        }

結果就是這樣


當然也可以用在之前產生 QRCode Generator
在產生QRCode時,把想要顯示的訊息一併列出來


DEMO

2013/9/4

[C#] WebCam QRCode Reader

之前的文章寫到使用WebCam錄影拍照  和 QRCode Reader
有這兩個基礎的功能,我們很容易就可以把WebCam 變成 QRCode Reader


一開始先做畫面
先拉一個button,label,pictureBox
在button的處裡事件裡面寫
開啟攝影機和Timer
這是WebCam錄影拍照  的一些方法
        private void button1_Click(object sender, EventArgs e)
        {
            openWebCam();
            _timer.Start();
        }

觸發Tiemr之後就每0.1秒擷取畫面一次
將畫面顯示在 pictureBox 中
並且將擷取的畫面丟給QRCode Reader去解碼
當成功讀到QRCode時,將當時的影像儲存下來
        private void TimerEventProcessor(object sender, EventArgs e)
        {
            Image<Bgr, Byte> frame = cap.QueryFrame(); // Query 攝影機的畫面

            pictureBox1.Image = frame.ToBitmap(); // 把畫面轉換成bitmap型態,在丟給pictureBox元件

            //宣告 QRCode Reader 物件
            ZXing.IBarcodeReader reader = new ZXing.BarcodeReader();
            // bitmap = (System.Drawing.Bitmap)System.Drawing.Bitmap.FromFile(@"D:\Test\QRCode\temp.png");

            //將攝影影擷取的畫面直接丟進Reader 進行解碼
            ZXing.Result result = reader.Decode(frame.ToBitmap());

            if (result != null)
            {   //如果有成功解讀,則顯示文字

                //在Thread裡面不能直接跟控制項(Text)互動,所以使用委派(Delegate)的方式
                this.Invoke(new InvokeFunction(this.TrueFunction), new object[] { result.Text });

                //將解讀成功的影像存下來
                //儲存路徑
                _fileName = string.Format("{0}{1}{2}", _phtoDirectory, DateTime.Now.ToString("yyyyMMddHmmss"), ".PNG");

                //儲存影像
                frame.Save(_fileName);
            }
        }

當成功讀到QRCode的同時也顯示在畫面上
這邊就要使用委派(Delegate)的方式

        private delegate void InvokeFunction(string msg); 

        private void TrueFunction(string msg)
        {
            //顯示QRCode訊息
            this.label1.Text = msg;
        } 

之後到 D:\Test\QRCode
就可以發現成功讀取時的影像了

討論:
我使用的攝影機是只有500萬畫素沒有自動對焦的WebCam
一開始在測試時都讀不到QRCode,後來慢慢測試各種距離才發現
只有大概在距離60公分左右才讀的到...

當然每一款攝影機的焦距都不一樣,所以就要多試幾次吧
但是如果有自動對焦的WebCam效果應該很好吧

DEMO

2013/8/29

[C#] QRCode Generator & Reader

現在很多海報、廣告等文宣上面角落都會放一個QRCode(二維條碼)
方便智慧型手機讀取資料及連結網站

QRCode 當初的設計就是希望能方便被讀取,希望節省輸入的時間
裡面最多可以藏入1800個中文字,可以提供的服務就相當廣泛....

QRCode 編碼&解碼方式其實沒有什麼機密
很多元件都已經都寫好,就因為是這樣才能廣泛的被利用





使用之前要先下載一個開放的函示庫(DLL) "Zxing"
解壓縮之後找到適合開發環境的版本
在裡面就可以看到 zxing.dll ,這這個檔案複製到開發的專案中

接著打開 Visual Studio 加入參考

這樣就設定完成了
接下來就可以開始寫程式了...(當然是要先拉一下畫面拉)

        private void button1_Click(object sender, EventArgs e)
        {
            System.Drawing.Bitmap bitmap = null;
            //要轉成QRCode 的內容
            string content = textBox1.Text;
            //QRCode的設定
            ZXing.BarcodeWriter writer = new ZXing.BarcodeWriter
            {
                Format = ZXing.BarcodeFormat.QR_CODE,
                Options = new ZXing.QrCode.QrCodeEncodingOptions
                {
                    //產生出圖片的高度
                    Height = 180,
                    //產生出圖片的寬度
                    Width = 180,
                    //文字是使用哪種編碼方式
                    CharacterSet = "UTF-8",

                    //錯誤修正容量
                    //L水平    7%的字碼可被修正
                    //M水平    15%的字碼可被修正
                    //Q水平    25%的字碼可被修正
                    //H水平    30%的字碼可被修正
                    ErrorCorrection = ZXing.QrCode.Internal.ErrorCorrectionLevel.H

                }
            };
            //將要編碼的文字產生出QRCode的圖檔
            bitmap = writer.Write(content);
            //儲存圖片
            bitmap.Save(@"D:\Test\QRCode\temp.png", System.Drawing.Imaging.ImageFormat.Png);
            //顯示在畫面中
            pictureBox1.Image = bitmap;
        }

到這邊就可以產生出QRCode的圖檔了

編碼跟產生檔案很簡單就完成了
有發現產生的QRCode的複雜程度會跟裡面包含的文字長度成正比嗎?

解碼也一樣很簡單

        private void button2_Click(object sender, EventArgs e)
        {
            System.Drawing.Bitmap bitmap = null;
            //宣告 QRCode Reader 物件
            ZXing.IBarcodeReader reader = new ZXing.BarcodeReader();

            //讀取要解碼的圖片
            FileStream fs = new FileStream(@"D:\Test\QRCode\temp.png", FileMode.Open);
            Byte[] data = new Byte[fs.Length];
            // 把檔案讀取到位元組陣列
            fs.Read(data, 0, data.Length);
            fs.Close();
            // 實例化一個記憶體資料流 MemoryStream,將位元組陣列放入
            MemoryStream ms = new MemoryStream(data);
            // 將記憶體資料流的資料放到 BitMap的物件中
            bitmap = (Bitmap)Image.FromStream(ms);

           //將圖片顯示於 PictureBox 中
            pictureBox2.Image = bitmap;
            //進行解碼的動作
            ZXing.Result result = reader.Decode(bitmap);
            
            if (result != null)
            {   //如果有成功解讀,則顯示文字
                label1.Text = result.Text;
            }
        }

在讀取圖檔的時候有遇到一些問題
原本讀取的寫法是
bitmap = (System.Drawing.Bitmap)System.Drawing.Bitmap.FromFile(@"D:\Test\QRCode\temp.png");

這樣的寫法在讀取後要再產生新的圖片就會發生錯誤


研究了一下發現Image還在開啟的狀態,不能進行寫入的動作
所以一開始將圖片讀出來放到Memory就可以了

參考文獻: http://blog.miniasp.com/post/2009/05/30/A-generic-error-occurred-in-GDI-plus.aspx

很簡單就可以自己製作QRCode吧
雖然Google上可以找到很多工具可以使用
但是還是自己做比較有FU~~

下次就可以連結攝影機來解讀QRcode了!!

DEMO

2013/8/26

[C#] 使用WebCam 錄影(Record video)&拍照(Take picture)


之前的文章講到如何取得WebCam影像
現在我做了些修正,加入了錄影(Record video)&拍照(Take picture)的功能



首先我使用Timer 替換掉之前的 Application_Idle 的Function
原因是使用原本的Application_Idle在錄影的過程中
畫面上PictureBox不會跟著更新

private void TimerEventProcessor(object sender, EventArgs e)
        {
            Image<Bgr, Byte> frame = cap.QueryFrame(); // Query 攝影機的畫面

            pictureBox1.Image = frame.ToBitmap(); // 把畫面轉換成bitmap型態,在丟給pictureBox元件

            //錄影模式
            if (_isRecording)
            {
                //將影格寫入影片中
                video.WriteFrame<Bgr, byte>(frame);
            }
        }

之前的範例一開始就會自動啟動WebCam
只有顯示影像的功能
但是這次的範例就有三個功能(顯示影像、錄影、拍照)
都會去初始化攝影機,所以就抽出來寫成一個Function

        /// <summary>
        /// 開啟攝影機
        /// </summary>
        private void openWebCam()
        {
            //如果webcam沒啟動
            if (cap == null)
            {
                try
                {
                    //打開預設的webcam
                    cap = new Capture();
                }
                catch (NullReferenceException excpt)
                {
                    MessageBox.Show(excpt.Message);
                }
            }
        
        }

顯示影像的功能跟上個範例差別不大
只是多了按鈕去觸發而已

        private void button1_Click(object sender, EventArgs e)
        {
            openWebCam();

            //webcam啟動
            if (cap != null)
            {
                //frame啟動
                if (_captureInProgress)
                {
                    //stop the capture
                    _captureInProgress = false;
                    button1.Text = "開啟";
                    _timer.Stop();
                }
                //frame關閉
                else
                {
                    //start the capture
                    _captureInProgress = true;
                    button1.Text = "關閉";
                    _timer.Start();
                }
            }
        }

接著是在畫面新加入錄影和停止的按鈕
錄影的觸發事件一開始就是啟動Timer
決定好存放路徑跟檔名
New 一個 Video Object 出來
將_isRecording的Flag 設為True
這樣在Timer 裡面就會把擷取到影格寫入影片檔中

        private void button2_Click(object sender, EventArgs e)
        {
                openWebCam();

                _timer.Start();

                _fileName = string.Format("{0}{1}{2}", _movieDirectory, DateTime.Now.ToString("yyyyMMddHmmss"), ".avi");

                //cap.Width 取得攝影機可支援的最大寬度
                //cap.Height 取得攝影機可支援的最大高度
                video = new VideoWriter(_fileName, 0, 10, cap.Width, cap.Height, true);

                //開啟錄影模式
                _isRecording = true;

        }

當按下停止時
將_isRecording的Flag 設為False
Timer就不會再寫入影片了
這樣簡單就完成影片的製作了

private void button3_Click(object sender, EventArgs e)
        {            
            //錄影完需將影像停止不然會出錯
            _isRecording = false;
            video.Dispose();

        }

拍照功能也很簡單
先在畫面拉一個拍照的按鈕
決定好存放路徑跟檔名
呼叫Image的Save Function
也是輕鬆完成拍照的功能

        //拍攝照片
        private void button4_Click(object sender, EventArgs e)
        {
            openWebCam();

            // Query 攝影機的畫面
            Image<Bgr, Byte> phtoFrame = cap.QueryFrame();

            //儲存路徑
            _fileName = string.Format("{0}{1}{2}", _phtoDirectory, DateTime.Now.ToString("yyyyMMddHmmss"), ".JPG");

            //儲存影像
            phtoFrame.Save(_fileName);
        }

忘了說兩個變數
一個是影片的存放位置
一個是照片的存放位置

        string _movieDirectory = @"d:\Test\movies\";
        string _phtoDirectory = @"d:\Test\photos\";

因為偷懶沒有自動建立資料夾的程式,想用的人可能自己建喔

DEMO

2013/8/25

在Blogger分享程式碼區塊(code block)

上一篇的文章之中有貼上一些程式碼
但是只能貼上圖片....看起來很奇怪也不方便使用
同時也看到別人網誌上的程式碼都可以放得很漂亮
所以就來研究一下怎麼在Blogger 上加入程式碼區塊(code block)

首先登入Blogger
到管理者的頁面

範本 --> 自訂

選擇進階 -->新增 CSS --> 在右邊空白處填入下列的程式碼   --> 套用置網誌

CODE {
display: block; /* fixes a strange ie margin bug */
font-family: Courier New;
font-size: 8pt;
overflow:auto;
background: #f0f0f0 url(http://klcintw.images.googlepages.com/Code_BG.gif) left top repeat-y;
border: 1px solid #ccc;
padding: 10px 10px 10px 21px;
max-height:200px;
line-height: 1.2em;
}


這樣算是設定完成了

在寫文章的過程中,遇到要插入程式碼區段的時候
要切換到 HTML 模式
再加入之前要用 HTML Eecode
將特殊字元轉換成HTML的格式
在程式碼的前後加上<code>程式碼</code>標籤



CODE { display: block; /* fixes a strange ie margin bug */ font-family: Courier New; font-size: 8pt; overflow:auto; background: #f0f0f0 url(http://klcintw.images.googlepages.com/Code_BG.gif) left top repeat-y; border: 1px solid #ccc; padding: 10px 10px 10px 21px; max-height:200px; line-height: 1.2em; }
就會出現文字區塊了
但是好像不能排版換行
找了一些文章之後發現....
有個簡單的方式就可以做到程式碼區塊了......(寫到一半才發現)

其實是可以不用作上面圖片中去修改 CSS
只要連到這個網站  http://formatmysourcecode.blogspot.com/
將你的程式碼貼上去,他就會轉出HTML的語法
以及呈現的效果
 接著將轉出來的內容直接貼到 Blogger 的 HTML模式底下就可以了

切回去選寫模式就會長這樣

第二個方法真的是相當的方便
為了留下學習的紀錄還是將第一個方法(修改 CSS)記錄下來



CODE {
display: block; /* fixes a strange ie margin bug */
font-family: Courier New;
font-size: 8pt;
overflow:auto;
background: #f0f0f0 url(http://klcintw.images.googlepages.com/Code_BG.gif) left top repeat-y;
border: 1px solid #ccc;
padding: 10px 10px 10px 21px;
max-height:200px;
line-height: 1.2em;
}

2013/8/21

[C#] 取得WebCam影像

突然心血來潮想要 WebCam 來做一些實驗
上網找一下資料發現C# 可以很容易就可以取得WebCam的影像

要使用Emgu這個套件
EmguCV 封裝了 OpenCV image processing library,允許在.Net的平台上使用

首先下載並安裝 ( libemgucv-windows-x86-2.3.0.1416.exe )
http://sourceforge.net/projects/emgucv/files/emgucv/2.3.0/libemgucv-windows-x86-2.3.0.1416.exe/download

軟體備份

安裝步驟其實就是一直點下一步

點開執行檔的畫面  --> 下一步


License 說明 -->我接受

選擇要安裝的位置 ,可以使用預設也可以自訂安裝路徑
但是要記得裝在哪裡,因為等一下設定環境變數時要用
選好之後 --> 下一步

建立程式的捷徑名稱  -->下一步

選擇要安裝的原件  --> 安裝
一般都是使用預設的設定,如果有其他需求再自行調整

接著就開始安裝了

過程中會問說是否要加入 Debugger 到 VS(Visual Studio 2010) 中 -->是

安裝完成之後要修改環境變數
如果使用預設應該 C:\Emgu\emgucv-windows-x86 2.3.0.1416\bin
如果剛剛安裝是選用自訂路徑,這邊就要跟著調整

環境變數 -> Path -> 編輯
在變數值欄位加入 Emgu的安裝路徑,記得前後面要用分號(;)隔開


到目前為止Emgu算是安裝設定完成了
接下來是如何把 Emgu 加入到 VS 中了

將 Emgu.CV.UI.dll 加入工具箱內
工具 -->選擇工具箱項目


.NET FrameWork 元件 --> 瀏覽
選擇 C:\Emgu\emgucv-windows-x86 2.3.0.1416\bin\Emgu.CV.UI.dll
如果安狀選自訂路徑,這邊也要跟著調整
按下開啟舊檔之後,會出現 Histogrambox 工具箱的選項  -->確定

完成之後到工具箱看有沒有出現下圖紅框裡的四個元件
有的話表示安裝成功了


在執行的專案裡面加入所需要的dll


瀏覽 -->C:\Emgu\emgucv-windows-x86 2.3.0.1416\bin\
選擇 "Emgu.Util.dll" "Emgu.CV.dll" "Emgu.CV.ML.dll" "Emgu.CV.UI.dll" 
如果安裝時自訂路徑,這邊要跟著修正路徑
加入成功之後


還會使用兩個opencv 的dll
opencv_core231.dll
opencv_highgui231.dll

可以在 C:\Emgu\emgucv-windows-x86 2.3.0.1416\bin 裡面找到
如果安裝時自訂路徑,這邊要跟著修正路徑
因為無法參考這兩個dll,所以只能手動放入

放到所要執行專案底下的 bin\Debug


接著就可以來寫個簡單的程式來連接WebCam了
我是使用Window Form來實作
先在設計頁面拉進一個 PictureBox
並命名為 pictureBox1

加入引用會使用到的dll


宣告 WebCam 物件

在建構式中將 WebCam物件連結到攝影機
 抓取畫面事件


執行應該就可以看到畫面了



如果遇到  'Emgu.CV.CvInvoke' 的型別初始設定式發生例外狀況。 的錯誤

在專案的屬性設定裡面將平台目標設為 X64 應該就可以執行



DEMO