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


簡單取得GIF長寬

沒想到GIF的長寬 這麼簡單取得,比較特別的是長寬的取得是前後交換
以下是程式碼,請參考




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

char Head[7];

memcpy(&Head,&buf[0],sizeof(wxChar)*6);

ReadWidthHeight=false;

if(strncmp( Head, "GIF89a", 6 )==0)
{
ReadWidthHeight=true;
}
else if(strncmp( Head, "GIF87a", 6 )==0)
{
ReadWidthHeight=true;
}
else
{
ReadWidthHeight=true;
return false;
}

Width=(BYTE)buf[7]<<8 | (BYTE)buf[6];
Height=(BYTE)buf[9]<<8 | (BYTE)buf[8];

return true;
}


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


參考:
(1)
http://www.google.com/codesearch?hl=en&q=+lang:c%2B%2B+read+gif+GIF87a+-img+show:iBviMvVRkiM:OFbzHTlzfvE:iCimjISyEyE&sa=N&amp;cd=9&ct=rc&cs_p=http://ftp.sayclub.com/pub/X/KDE/snapshots/kdegraphics.tar.bz2&cs_f=kdegraphics-662419/kfile-plugins/gif/kfile_gif.cpp#a0


(2)
http://www.google.com/codesearch?hl=en&q=+lang:c%2B%2B+read+gif+GIF87a+-img+show:UWpAtBfjvQQ:_U9kG32Kep4:eT79gmuydxg&sa=N&amp;cd=13&ct=rc&cs_p=ftp://ftp.trolltech.com/qt/source/qt-x11-opensource-4.0.0-b2.tar.bz2&cs_f=qt-x11-opensource-4.0.0-b2/src/plugins/imageformats/gif/qgifhandler.cpp#a0


簡單取得PNG長寬

讀取過jpg的長寬 接下來的是PNG的長寬比起JPG算是簡單多了
以下是程式碼,請參考




bool GetPngWidthHeight(const wxChar* buf,int size,int&Width,int& Height,bool& ReadWidthHeight)
{
ReadWidthHeight=false;

if (size < 29) return false;

if ((BYTE)buf[0] == 137 && (BYTE)buf[1] == 80 && (BYTE)buf[2] == 78 && (BYTE)buf[3] == 71 &&
(BYTE)buf[4] == 13 && (BYTE)buf[5] == 10 && (BYTE)buf[6] == 26 && (BYTE)buf[7] == 10 )
if(!strncmp(&buf[12], "IHDR", 4))
{
Width=((BYTE)buf[16]<<24) + ((BYTE)buf[17]<<16) + (buf[18]<<8) + (BYTE)buf[19];
Height=((BYTE)buf[20]<<24) + ((BYTE)buf[21]<<16) + (buf[22]<<8) + (BYTE)buf[23];

ReadWidthHeight=true;

return true;
}

return false;
}

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


ps.程式碼不能由Zoundry 編輯,有點小麻煩說....不知道有沒有人知道方法?



參考:
http://www.google.com/codesearch?hl=en&q=show:F37na6T0rTQ:Z5xzSl8N0x4:T9AszC_EqFY&sa=N&ct=rd&cs_p=http://security.debian.org/pool/updates/main/k/kdegraphics/kdegraphics_3.3.2.orig.tar.gz&cs_f=kdegraphics-3.3.2/kfile-plugins/png/kfile_png.cpp


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/05/09

Visual Studio 2005 Express 錯誤排解

最近使用Visual Studio 2005 Express 編寫 WxWidgets 發生了一些問題,特此記錄下來,以後再遇到的時候可以直接拿來修改:



一開始當然會搜尋是否有出SP1,微軟修正的動作算是蠻頻繁,所以當然要先下載相關的SP1修正囉:


Visual Studio SP1(下載



  • Visual Basic 2005 Express Edition SP1- VS80sp1-KB926747-X86-INTL.exe

  • Visual C++ 2005 Express Edition SP1 - VS80sp1-KB926748-X86-INTL.exe

  • Visual C# Express Edition SP1- VS80sp1-KB926749-X86-INTL.exe

  • Visual J# Express Edition SP1 - VS80sp1-KB926750-X86-ENU.exe

  • Visual Web Dev Express Edition SP1- VS80sp1-KB926751-X86-INTL.exe


不用全下載,只要你使用那種編輯器 下載使用就好了.


以上參考:Visual Studio 2005 Express SP1 DVD Pack (偽)


(1)IntelliSense 啟用失敗


何謂IntelliSense??就是在使用物件 CObject-> 時,會出現相關物件的函式說明小視窗,這正是一個好的編輯器所需要具備的好用功能之一,但是當我使用WxWidgetes 時卻沒有出現。


修正方式:左方專案->屬性->組態屬性->一般->Common Language Runtime支援->Common Language Runtime 支援 (/clr)


編譯時再改回來 因為 /clr 跟 /mtd 相沖,以上的動作只是要讓IntelliSense重新彙整相關資料


就可以出現了,就我目前的狀態修正是如此,如果還是不行請參照:
http://msdn2.microsoft.com/zh-tw/library/ms173379(vs.80).aspx