最近自己摸 TI 的 DM6437 DSP 真是有夠難上手了。
覺得 Output 怪怪的或 CCS 開不起來就按按 SW6 Reset 吧。
還有隨 DM6437 EVM 附的光碟,裡面有的 Driver 都很舊,有一些 bug,
可以的話就先更新,如:
DSP/BIOS: v5.31.02 -> v5.41.09.34
Code Generation Tools: v6.0.8 -> v6.1.18
DVSDK: dvsdk_1_01_00_15 -> dvsdk_1_11_00_00
一些名詞的縮寫:
VPSS: Video Processing Subsystem
VPFE: Video Processing Font-end
CCDC: CCD Controller
VPFE: Video Processing Back-end
OSD: On-Screen Display
xDC: Express DSP Component
PSP: Platform Support Package
另外這兩個網站,可以找到許多相關資料。
TI Wiki:
http://processors.wiki.ti.com/index.php/Main_Page
TI Forum:
http://e2e.ti.com/support/dsp/davinci_digital_media_processors/f/default.aspx
關於最佳化:
http://processors.wiki.ti.com/index.php/C6000_CGT_Optimization_Lab_-_1
2010年12月31日 星期五
2010年12月20日 星期一
[C/C++] 動態宣告二維陣列
// ========================== // C Style // ========================== int **p; int i; // 欲配置成 p[10][3] p = (int **)malloc(10 * sizeof(int *)); for (i = 0; i < 10; i++){ p[i] = (int *)malloc(3 * sizeof(int)); .... // 使用完後釋放記憶體空間 for (i = 0; i < 10; i++) free(p[i]); free(p); // ========================= // C++ Style // ========================= int **p; // 二維動態 // 欲配置成 p[10][3] p = new int* [10]; for (int i = 0; i < 10; i++){ p[i] = new int [3]; ... // 使用完後釋放記憶體空間 for (int i = 0; i < 10; i++) delete [] p[i]; delete [] p; int (*p)[3]; // 一維固定一維動態 // 欲配置成 p[10][3] p = new int[10][3]; for (int i = 0; i < 10; i++){ p[i] = new int [3]; ... // 使用完後釋放記憶體空間 delete [] p;
2010年12月17日 星期五
[C/C++] 在Dev-C++安裝OpenCV2.0
(1)下載 OpenCV-2.0.0a-win32.exe
(2)安裝OpenCV2.0在C:\OpenCV2.0
(3)在DEV 工具/編譯器選項/編譯器 的編譯器設定組態中新增編譯器設定(加號按鈕)並命名為"OpenCV2.0"
(4)在連結器命令列中加入以下命令(前面框號要打勾)
-llibcxcore200 -llibcv200 -llibcvaux200 -llibhighgui200 -llibml200
(5)在DEV 工具/編譯器選項/目錄/二進位檔 加入:
C:\OpenCV2.0\bin
C:\Dev-Cpp\Bin
C:\Dev-Cpp\libexec\gcc\mingw32\3.4.2
(6)在DEV 工具/編譯器選項/目錄/函式庫 加入:
C:\OpenCV2.0\lib
C:\Dev-Cpp\lib
(7)在DEV 工具/編譯器選項/目錄/C引入檔 加入:
C:\OpenCV2.0\include\opencv
C:\Dev-Cpp\include
(8)在DEV 工具/編譯器選項/目錄/C++引入檔 加入:
C:\OpenCV2.0\include\opencv
C:\Dev-Cpp\lib\gcc\mingw32\3.4.2\include
C:\Dev-Cpp\include\c++\3.4.2\backward
C:\Dev-Cpp\include\c++\3.4.2\mingw32
C:\Dev-Cpp\include\c++\3.4.2
C:\Dev-Cpp\include
(9)在C:\OpenCV2.0\include\opencv中找到cxoperations.hpp檔
(10)找到檔中第66行部分程式碼如下
#else
#include <bits/atomicity.h>
#if __GNUC__ >= 4
(11)將它改成如下程式碼並儲存
#else
#include <bits/atomicity.h>
#if __GNUC__ >= 4 || __MINGW32__
(12)每次開新的專案必須在專案中選擇新建的編譯器設定(OpenCV2.0)
轉載自: http://yester-place.blogspot.com/2008/06/dev-copencv.html
(2)安裝OpenCV2.0在C:\OpenCV2.0
(3)在DEV 工具/編譯器選項/編譯器 的編譯器設定組態中新增編譯器設定(加號按鈕)並命名為"OpenCV2.0"
(4)在連結器命令列中加入以下命令(前面框號要打勾)
-llibcxcore200 -llibcv200 -llibcvaux200 -llibhighgui200 -llibml200
(5)在DEV 工具/編譯器選項/目錄/二進位檔 加入:
C:\OpenCV2.0\bin
C:\Dev-Cpp\Bin
C:\Dev-Cpp\libexec\gcc\mingw32\3.4.2
(6)在DEV 工具/編譯器選項/目錄/函式庫 加入:
C:\OpenCV2.0\lib
C:\Dev-Cpp\lib
(7)在DEV 工具/編譯器選項/目錄/C引入檔 加入:
C:\OpenCV2.0\include\opencv
C:\Dev-Cpp\include
(8)在DEV 工具/編譯器選項/目錄/C++引入檔 加入:
C:\OpenCV2.0\include\opencv
C:\Dev-Cpp\lib\gcc\mingw32\3.4.2\include
C:\Dev-Cpp\include\c++\3.4.2\backward
C:\Dev-Cpp\include\c++\3.4.2\mingw32
C:\Dev-Cpp\include\c++\3.4.2
C:\Dev-Cpp\include
(9)在C:\OpenCV2.0\include\opencv中找到cxoperations.hpp檔
(10)找到檔中第66行部分程式碼如下
#else
#include <bits/atomicity.h>
#if __GNUC__ >= 4
(11)將它改成如下程式碼並儲存
#else
#include <bits/atomicity.h>
#if __GNUC__ >= 4 || __MINGW32__
(12)每次開新的專案必須在專案中選擇新建的編譯器設定(OpenCV2.0)
轉載自: http://yester-place.blogspot.com/2008/06/dev-copencv.html
2010年11月28日 星期日
Context Switch
當發生中斷時,作業系統必須暫存目前程序的 context,載入新程序的
context,而 context 是以 PCB (Process Control Block) 來表示。
PCB 包含了許多資訊如 :
Process state : new, ready, running, waiting, halted 等等。
Program counter : 存放下一行要執行的指令的位址。
CPU registers : 依不同的電腦架構而有不同,如 accumulators, stack pointers 等等。
CPU-scheduling information : 程序的優先權和排程的參數等等。
Memory-management information : page tables, segment tables 等等。
Accounting information : CPU 數量、程序數量等等。
I/O status information : 配置的 I/O 裝置和開啟的檔案。
context,而 context 是以 PCB (Process Control Block) 來表示。
PCB 包含了許多資訊如 :
Process state : new, ready, running, waiting, halted 等等。
Program counter : 存放下一行要執行的指令的位址。
CPU registers : 依不同的電腦架構而有不同,如 accumulators, stack pointers 等等。
CPU-scheduling information : 程序的優先權和排程的參數等等。
Memory-management information : page tables, segment tables 等等。
Accounting information : CPU 數量、程序數量等等。
I/O status information : 配置的 I/O 裝置和開啟的檔案。
什麼是 IP 分享器? Hub? Switch Hub?
IP 分享器
通常和電信業者申請 ADSL 的時候,只會給一個固定 IP,這時候家裡若想要多台
電腦同時上網,就必須透過 IP 分享器來分配虛擬 IP 給其他電腦,192.168.0.0 ~
192.168.255.255,而這些電腦都會統一透過 IP分享器上的固定 IP 與外界的 Internet
溝通。
Hub
這是假設 IP 分享器後面的埠只有 8 個,但想要連接 8 台以上的電腦,這時就可以
用 Hub ,就好像電腦主機只有兩三個 USB 埠,但想要接很多裝置時,就可以買一
個 USB Hub 來擴充。Hub 屬於半雙工,只收或送。
Switch Hub
通常和電信業者申請 ADSL 的時候,只會給一個固定 IP,這時候家裡若想要多台
電腦同時上網,就必須透過 IP 分享器來分配虛擬 IP 給其他電腦,192.168.0.0 ~
192.168.255.255,而這些電腦都會統一透過 IP分享器上的固定 IP 與外界的 Internet
溝通。
Hub
這是假設 IP 分享器後面的埠只有 8 個,但想要連接 8 台以上的電腦,這時就可以
用 Hub ,就好像電腦主機只有兩三個 USB 埠,但想要接很多裝置時,就可以買一
個 USB Hub 來擴充。Hub 屬於半雙工,只收或送。
Switch Hub
與 Hub 相似,不同的是 Switch 的 port 會記錄每台電腦的 MAC,在傳輸封包時,
只會傳給擁有該 MAC 的電腦,不像單純的 Hub 是用廣播的方式。而且 Switch 是
屬於全雙工,可以同時傳送和接收資料,所以價格也比單純的 Hub 來的貴一點。
2010年11月24日 星期三
[C/C++] 常見的型態運算錯誤
char a = 200;
char b = 200;
int c;
c = a + b;
c 會是多少呢?
答案是 -112 而不是 400
因為 a 和 b 實際上都為 -56,所以 -56 + -56 = -112
char b = 200;
int c;
c = a + b;
c 會是多少呢?
答案是 -112 而不是 400
因為 a 和 b 實際上都為 -56,所以 -56 + -56 = -112
2010年10月17日 星期日
[C/C++] structure and class
Class is equal to structure plus member function, but a C++ structure can do any thing a class can do!
Only their default access level are different.
Structure's fields are public by default.
Class fields are private by default.
Only their default access level are different.
Structure's fields are public by default.
Class fields are private by default.
2010年10月16日 星期六
[C/C++] Default Arguments
在 C++ 裡,函式中的參數是可以在定義的時候給初始值的 (C 不支援)。
// definition void a (int b, int c = 1, int d = 1); int main () { a(1, 2, 3); a(1, 2); a(1); } // implementation void a (int b, int c, int d) { ... }
2010年10月15日 星期五
[BCB] 擷取檔案路徑與副檔名的函式
String str = "C:\\Program Files\\Borland\\CBuilder6\\Projects\\Project1.exe";
Label1->Caption = ExtractFileName(str);
// Project1.exe
Label2->Caption = ExtractFilePath(str);
// C:\Program Files\Borland\CBuilder6\Projects\
Label3->Caption = ExtractFileDir(str);
// C:\Program Files\Borland\CBuilder6\Projects
Label4->Caption = ExtractFileDrive(str);
// C:
Label5->Caption = ExtractFileExt(str);
// .exe
Label1->Caption = ExtractFileName(str);
// Project1.exe
Label2->Caption = ExtractFilePath(str);
// C:\Program Files\Borland\CBuilder6\Projects\
Label3->Caption = ExtractFileDir(str);
// C:\Program Files\Borland\CBuilder6\Projects
Label4->Caption = ExtractFileDrive(str);
// C:
Label5->Caption = ExtractFileExt(str);
// .exe
2010年10月6日 星期三
[C/C++] Data structure alignment
通常 structure 中都會以 size 最大的成員作為 alignment 的單位,以提高運算效率。
以 struct A1 來說,最大為 double 所以 alignment 的單位為 8 bytes,
sizeof( struct A1) 就會是 4 + 4 + 8 + 8 = 24 bytes。
sizeof( struct A2) 就會是 4 + 4 + 8 + 1 + p(7) + 8 = 32 bytes,
padding 了 7 bytes。
使用虛擬指令 #pragma pack() : 取消自定義對齊方式。
進行對齊。sizeof( struct D) 就會是 4 + 1 + p(1) = 6 bytes。
以 struct A1 來說,最大為 double 所以 alignment 的單位為 8 bytes,
sizeof( struct A1) 就會是 4 + 4 + 8 + 8 = 24 bytes。
sizeof( struct A2) 就會是 4 + 4 + 8 + 1 + p(7) + 8 = 32 bytes,
padding 了 7 bytes。
struct A1 { int a; char b[12]; double c; }; struct A2 { int a; char b[13]; double c; };使用虛擬指令 #pragma pack(n) : 編譯器將按照 n bytes 對齊。
使用虛擬指令 #pragma pack() : 取消自定義對齊方式。
#pragma pack(2) struct D { int a; char b; }; #pragma pack()如果指定的 n 大於 structure 中成員的最大 size 將不起作用,仍依 size 最大的成員
進行對齊。sizeof( struct D) 就會是 4 + 1 + p(1) = 6 bytes。
2010年9月7日 星期二
[Windows] 更改 IE 同時下載個數的限制
IE 預設在同一個頁面只能同時下載兩個檔案,透過 regedit.exe 可以解除此限制。
到 Internet Settings 下新增 MaxConnectionPerServer 和 MaxConnectionPer1_0Server,
將其值皆設為 10 即可。
到 Internet Settings 下新增 MaxConnectionPerServer 和 MaxConnectionPer1_0Server,
將其值皆設為 10 即可。
[Windows] 自訂桌面的位置
可以透過 regedit.exe 來修改桌面的位置。
刪掉原先的 WallpaperOriginX 和 WallpaperOriginX,再重新新增兩個一樣名稱但型態為
DWORD 的變數,值就依據想要的位置設定就行。要回復原先的設定,只要刪除兩個變
數,重新開機即可。
刪掉原先的 WallpaperOriginX 和 WallpaperOriginX,再重新新增兩個一樣名稱但型態為
DWORD 的變數,值就依據想要的位置設定就行。要回復原先的設定,只要刪除兩個變
數,重新開機即可。
2010年9月6日 星期一
[C/C++] C++ 的 int 轉成 string class
#include <iostream>
#include <string>
#include <sstream>
using namespace std;
string int2str(int &);
int main(void) {
int i = 1200;
string s;
s = int2str(i);
cout << s << endl;
}
string int2str(int &i) {
string s;
stringstream ss(s);
ss << i;
return ss.str();
}
2010年8月20日 星期五
2010年8月19日 星期四
[C/C++] struct 宣告方式
// =====================
// 方法1: C 和 C++ 都可以用
// =====================
// 方法1: C 和 C++ 都可以用
// =====================
typedef struct Student
{
int id;
char* name;
}Student;
Student student = {1, "Sean"};
{
int id;
char* name;
}Student;
Student student = {1, "Sean"};
// =====================
// 方法2: C 和 C++ 都可以用
// =====================
// ==============================
struct Student
{
int id;
char* name;
};
typedef struct Student student;
Strudent student = {1, "Sean"};
// ==============================
// 方法3: 不需 typedef 只有 C++ 可以用
// ==============================
// ==============================
struct Student
{
int id;
char* name;
};
Strudent student = {1, "Sean"};
2010年8月18日 星期三
電晶體又可分為 BJT 和 FET
電晶體又可分為
/ 射極 (Emitter)
雙載子接面電晶體 BJT(Bipolar Junction Transistor) - 基極 (Base)
\ 集極 (Collector)
和
/ 源極 (Source)
場效電晶體 FET(Field Effect Transistor) - 閘極 (Gate)
\ 汲極 (Drain)
/ 射極 (Emitter)
雙載子接面電晶體 BJT(Bipolar Junction Transistor) - 基極 (Base)
\ 集極 (Collector)
和
/ 源極 (Source)
場效電晶體 FET(Field Effect Transistor) - 閘極 (Gate)
\ 汲極 (Drain)
2010年8月5日 星期四
[BCB] Memo 與 RichEdit
Memo 無法對每一行文字做不同的顏色,
用 RichEdit 則可以透過設定,RichEdit1->SelAttributes->Color = clBlue
來變換文字的顏色。
用 RichEdit 則可以透過設定,RichEdit1->SelAttributes->Color = clBlue
來變換文字的顏色。
2010年8月4日 星期三
[STM32] 學習筆記
最近陪學弟玩 ARM 的 STM32,做了一些筆記,
1. jumpers 向內的腳位連接到核心晶片,朝外的腳位連結到了各個元件(LED、按鈕等)。
2. STM32 與 AVR 和 8051 不同的是,預設 0 (低電位) 為亮 LED, 1 (高電位) 為暗。
3. 要接按鈕的話,把 GPIO 腳位設定成 GPIO_Mode_IPD ( 輸入 Pull-Down ) ,
然後按鈕一端接 pin 腳一端接正,則 pin 腳預設值為 0 ,按下後電流通過變高電位為 1,
反之設成 GPIO_Mode_IPU ( 輸入 Pull-up ),則另一端要接地,按下後變為低電位為 0 。
然後按鈕一端接 pin 腳一端接正,則 pin 腳預設值為 0 ,按下後電流通過變高電位為 1,
反之設成 GPIO_Mode_IPU ( 輸入 Pull-up ),則另一端要接地,按下後變為低電位為 0 。
2010年8月3日 星期二
[BCB] 設定 OpenDialog 開啟資料夾的起始位置
只透過設定 InitialDir ,每次開啟時還是會回到上次開啟檔案的目錄下,
還必須將 Options 下的 ofNoChangeDir 設成 true 才會每次都開啟設定好的位置。
2010年6月29日 星期二
[BCB] 定義自己的鼠標圖示
到 Tools -> Image Editor 就可以直接修改 res 檔的鼠標圖案,
更改完後存檔就可以使用,如果沒有更新,就把 res 檔從 project 從移除,
再 add 一次就行了。(不 add,也可以使用 )
0xfffffff0 ~ 0xffffffff 的位址已有內建的滑鼠圖示,
所以可以從 0x1 開始定義自己要對應的滑鼠圖示,
如下的範例 :
#pragma resource "Project1.res" //使用前要先引入 res
const int crDraw = 6;
HINSTANCE HInst;
HInst = reinterpret_cast<HINSTANCE>(HInstance);
// Load custom cursors for tools from extrares.res
// ABC 是 cusor 的名稱
Screen->Cursors[crDraw] = LoadCursor(HInst, "ABC");
Cursor = TCursor(crDraw);
0xfffffff0 ~ 0xffffffff 的位址已有內建的滑鼠圖示,
所以可以從 0x1 開始定義自己要對應的滑鼠圖示,
如下的範例 :
#pragma resource "Project1.res" //使用前要先引入 res
const int crDraw = 6;
HINSTANCE HInst;
HInst = reinterpret_cast<HINSTANCE>(HInstance);
// Load custom cursors for tools from extrares.res
// ABC 是 cusor 的名稱
Screen->Cursors[crDraw] = LoadCursor(HInst, "ABC");
Cursor = TCursor(crDraw);
2010年5月28日 星期五
[BCB] TStringList 的排序
TStringList *list = new TStringList();
// 原始內容 {"22", "211", "222", "33"};
list->Sort();
// Sort() 後的結果, 是依序比較字串開頭的大小 {211, 22, 222, 33};
// 想按數字大小排序 {22, 33, 211, 222};, 需用 CustomSort()
list->CustomSort(compare);
// 並自訂 compare function
int __fastcall compare(TStringList* List, int Index1, int Index2)
{
if (StrToInt(List->Strings[Index1]) > StrToInt(List->Strings[Index2]))
return 1;
else if (StrToInt(List->Strings[Index1]) == StrToInt(List->Strings[Index2]))
return 0;
else
return -1;
}
// 原始內容 {"22", "211", "222", "33"};
list->Sort();
// Sort() 後的結果, 是依序比較字串開頭的大小 {211, 22, 222, 33};
// 想按數字大小排序 {22, 33, 211, 222};, 需用 CustomSort()
list->CustomSort(compare);
// 並自訂 compare function
int __fastcall compare(TStringList* List, int Index1, int Index2)
{
if (StrToInt(List->Strings[Index1]) > StrToInt(List->Strings[Index2]))
return 1;
else if (StrToInt(List->Strings[Index1]) == StrToInt(List->Strings[Index2]))
return 0;
else
return -1;
}
2010年4月24日 星期六
[BCB] 連結 MySQL 資料庫
想用 BCB 連結 MySQL 資料庫,可以到網路下載 SQLAPI++ 試用版,
藉由 SQLAPI++ 就不需要透過 ODBC 來連接,方便很多。
官網現在最新的版本是 2010/3/24 發佈的 3.7.31 版,
網路上有比較舊 2007/12/11 發佈的 3.7.23 破解版,
不過舊的版本要先執行 "SET NAMES big5" 指令,不然中文印出來會是亂碼。
另外,若要連線到遠端的 MySQL 資料庫,要注意兩點 :
1. 必須在 Server 端的防火牆,新增 MySQL 的連接埠 (MySQL 的預設值為 3306)。
2. 無法用帳號 root 遠端連線,必須另開帳號給予權限。
2010年4月17日 星期六
[PHP] session: Cannot send session cache limiter - headers already sent...
用了 session_start();
Cannot send session cache limiter - headers already sent...
卻出現這樣的訊息,是因為在 session_start() 之前,
就已經有 ouput 東西到前端了, 有兩種方法可以解決.
1. 到 php.ini 裡把 output_buffer 設成 on,這樣 server 端
就會把所有的 output 放到 buffer 裡,在一次送到前端。
2.
ob_start(); // 加上這行
session_start();
Cannot send session cache limiter - headers already sent...
卻出現這樣的訊息,是因為在 session_start() 之前,
就已經有 ouput 東西到前端了, 有兩種方法可以解決.
1. 到 php.ini 裡把 output_buffer 設成 on,這樣 server 端
就會把所有的 output 放到 buffer 裡,在一次送到前端。
2.
ob_start(); // 加上這行
session_start();
2010年4月16日 星期五
[PHP] 上傳中文檔案的問題
如果用 notepad++ 編輯,注意要存成 utf-8 的格式,
另外要將上傳的完整路徑轉換成 big5,
<?
$upload_file = "../file/檔案.txt";
$upload_file = iconv("utf-8", "big5", $upload_file);
move_uploaded_file($_FILES["file"]["tmp_name"][$i], $upload_file);
?>
另外要將上傳的完整路徑轉換成 big5,
<?
$upload_file = "../file/檔案.txt";
$upload_file = iconv("utf-8", "big5", $upload_file);
move_uploaded_file($_FILES["file"]["tmp_name"][$i], $upload_file);
?>
2010年4月15日 星期四
2010年3月16日 星期二
OpenCV 1.1 的錯誤訊息 0xc0150002
如果跑 OpenCV 1.1 的範例,跑出錯誤訊息 "0xc0150002",
應該是因為沒裝 :
Microsoft Visual C++ 2005 SP1 Redistributable Package (x86)
應該是因為沒裝 :
Microsoft Visual C++ 2005 SP1 Redistributable Package (x86)
2010年3月9日 星期二
[BCB] 手動觸發 Event 事件
觸發按下 Button 有兩種方法,
// deffine 在 ComCtrls.hpp// enum TUDBtnType { btNext, btPrev };
1. UpDown1->OnClick(UpDown1, btNext);
1. Button1->Click();
2. Button1->OnClick(Button1);
觸發按下 UpDown 則需要多一個參數,用來辨別是下一頁還是上一頁,
// deffine 在 ComCtrls.hpp
1. UpDown1->OnClick(UpDown1, btNext);
2010年1月17日 星期日
[BCB] ScrollBar 的 Enable
用 Property 視窗把 ScrollBar 的 Enable 設為 false,
好像只有在 Position 為 0 的時候可以,真怪。
只好在程式裡在寫一次 ScrollBar1->Enable = false;
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)