//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;
}}
星期二, 12月 14, 2010
星期一, 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);
}
//Dialog按鈕程式碼
//開始 Tread
struct MyThreadInfo{
HWND hWnd; // 紀錄產生 thread 的視窗物件
}Info1;
void CTESTDlg::OnBnClickedOk()
{
Info1.hWnd=this->m_hWnd; // 紀錄 Dialog 的window handle
AfxBeginThread(MyThreadFun, (LPVOID)&Info1);
}
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
[MFC] Unicode環境下使用CStdioFile來存取中文檔案
因為CStdioFile並不支援Unicode所以無法存取Uncode檔案,而當存取ANSI檔案時又因為Unicode環境下而造成無法使用CStdioFile::ReadString()所讀到的CString。所以加入下面一行程式碼來設定讀入的檔案的地區編碼。
Windows环境下Unicode编程总结和将ANSI转换到Unicode 将Unicode转换到ANSI
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就大功告成了。
引用來源 中文 英文
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就大功告成了。
引用來源 中文 英文
星期六, 5月 22, 2010
星期四, 4月 01, 2010
[旅遊] 2010-04-01 平溪一日遊
訂閱:
文章 (Atom)