顯示具有 WxWidgets 標籤的文章。 顯示所有文章
顯示具有 WxWidgets 標籤的文章。 顯示所有文章

2007/05/26

簡單取得PSD長寬

PSD的讀取參考了幾個地方 發現 有讀取 8BIM 跟 8BPS 的 不太一樣


8BIM是讀取資源內容
8BPS是檔頭判斷
以下是程式碼,請參考




bool GetPsdWidthHeight(const wxChar* buf,int size,int&Width,int& Height,bool& ReadWidthHeight)
{
char Head[5];
memcpy(&Head,&buf[0],sizeof(wxChar)*4);

if(strncmp( Head, "8BPS", 4 ))
{
ReadWidthHeight=true;
return false;
}

int check=(BYTE)buf[4]<<8 | (BYTE)buf[5];

if (check != 1)
{
ReadWidthHeight=true;
return false;
}

//Read32; 6 7 8 9
//Read16; 10 11

unsigned channel_count = (BYTE)buf[12]<<8 | (BYTE)buf[13];

if( channel_count >= 0 && channel_count <= 16)
{
Height = (BYTE)buf[14]<<24 | (BYTE)buf[15]<<16 | (BYTE)buf[16]<<8 | (BYTE)buf[17];
Width = (BYTE)buf[18]<<24 | (BYTE)buf[19]<<16 | (BYTE)buf[20]<<8 | (BYTE)buf[21];

ReadWidthHeight=true;
return true;
}

return false;

}



以上 , 不負責讀取所有格式,另有問題概不負責.
歡迎轉載並請標明出處.謝謝


參考:
(1)
http://www.google.com/codesearch?hl=en&q=+lang:c%2B%2B+psd+8BIM+8BPS+-img+show:gNvfT5nXepE:CqZcsEQNy-A:b6xjN1IEDH4&sa=N&amp;cd=2&ct=rc&cs_p=http://gsmp.tfh-berlin.de/mirror/t2-source/6.0/p/paintlib-2.6.2.tar.bz2&cs_f=paintlib-2.6.2/common/plpsddec.cpp#a0


(2)
http://www.google.com/codesearch?hl=en&q=+lang:c%2B%2B+psd+8BIM+8BPS+-img+show:gNvfT5nXepE:CqZcsEQNy-A:b6xjN1IEDH4&sa=N&amp;cd=2&ct=rc&cs_p=http://gsmp.tfh-berlin.de/mirror/t2-source/6.0/p/paintlib-2.6.2.tar.bz2&cs_f=paintlib-2.6.2/common/plpsddec.cpp#a0


簡單取得BMP長寬

BMP的讀取32Bit 的值 找了許久..
以下是程式碼,請參考




bool GetBmpWidthHeight(const wxChar* buf,int size,int&Width,int& Height,bool& ReadWidthHeight)
{
if(size < 26)
{
ReadWidthHeight = false;
return false;
}

width =(BYTE)buf[21] << 24;
height =(BYTE)buf[25] << 16;
readwidthheight=true;
}

以上 , 不負責讀取所有格式,另有問題概不負責.
歡迎轉載並請標明出處.謝謝

參考:

http://www.google.com/codesearch?hl=en&q=+lang:c%2B%2B+read+bmp+width+-img+show:MSwKpY23o4k:RjXxUM8aNXA:UKPc_fAe5nA&sa=N&cd=2&ct=rc&cs_p=ftp://ftp.idsoftware.com/idstuff/source/GtkRadiant-GPL.zip&cs_f=GPL/GtkRadiant/plugins/image/bmp.cpp#a0

http://www.google.com/codesearch?hl=zh-TW&q=+lang:c%2B%2B+read+bmp+width+%3C%3C+-img+show:aqffVhSjOiA:HMWZi5kbbPk:khnt1EYmZBw&sa=N&cd=6&ct=rc&cs_p=http://gentoo.osuosl.org/distfiles/BillardGL-1.75.tar.gz&cs_f=BillardGL-1.75/src/bmp.cpp#a0

http://www.google.com/codesearch?hl=en&q=+lang:c%2B%2B+read+bmp+width+-img+show:yCojKnsQ0QI:vtUCdjQhxbA:q2dpa3bwE18&sa=N&cd=10&ct=rc&cs_p=http://www-ftp.lip6.fr/pub/X11/kde/stable/latest/src/kdegraphics-3.5.6.tar.bz2&cs_f=kdegraphics-3.5.6/kfile-plugins/bmp/kfile_bmp.cpp#a0


2007/05/13

簡單取得JPEG長寬

目前用WxWidgets寫一個線上偵測抓圖的軟體,依規則尋網頁中的圖檔,下載,抓取長寬的設定,判斷是否繼續下載。


Googole CodeSearch搜尋了很久,都是使用LIB或是讀檔的方式比較麻煩,我只是要取得圖檔長寬而已啊.. 在努力搜尋之後,皇天不負苦心人還是讓我找到一篇,並修改成一個函式與大家分享,以下是我改寫的程式:





bool GetJpgWidthHeight(wxChar* buf,int size,int&Width,int& Height)
{
bool ret=false;
#define M_SOF0 0xC0 /* Start Of Frame N */
#define M_SOF1 0xC1 /* N indicates which compression process */
#define M_SOF2 0xC2 /* Only SOF0-SOF2 are now in common use */
#define M_SOF3 0xC3
#define M_SOF5 0xC5 /* NB: codes C4 and CC are NOT SOF markers */
#define M_SOF6 0xC6
#define M_SOF7 0xC7
#define M_SOF9 0xC9
#define M_SOF10 0xCA
#define M_SOF11 0xCB
#define M_SOF13 0xCD
#define M_SOF14 0xCE
#define M_SOF15 0xCF
#define M_SOI 0xD8 /* Start Of Image (beginning of datastream) */
#define M_EOI 0xD9 /* End Of Image (end of datastream) */
#define M_SOS 0xDA /* Start Of Scan (begins compressed data) */
#define M_APP0 0xE0 /* Application-specific marker, type N */
#define M_APP12 0xEC /* (we don't bother to list all 16 APPn's) */
#define M_COM 0xFE /* COMment */

int marker;
int Index=0;

int c1, c2;
c1 = (BYTE)buf[Index++];
c2 = (BYTE)buf[Index++];
if (c1 != 0xFF || c2 != M_SOI)
return false;
else
{
marker = c2;
}

unsigned int SkipLen=0;

for (;;)
{
marker=(BYTE)buf[Index++];

if(Index>=size)
return false;

while (marker != 0xFF)
{
marker=(BYTE)buf[Index++];
if(Index>=size)
return false;
}

do
{
marker=(BYTE)buf[Index++];
if(Index>=size)
return false;

} while (marker == 0xFF);

switch (marker)
{
case M_SOF0: /* Baseline */
case M_SOF1: /* Extended sequential, Huffman */
case M_SOF2: /* Progressive, Huffman */
case M_SOF3: /* Lossless, Huffman */
case M_SOF5: /* Differential sequential, Huffman */
case M_SOF6: /* Differential progressive, Huffman */
case M_SOF7: /* Differential lossless, Huffman */
case M_SOF9: /* Extended sequential, arithmetic */
case M_SOF10: /* Progressive, arithmetic */
case M_SOF11: /* Lossless, arithmetic */
case M_SOF13: /* Differential sequential, arithmetic */
case M_SOF14: /* Differential progressive, arithmetic */
case M_SOF15: /* Differential lossless, arithmetic */
Index+=3;

if(Index>=size)
return false;

c1=(BYTE)buf[Index++];
c2=(BYTE)buf[Index++];

Width=(int)(((unsigned int) c1) << 8) + ((unsigned int) c2);

c1=(BYTE)buf[Index++];
c2=(BYTE)buf[Index++];

Height=(int)(((unsigned int) c1) << 8) + ((unsigned int) c2);

return true;

break;
case M_SOS: /* stop before hitting compressed data */
return false;
break;
case M_EOI: /* in case it's a tables-only JPEG stream */
return false;
break;
default:
c1=(BYTE)buf[Index++];
c2=(BYTE)buf[Index++];

SkipLen=(((unsigned int) c1) << 8) + ((unsigned int) c2);

if (SkipLen < 2)
return false;

Index+=SkipLen-2;
if(Index>=size)
return false;

break;
}

}
return ret;
}

以上有些地方沒有偵測是否超過範圍,也不知道是不是通用所有的JPEG格式,所以使用以上程式發生問題本人概不負責 XD

另外傳入的buffer 要夠大 才會顯示真的長寬,有的圖檔的Width Height 位置非常的後面,並不是固定的位置

歡迎轉載,但請標明出處,謝謝。
參考網址: Google CodeSearch


2007/04/29

wxWidgets + Visual C++2005 + wxDev-C++ 第一次安裝

首先當然需要下載相關軟體:
Visual C++2005 Express Edition + Platfrom SDK for Windows Server 2003 R2
WxWidgets 目前最新版 2.83 下載 exe 版或是 zip ,exe 會幫你電腦設定 WXWIN 目錄。
wxDev-C++ 目前最新版本 6.10-2

Visual C++ 2005 請先安裝,wxDev-C++ 可以選擇 2005 的編輯器。



第一步: 2005 + Platfrom SDK設定步驟
http://www.microsoft.com/taiwan/msdn/express/visualc/usingpsdk/default.mspx
(1)在ProgramFiles%\Microsoft Visual Studio 8\VC\VCWizards\AppWiz\Generic\Application\html\1033\".中我沒有1033的目錄於是改1028的目錄中的 AppSettings.htm 也是可行的。
(2)要用NotePad 等文字編輯器編輯 不可用 2005 會出現錯誤訊息。


第二步:
(1)設定WXWIN 系統變數 目錄:
我的電腦->內容->進階->環境變數->系統變數->新增->
變數名稱:WXWIN
變數值:安裝 WxWidgets 的目錄。


(2)Visual 2005 中設定 相關目錄:
工具->選項->專案和方案->VC++目錄
顯示目錄->Include 檔案
新增:
$(WXWIN)\include
$(WXWIN)\contrib\include

顯示目錄->程式庫檔
新增:
$(WXWIN)\lib\vc_lib
$(WXWIN)\contrib\lib


顯示目錄->原始程式檔
新增
$(WXWIN)\src

以下用 (WXWIN) 代表文中WxWidgets所安裝的目錄


第三步:使用 Visual C++ 2005編譯WxWidgets
開啟專案->(WXWIN)\build\msw\wx.dsw 開啟之後會有20個專案。
然後將專案全選->屬性->組態屬性->C/C++->程式碼產生->執行階段程式庫 改為 多執行緒偵錯(/MTd)
再將上方作用中Debug 改為 Release 執行階段程式庫 改為 多執行緒(/MT)

套用跳出後,目前使用Debug 模式,再全選所有專案->建置選取範圍 會編譯一段時間後,再改 Release 編輯一次。


於是在(WXWIN)\build\msw\ 會出現 vc_mswd 和 vc_msw 的目錄。


第三步:使用wxDev-C++ 建立新專案,建立你需要的介面。然後選擇 visual 2005 編譯,就會建立一個相關檔案,和一個 rc的檔案,給visual 2005 使用。


第四步:visual 2005 建立新專案
(1)一般->空專案 選取跟 wxDev-C++剛建立的專案相同的名稱與目錄


(2)原始程式檔->加入->現有項目 載入 cpp 檔案


(3)標頭檔->加入->現有項目 載入 h 檔案


(4)資源檔->加入->現有項目 載入 rc 檔案


(5)對專案按右鍵->屬性->組態屬性->C/C++->一般->其他include目錄
加入 "$(WXWIN)\include";"$(WXWIN)\contrib\include";"$(WXWIN)\lib\vc_lib\mswd"
如改為Release模式 將 "$(WXWIN)\lib\vc_lib\mswd" 改為 "$(WXWIN)\lib\vc_lib\msw" 即可


(6)C/C++->前置處理器->前置處理器定義->
WIN32;_DEBUG;__WXMSW__;__WXDEBUG__;_WINDOWS;NOPCH;_CRT_NONSTDC_NO_DEPRECATE
此為Debug模式,如要改成Release 模式
WIN32;__WXMSW__;_WINDOWS;NOPCH;_CRT_NONSTDC_NO_DEPRECATE


(7)連結器->一般->其他程式庫目錄 -> "$(WXWIN)\lib";"$(WXWIN)\contrib\lib";"$(WXWIN)\lib\vc_lib"


(8)連結器->輸入->其他相依性 ->
comctl32.lib rpcrt4.lib wxmsw28d_core.lib wxbase28d.lib wxtiffd.lib wxjpegd.lib wxpngd.lib wxzlibd.lib wxregexd.lib wxexpatd.lib winmm.lib wsock32.lib oleacc.lib
要改成Release 模式:
wxmsw28_core.lib wxbase28.lib wxtiff.lib wxjpeg.lib wxpng.lib wxzlib.lib wxregex.lib wxexpat.lib winmm.lib comctl32.lib rpcrt4.lib wsock32.lib oleacc.lib odbc32.lib


如果要使用網路功能請再加入 wxbase28d_net.lib


(9)連結器->資訊清單檔 ->產生資訊清單->否

最後選擇編譯,就可以使用 Visual 2005的方便與強大的程式編輯功能 與 wxDev- C++ 方便的介面設定功能。


產生的問題清單:
(1)如果有產生外部呼叫錯誤:重新編譯 WxWidgets 的 與目前程式使用的 Debug、Release 模式 再試試看。
(2)在Debug模式出現沒有偵錯資訊時:連結器->偵錯->產生偵錯資訊->是


以上純屬個人經驗 與 大家分享


參考資料:
http://www.wxwidgets.org/wiki/index.php/Compiling_WxWidgets




2007/04/21

wxWidgets玩玩看

wxWidgets是一款跨平台類似MFC的OpenSource GUI函式庫,另我驚豔的是跟平台中居然也有支持手機。




之前Visual Studio 2005 Edition Express剛推出的時候,本來想拿來寫幾個程式練練手,沒想到居然沒有支援MFC,讓人小小失望了一下,於是就在網路上搜尋是否有類似的函式庫,就看到這款wxWidgets(聽說本來名稱為wxWindows,但是微軟施壓於是就改為目前的名稱了)。


這款有一個非常特別的地方就是可以選擇不同的編譯軟體,像在GCC 可以跨平台使用,或是使用 Visual 2005,或是使用BCC 等,由於這個特點,使得寫出來的軟體在不同平台編譯後,會執行較快,程式較小等優點。wxWidgets跟MFC觀念上有許多相似之處,熟悉MFC的程式朋友,應該轉換的時候應該不會遇到太大的阻力。


不過畢竟這是個函式庫,要跟一個好的IDE軟體配合,才可以發揮應有的威力,當然就要介紹一下wxDev-C++這個軟體,這個是一個OpenSource的IDE,配合wxWidgets的編譯,有中文介面,另外在撰寫程式製作介面的時候還有類似Delphi的可拖拉式選項。特別的是這個軟體是由Delphi所寫的。


以下記錄幾個wxWidgets的相關網站:


大陸資料:
http://wxwidgets.cn/
http://www.wxchinese.org/
大陸翻譯的電子書:
http://cnwxwidgets.googlepages.com/wxwidgets_frame.html


台灣資料:
http://blog.roodo.com/richielin996/archives/2353530.html


由於我也才開始入門,而且MFC也是自學中,所以寫下這篇文章,記錄一下相關網站與相關軟體資料。