星期四, 4月 24, 2014

[VC6] 變更 DLL 名稱

要改變 DLL 檔的檔名除了在 [Link] -> [Category:General] -> Output file name 改名稱以外。
   如果編譯後出現 LNK4770 的錯誤,則需要手動更改 MyDll.def 檔中的 LIBRARY,將後面改為需要的輸出檔名。 之後再編譯即可得到對應的 lib 與 dll 檔。








星期六, 4月 19, 2014

[Qt] 編譯 libqxt on Qt5


   前言:因為某個專案需要用到 libqxt,且因為我先安裝了 Qt 5.2.1,所以如何將 libqxt 加入到專案裏著實讓我困擾了一陣子。找了很久才終於讓我找到 編譯 libqxt 的方法,也讓專案順利編譯出來。

為什麼這麻煩的原因在於 libqxt 原先只支援 Qt4 而不支援 Qt5,因此要使用在 Qt5上一定要重新編譯。編譯方法主要參考 How to Use LibQxt with Qt Creator 這篇文章,另外在專案修改的部份則參考 Handling_CSV ,此文也可在前面的文章中連結到。

環境: Qt5.2.1 on Windows 7 32bit

以下為 How to Use LibQxt with Qt Creator 中的編譯方法簡介:

1. 首先至 libqxt 官網下載 master 分支。下載頁  直接下載Master.zip

2. 解壓縮後建議更改目錄檔名為 libqxt-qt5 並將其與 Qt5.2.1 一起放置在 Qt 目錄下,如下圖。
這樣作的好處是之後容易識別。因為原先的目錄名稱後面為一串無法閱讀的編碼 。


3. 確定 qmake 與 mingw32-make的執行目錄,被寫在系統環境變數 PATH 中 。在我的環境中分別為 C:\Qt\Qt5.2.1\5.2.1\mingw48_32\bin C:\Qt\Qt5.2.1\Tools\mingw48_32\bin
接著在 libqxt-Qt5 的目錄中,按住 shift 鍵,滑鼠右鍵點擊目錄空白處。在出現的功能選單中,選擇 在此處開啟命令視窗 ,接著在命令視窗中,依序鍵入下列指令。
    
    (1) configure.bat
    (2) mingw32-make

如下圖所示
    building-libqxt

 然後等個數分鐘。libqxt 就編譯完了 。

4. 然後分別將以下目錄中的 所有.h 檔(即標頭檔)從前面的目錄複製到後面的指定目錄。如下所示:

  • C:\Qt\libqxt-Qt5\src\bdb          -> C:\Qt\libqxt-Qt5\include\Qxtbdb
    C:\Qt\libqxt-Qt5\src\designer  -> C:\Qt\libqxt-Qt5\include\QxtCore
    C:\Qt\libqxt-Qt5\src\network   -> C:\Qt\libqxt-Qt5\include\QxtNetwork
    C:\Qt\libqxt-Qt5\src\sql           -> C:\Qt\libqxt-Qt5\include\QxtSql
    C:\Qt\libqxt-Qt5\src\web         -> C:\Qt\libqxt-Qt5\include\QxtWeb
    C:\Qt\libqxt-Qt5\src\widgets   -> C:\Qt\libqxt-Qt5\include\QxtWidgets
    C:\Qt\libqxt-Qt5\src\zeroconf  -> C:\Qt\libqxt-Qt5\include\QxtZeroconf

Windows 7 的使用者可以利用資料夾的分組方式功能,以類型分組來快速選取所有的 .h 檔案。

5. 接著在 .pro 專案檔中加入以下兩個部份。首先加入

       CONFIG  += qxt
       QXT     += core gui

接著依照中專案中所引用的函式而定再加入下列文字,若有引用其他不同的部份再修改紅色部份即可。

       win32:CONFIG(release, debug|release): LIBS += -LC:/Qt/libqxt-Qt5/lib/ -lqxtcore 
       else:win32:CONFIG(debug, debug|release): LIBS += -LC:/Qt/libqxt-Qt5/lib/ -lqxtcore
 
       INCLUDEPATH += C:/Qt/libqxt-Qt5/src/core
   INCLUDEPATH += C:\Qt\libqxt-Qt5\include\QxtCore
       DEPENDPATH += C:/Qt/libqxt-Qt5/src/core
 


星期五, 9月 21, 2012

[MFC] 取得記憶體使用量

psapi.h 為SDK內含的檔案,只安裝過 Visual C++ 的話,須另外下載。

#include "windows.h"
#include "stdio.h"
#include "psapi.h"

#pragma comment(lib, "strmiids.lib")
#pragma comment(lib, "psapi.lib")

int main(int argc, char *argv[]) {

        PROCESS_MEMORY_COUNTERS pmc;
        /*
        your code here
        */
        GetProcessMemoryInfo( GetCurrentProcess(), &pmc, sizeof(pmc)); //get memory usage
        cout <<"memory usage:" << pmc.PeakWorkingSetSize << endl; //unit in bytes
}

星期二, 11月 29, 2011

[軟體] 簡單好用的影音轉檔軟體 Moo0 VideoConverter 1.10

http://www.moo0.com/?top=http://www.moo0.com/software/VideoConverter/ 

這個軟體好用在於可以將mkv重新編碼,並且可以設定編碼後的檔案大小,而且畫質也不差。這樣就可以把一些超過一片DVD大小的720P重新壓成一片DVD的大小。 然後就可以把影片燒錄起來。

 支援格式/ 編碼:

 - 影片格式: AVI, FLV, M4V, MKV, MOV, MP4, MPG, OGG, OGV, RM, SWF, TP, TS, WEBM, WMV and many more.
 - 影片編碼: H.263, H.264 (x264), Mpeg2, Mpeg4 (DivX, XviD and its own), RV10, Theora, VP8, WMV (v7, v8) and many more.
 - 聲音格式 / 編碼: 3G2, 3GP, AAC, AC3, ADPCM, AIFF, AMR (NB, WB), AU, FLAC, GSM, M4A, MP3, MP4, OGG, PCM, RA, VORBIS, WAVE, WMA and many more.

星期一, 11月 28, 2011

[軟體] Moo0 VideoInfo 1.03 - 查看影片進階資訊

Moo0 VideoInfo 1.03 - 查看影片進階資訊:

 綠色軟體/影音視聽 2011/11/27 17:18 by 哇哇




在網路上蒐藏了許多影片,許多人可以將影片檔案容量變小,卻又可以保持高畫質,還真是好奇是怎樣的壓縮技術,自己轉檔一直測試的話可能要花上許多的時間,這時候可以試試看這個小軟體,能解析出影片中的所有細節資訊,在轉檔之前先學習別人的設定吧!

將影片檔案拖曳的軟體當中,就可以查看詳細的影片資訊,包含了檔案名稱、檔案大小、影片格式、影片長短、編碼方式、影片解析度與聲音等等的資訊,內容還頗多的,詳細的資訊我都還不太瞭解呢!而附加了複製資訊的功能,當分享影片的時候不如就輸出這樣的資訊,下載的人也能知道影片的狀態唷!

http://www.moo0.com/software/VideoInfo/

引用網址:http://portable.easylife.tw/trackback/2873

星期日, 11月 27, 2011

[MFC] 繪圖時去除閃爍




1. 專案加入 memdc.h
from Here

2. 在 stdafx.h加入下一行
 #include "memdc.h"

3. 修改訊息  WM_ERASEBKGND的回應 如下:
BOOL CExampleView::OnEraseBkgnd(CDC* pDC) {       return FALSE; }
4.修改OnDrae的程式碼,如下
void CExampleView::OnDraw(CDC* dc) {     CMemDC pDC(dc);     CExampleDoc* pDoc = GetDocument();     ASSERT_VALID(pDoc);     // TODO: add draw code for native data here - use pDC      //as the device context to draw to }

星期一, 7月 04, 2011

[VS2010] VC常用快速鍵

Ctrl+]               在括號間移動(游標須在括號旁邊)
Ctrl+'-'             移到游標先前所在位置
Ctrl+Shift+'-'       與上面相反
Ctrl+Shift+F         舊式的尋找工具
Ctrl+Tab             循環已開啟視窗
Ctrl+F3              尋找目前所選的文字
Ctrl+L               刪除目前行
Ctrl+W               選取文字(或一段空白)
Ctrl+Up              立刻捲動視窗,不需移動游標
Ctrl+Down            立刻捲動視窗,不需移動游標

Ctrl+K,Ctrl+K 設定/取消 書籤 Ctrl+K,Ctrl+P 前往上一個書籤 Ctrl+K,Ctrl+N 前往下一個書籤
Ctrl+K,Ctrl+C 註解選擇文字或當前行 Ctrl+K,Ctrl+U 消去註解
Ctrl+K,Ctrl+F 格式化選取文字 Alt+F8 格式化選取文字
Ctrl+M,Ctrl+M 打開/關閉 程式區塊 Ctrl+M,Ctrl+O 關閉所有程式區塊
F12 移到變數或函式定義處 Shitf+F12 尋找變數的reference
Shift+Alt+Enter 全螢幕 Ctrl+Shift+V  開啟循環剪貼簿
Ctrl+Shift+R         錄製巨集 
Ctrl+Shift+P         播放巨集  

Alt+Shift+箭頭 以區塊選擇 Ctrl+Enter 上面增加空白行 Ctrl+Sfift+Enter 下面增加空白行
Ctrl+Shift+Comma(,) 字體縮小 (逗號加上Shift即是小於(<)符號) Ctrl+Shift+Period(.) 字體放大 (句號加上Shift即是大於(>)符號)

星期五, 4月 08, 2011

[知識] Non-deterministic Algorithm

Def: 
這類演算法在做任何事時,該演算法的下一步可能會有無限多件事可以選擇。 (Permitting more than one choice of next move at some step in a computation) 

1.演算法中每一個步驟的運算無法被唯一定義。

2.能夠執行非決定性演算法的機器,稱為非決定性的機器 (Non-deterministic Machine)。
  2-1 由於非決定性演算法在執行時,每一步可能有無限多件事要處理,故非決定性計算機器需假設有無限多個處理器可平行處理。因此,非決定性計算機器的計算能力比決定性計算機器要強大。
  2-2 但是,實際上並不存在此種機器。

Non-deterministic Algorithm的執行步驟分成兩個階段:
1.猜測階段(Guess)
  由於沒有一個既定的程序來從事此階段的猜測工作,因此本階段是Non-deterministic
  對於本階段,我們只知道一件事:
  1-1 如果一個問題有正確解的話,此階段一定可以將這個正確解給猜出來;反之,若該問題沒有正確解的話,則此階段就會隨便給解答。
  1-2 至於猜測階段是怎麼將這個解答給找出來的,我們無從得知(不論所給的解是否為正確解) 。

2.驗証階段(Verification)
  將上一階段所猜出來的結果加以驗証是否為真 (True)

星期日, 4月 03, 2011

[旅遊] 319新竹一日蓋章行心得

1. 導航有時還是必要的。雖然地圖上路名大多有標示,不過在寶山的時候,路名跟地圖標示的不一樣,所以多走了一些冤枉路。而且有時候太小的路名也不會標示,遊憩是在山區時候。或是說比例尺太大,地圖沒有標示所有的部分,或是太小而沒有標示小路名,例如在湖口的部分。所以紙本地圖還是有缺點。而且雖然在市區都有標記的很清楚不過,地圖的印刷太雜亂有時候不容易找到路名,像是在新竹市區的時候。

2.在新竹市區看到很多鴿子跟SNG車,回來才發現是因為邱毅所發起的反霸凌示威遊行。

3.在台3線的時候,一路上好多重型機車,其中也有女騎士,不過是少數。在第一間小七,對面是一間萊爾富,停的都是重型機車,這邊小七只有自行車,可能是因為對面停車空間比較大的關係吧。

4.內灣不會很遠,下次可以去看看。

5.原來新湖口指的是湖口車站或是市中心的意思。

6.在新豐鄉蓋章的時候遇到一個怪人,雖然看起來不骯髒,不果衣服都破了,感覺就像是無業遊民。他看到我在蓋章,就過來想要分享心得,雖然我是沒看到他的印章簿,不過感覺他好像真的有在收集的樣子,連台鐵的100章都知道。不知道他怎麼收集的,看起來就不像是有錢的樣子。有些字也不太會寫的感覺,有時候一直重複剛剛講的話。感覺就是一個怪怪的人。

7.除了重機外,一路也發現許多自行車騎士,腿都好壯,我想除非我友好自行車,否則要我這樣騎,我應該騎不遠,雖然我很喜歡騎車到處跑的感覺。可是要我單靠腳力,感覺還是太累了。

8.這次除了319章以外,其他的紀念章蓋的不多,雖然到了竹東的旅遊服務中心,不過那裏一個紀念章也沒有。只有在北埔的文化紀念館蓋了一些以前的古蹟章。因為這個館感覺就很無聊,那裏的工作人員也閒到不知道是在玩遊戲還是只是聽音樂,反正就感覺很爽的樣子,雖然說假日還要上班。

9.湖口往新埔因為沒有直接的道路,可能是因為新埔柿在山中間的平地的關係,所以需要越過山,偏偏道路標示的又不清楚。害我走錯路,雖然是最後還是到了,不過要是沒有手錶上的指南針,我看我八成會走很多冤枉路。不過令人意外的是,雖然新埔的外圍區都是山,大部分都是種茶葉的,不過在市中心感覺還挺熱鬧的,有許多連鎖的商店,那裏的中學生打扮也挺潮流的,有點令人意外。我一開始也很懷疑,這麼山區且有沒有多少觀光資源的地方真的會有小七嗎,沒想到真的有,還有兩間。也幸好有,不然我真的會很失望。不知道為什麼這個地方會有這麼多消費族群可以撐得起這麼多店家。總而言之,新埔跟湖口不應該放在一起蓋,因為這兩個鄉鎮沒有直接連市中心的幹道,應該把新埔鎮放第一位,湖口放最後才對。真是失策,不過因為一開始來不及規畫路線就直接走,所以會發生這樣的情況也是不意外。

蓋章路線
關西 -> 橫山 -> 竹東 -> 北埔 -> 寶山 -> 東區 -> 香山區 -> 北區 -> 竹北 -> 新豐 -> 湖口 -> 新埔

尖石、五峰、峨嵋因為沒有小七而且找店家有點麻煩,所以等下次非假日直接到市公所蓋章好了。

星期四, 3月 24, 2011

[知識] SIFT

SIFT算法的教程、原始碼及應用軟件

1、ubc:DAVID LOWE---SIFT算法的創始人,兩篇經典的文章
http://www.cs.ubc.ca/~lowe/

2、cmu:YanKe---PCASIFT,總結的SIFT方面的文章SO全,超經典
http://www.andrew.cmu.edu/user/yke/

3、ubc:MBROWN---SIFT算法用於圖像拼接的經典應用autopano-sift,包括一個SIFTLIB庫
http://www.cs.ubc.ca/~mbrown/autostitch/autostitch.html
http://www.cs.ubc.ca/~mbrown/panorama/panorama.html

4、toronto:Jepson---Matlab SIFT tutorial, 超級超級超級經典~
http://www.cs.toronto.edu/~jepson

5、ucla:Vedaldi---加州大學一個博士生編的SIFT,Matlab、C的都有,但沒用過
http://www.cs.ucla.edu/~vedaldi/

6、一個小的拼接軟體ptasmblr
http://www.tawbaware.com/ptasmblr.htm

轉自 http://summerstation.spaces.live.com/blog/cns!e39c001cb6e4b188!1501.entry

星期二, 12月 14, 2010

[MFC] CImage 直接存取記憶體

//for 8-bit 影像
byte* pRealData=(byte*)m_Image.GetBits(); //取得記憶體開頭
int pit=m_Image.GetPitch(); //每一行的記憶體寬度
for (int y=0; y< Height;y++){
for (int x=0; x< Width;x++){
pRealData[ pit*y + x] = Intensity;

}}

//for 24-bit 影像

byte* pRealData=(byte*)SaveImg.GetBits();
int pit=SaveImg.GetPitch();
int bitCount=3;
for (int y=0; y< height; y++) {
for (int x=0; x< width; x++) {
pRealData [ pit*y + x*bitCount] = R ;
pRealData [ pit*y + x*bitCount+1] = G ;
pRealData [ pit*y + x*bitCount+2] = B;
}}

星期一, 11月 29, 2010

[MFC] Multithread

//Thread function 內容
UINT  MyThreadFun(LPVOID LParam)
{
        MyThreadInfo *pInfo1=(MyThreadInfo*) LParam;
        CTESTDlg *hWnd=(CTESTDlg*)CWnd::FromHandle(pInfo1->Wnd);
        CSliderCtrl *slider=(CSliderCtrl*)hWnd->GetDlgItem(IDC_SLIDER1);

        slider->SetLineSize(100);   // 設定 slider 大小
        for(int i=0;i<100;i++){
           slider->SetPos(i);   // 移動 slider
           Sleep(100);          // 暫停 thread
         }

         return(0);
}


//如果希望 thread function 能放在 class 中, 請宣告它為 static
class CTESTDlg : public CDialog {  
     static UINT MyThreadFun(LPVOID LParam);
};

///////////////////////////////////////////////////////////////

//Dialog按鈕程式碼
//開始 Tread
struct MyThreadInfo{
HWND hWnd;        // 紀錄產生 thread 的視窗物件
}Info1;

void CTESTDlg::OnBnClickedOk()
{
        Info1.hWnd=this->m_hWnd;   // 紀錄 Dialog 的window handle
        AfxBeginThread(MyThreadFun, (LPVOID)&Info1);
}


星期二, 11月 16, 2010

目前貼程式碼的方案

SyntaxHighlighter 3.0.83
簡單來說,在程式碼的前後各貼上

<pre class="brush: js">



</pre>

[MFC] Unicode環境下使用CStdioFile來存取中文檔案

因為CStdioFile並不支援Unicode所以無法存取Uncode檔案,而當存取ANSI檔案時又因為Unicode環境下而造成無法使用CStdioFile::ReadString()所讀到的CString。所以加入下面一行程式碼來設定讀入的檔案的地區編碼。

setlocale( LC_CTYPE,"cht" );
如果是簡體中文則將cht改為chs。
其他參考文章:
解决UNICODE字符集下CStdioFile的Writestring无法写入中文的问题
Windows环境下Unicode编程总结和将ANSI转换到Unicode 将Unicode转换到ANSI 


[MFC] CImage的簡單複製方法 (Copy CImage)

BOOL ImageCopy(const CImage &srcImage, CImage &destImage)
{
 int i,j;//循環變量
 if(srcImage.IsNull())
 return FALSE;
 //原始影像參數
 BYTE* srcPtr=(BYTE*)srcImage.GetBits();
 int srcBitsCount=srcImage.GetBPP();
 int srcWidth=srcImage.GetWidth();
 int srcHeight=srcImage.GetHeight();
 int srcPitch=srcImage.GetPitch(); 
 //銷毀原有圖像

 if( !destImage.IsNull())
 {
  destImage.Destroy();
 }
 //創建新圖像
 if(srcBitsCount==32)   //支援alpha通道
 {
  destImage.Create(srcWidth,srcHeight,srcBitsCount,1);

 }
 else
 {
  destImage.Create(srcWidth,srcHeight,srcBitsCount,0);
 }



 //加載調色板
 if(srcBitsCount<=8&&srcImage.IsIndexed())//需要調色盤
 {
  RGBQUAD pal[256];
  int nColors=srcImage.GetMaxColorTableEntries();
  if(nColors>0)
  {
   srcImage.GetColorTable(0,nColors,pal);
   destImage.SetColorTable(0,nColors,pal);//複製調色盤
  } 
 } 

 //目標影像參數
 BYTE *destPtr=(BYTE*)destImage.GetBits();
 int destPitch=destImage.GetPitch();
 //複製影像數據

 for(i=0 ; i<srcHeight;i++)
 {
  memcpy( destPtr+i*destPitch, srcPtr+i*srcPitch, abs(srcPitch) );
 } 
 return TRUE;
}

星期一, 10月 25, 2010

[攝影] 利用Photoshop做數位黑卡

前置作業:
1. 在Photoshop中同時開啟亮片與暗片。


2. 點選暗片後按Ctrl+A(全選),再按Ctrl+C(拷貝),之後就可以關閉暗片的檔案,你已
經用不到暗片了。


3. 點選亮片後按Ctrl+V(貼上),前置作業完成。


繼續:
1. 在LAYER對話框(PALLETE)中先點選第一層也就是暗片的部分,然後點選對話盒最下方,由左邊數來第二個圖示(Add Vector Mask),這時在第一層會出現一個白色的矩形。

2. 在LAYER對話盒點選第二層也就是BACKGROUND的部分,按Ctrl+A(全選),再按Ctrl+C(拷貝)。

3. 按住ALT同時點選在第一步驟時出現的白色長方形,這時畫面會變成白色,再按Ctrl+V(貼上),你會看到黑白影像。

4. 到 Filter / Blur / Gaussian Blur ,把 Radius 設為 40 pixels。

5. 到LAYER對話盒點選BACKGROUND,你就可以看到合成完成的影像。

6. 到 Image/ Adjustment / Shadow/Highlight 將SHADOW值設為24,或其他你認為適當的數值。

7. 回到LAYER對話盒,按上方最右邊的箭頭,將會出現選單,選擇Flaten Image就大功告成了。



引用來源 中文 英文