2010年1月17日 星期日
2010年1月16日 星期六
[BCB] 三種方法讀取 pixel 中的 RGB
我用了一張 640x480 的圖片作測試。
// 方法一 : 0.016s
for (int i = 0; i < h; i++)
{
ptr1 = (Byte*)Image1->Picture->Bitmap->ScanLine[i];
for (int j = 0; j < w; j++)
{
b = ptr1[3*j];
g = ptr1[3*j+1];
r = ptr1[3*j+2];
}
}
// 方法二 : 0.172s
for (int i = 0; i < h; i++)
for (int j = 0; j < w; j++)
{
color = Image1->Canvas->Pixels[j][i];
b = (color&0xFF0000) >> 16;
g = (color&0x00FF00) >> 8;
r = (color&0x0000FF);
}
// 方法三 : 0.515s
for (int i = 0; i < h; i++)
for (int j = 0; j < w; j++)
{
b = GetBValue(Image1->Canvas->Pixels[j][i]);
g = GetGValue(Image1->Canvas->Pixels[j][i]);
r = GetRValue(Image1->Canvas->Pixels[j][i]);
}
結論是,最好是用指標作,要不然就自己切,絕對不要用內建的 GetRValue() !
後記 :
TheBitmap->PixelFormat = pf32bit;
不論給多少,最好先給值,否則預設為 pfDevice ,這是依據顯卡目前的設定來處理,
而這會使得圖片處理的較慢
// 方法一 : 0.016s
for (int i = 0; i < h; i++)
{
ptr1 = (Byte*)Image1->Picture->Bitmap->ScanLine[i];
for (int j = 0; j < w; j++)
{
b = ptr1[3*j];
g = ptr1[3*j+1];
r = ptr1[3*j+2];
}
}
// 方法二 : 0.172s
for (int i = 0; i < h; i++)
for (int j = 0; j < w; j++)
{
color = Image1->Canvas->Pixels[j][i];
b = (color&0xFF0000) >> 16;
g = (color&0x00FF00) >> 8;
r = (color&0x0000FF);
}
// 方法三 : 0.515s
for (int i = 0; i < h; i++)
for (int j = 0; j < w; j++)
{
b = GetBValue(Image1->Canvas->Pixels[j][i]);
g = GetGValue(Image1->Canvas->Pixels[j][i]);
r = GetRValue(Image1->Canvas->Pixels[j][i]);
}
結論是,最好是用指標作,要不然就自己切,絕對不要用內建的 GetRValue() !
後記 :
TheBitmap->PixelFormat = pf32bit;
不論給多少,最好先給值,否則預設為 pfDevice ,這是依據顯卡目前的設定來處理,
而這會使得圖片處理的較慢
2010年1月12日 星期二
[Windows] 安裝 Office 2007 出現錯誤訊息
幫老師重灌電腦,要安裝 Office 2007 的時候,出現找不到 Enterprise.WW/... 的
錯誤訊息,結果把其中一條記憶體拔掉就可以了,真詭異,不知道是不是記憶
體壞了?
錯誤訊息,結果把其中一條記憶體拔掉就可以了,真詭異,不知道是不是記憶
體壞了?
2010年1月9日 星期六
[C++/CLI] Input & Ouput
Input
字串:String^ line = Console::ReadLine();
字元:char ch = Console::Read();
數字:int value = Int32::Parse(Console::ReadLine());
鍵盤:ConsoleKeyInfo keyPress = Console::ReadKey(true); // true 即 No Display, flase 即 Display
Ouput
int packageCount = 1;
float packageWeight = 7.5;
Console::WriteLine(L"Packages:{0,3} Weight: {1,5:F2} pounds.", packageCount, packageWeight);
{n,w : Axx}: n - arg, w - field width, A - formatted, xx - precision
字串:String^ line = Console::ReadLine();
字元:char ch = Console::Read();
數字:int value = Int32::Parse(Console::ReadLine());
鍵盤:ConsoleKeyInfo keyPress = Console::ReadKey(true); // true 即 No Display, flase 即 Display
Ouput
int packageCount = 1;
float packageWeight = 7.5;
Console::WriteLine(L"Packages:{0,3} Weight: {1,5:F2} pounds.", packageCount, packageWeight);
{n,w : Axx}: n - arg, w - field width, A - formatted, xx - precision
2010年1月7日 星期四
[C++/CLI] Visual C++ 2008 /MT 和 /CLR 的命令列選項不相容
[ 如果使用支援 /clr ]
[ 執行階段應選 /MD ]
[ 如果選擇 /MT 會有不相容的錯誤訊息產生 ]
以下取自微軟的 msdn :
/MD
會讓您的應用程式使用多執行緒及 DLL 專屬版本的執行階段程式庫。也會定義 _MT 和 _DLL,讓編譯器將程式庫名稱 MSVCRT.lib 置入 .obj 檔案中。 以這個選項編譯的應用程式會以靜態方式連結到 MSVCRT.lib。這個程式庫會提供一層可以讓連結器解析外部參考的程式碼。實際的工作程式碼是包含在 MSVCRT.dll 中,它在執行階段時必須能提供給與 MSVCRT.lib 連結的應用程式使用。當 /MD 配合所定義 _STATIC_CPPLIB (/D_STATIC_CPPLIB) 使用時,它會讓應用程式與靜態的多執行緒 Standard C++ 程式庫 (libcpmt.lib) 連結,而不與動態版本 (msvcprt.lib) 連結,同時仍透過 msvcrt.lib 動態地連結至主要的 CRT。
/MT
會讓您的應用程式使用多執行緒靜態版本的執行階段程式庫。會定義 _MT,並讓編譯器將程式庫名稱 LIBCMT.lib 置入 .obj 檔案中,讓連結器能夠使用 LIBCMT.lib 解析外部符號。
訂閱:
文章 (Atom)