專門放老師給我們的資料
JPEG 相關網站: [From老師的blog]
1. Joint Photographic Experts Group
2. 規格書 ITU 11505 T.81
3. Wikipedia: JPEG
4. 維基百科正體中文: JPEG
Papers:
1.Hide and Seek
程式區:
1.可欣學姊的程式
2.老師的JPEG程式
2007年7月26日 星期四
DCT-DrawYCbCr
int Ymin=0,Cbmin=0,Crmin=0,Ymax=0,Cbmax=0,Crmax=0;
for( i=0 ; i<Im1H ; i++ ){
for( j=0 ; j<Im1W ; j++ )
{
if(Im1QuaY[i][j]<Ymin)
Ymin=Im1QuaY[i][j];//Y min after DCT
if(Im1QuaCb[i][j]<cbmin)
if(Im1QuaCb[i][j]<cbmin)
Cbmin=Im1QuaCb[i][j];//Cb min after DCT
if(Im1QuaCr[i][j]<Crmin)
Crmin=Im1QuaCr[i][j]; //Cr min after DCT
if(Im1QuaY[i][j]>Ymax)
if(Im1QuaY[i][j]>Ymax)
Ymax=Im1QuaY[i][j]; //Y max after DCT
if(Im1QuaCb[i][j]>Cbmax)
if(Im1QuaCb[i][j]>Cbmax)
Cbmax=Im1QuaCb[i][j]; //Cb max after DCT
if(Im1QuaCr[i][j]>Crmax)
if(Im1QuaCr[i][j]>Crmax)
Crmax=Im1QuaCr[i][j]; //Cr max afterDCT }}
/******************************************************
*求出Y,Cb,Cr最大最小值後,換算該範圍
*用於調整長條圖的對稱性
*******************************************************/
if(Ymax>abs(Ymin)){
if(Ymax>abs(Ymin)){
DCTYrange=Ymax*2;
YRange=Ymax;
}
else{
DCTYrange=abs(Ymin)*2;
YRange=abs(Ymin);
}
if(Cbmax>abs(Cbmax)){
if(Cbmax>abs(Cbmax)){
DCTCbrange=Cbmax*2;
CbRange=Cbmax;
}
else{
DCTCbrange=abs(Cbmin)*2;
CbRange=abs(Cbmin);
}
if(Crmax>abs(Crmin)){
if(Crmax>abs(Crmin)){
DCTCrrange=Crmax*2;
CrRange=Crmax;
}
else{
DCTCrrange=abs(Crmin)*2;
CrRange=abs(Crmin);
}
//DCTYrange = Ymax-Ymin;
//DCTCbrange= Cbmax-Cbmin;
//DCTCrrange= Crmax-Crmin;
//↑要改一下....因為這樣左右不平衡....囧
RecordY=new int[DCTYrange];
RecordY=new int[DCTYrange];
RecordCb=new int[DCTCbrange];
RecordCr=new int[DCTCrrange];
for(i=0;i<DCTYrange;i++)
RecordY[i]=0;
for(i=0;i<DCTCbrange;i++)
RecordCb[i]=0;
for(i=0;i<DCTCrrange;i++)
RecordCr[i]=0;
//計算Histogram的高度
//計算Histogram的高度
for( i=0 ; i<Im1H; i++ )
for( j=0 ; j<Im1W; j++ )
{
tempY=Im1QuaY[i][j] + YRange ;
RecordY[ tempY ]++;
tempCb=Im1QuaCb[i][j] + CbRange;
tempCb=Im1QuaCb[i][j] + CbRange;
RecordCb[ tempCb ]++;
tempCr=Im1QuaCr[i][j] + CrRange;
tempCr=Im1QuaCr[i][j] + CrRange;
RecordCr[ tempCr ]++;
}
Ymax=0;Cbmax=0;Crmax=0;
Ymax=0;Cbmax=0;Crmax=0;
for( i=0 ; i<DCTYrange ; i++ )
{
if(RecordY[i]>Ymax)
Ymax=RecordY[i];
}
for( i=0 ; i<DCTCbrange ; i++ )
{
if(RecordCb[i]>Cbmax)
Cbmax=RecordCb[i];
}
for( i=0 ; i
Image7->Picture->Bitmap->Width=DCTCrrange*2;
{
if(RecordCr[i]>Crmax)
Crmax=RecordCr[i];
}
Image5->Picture->Bitmap->Width= DCTYrange*2;
Image5->Picture->Bitmap->Width= DCTYrange*2;
Image5->Picture->Bitmap->Height=Ymax;
Image5->Picture->Bitmap->PixelFormat=pf24bit;
Image5->AutoSize=true;
Image6->Picture->Bitmap->Width=DCTCbrange*2;
Image6->Picture->Bitmap->Height=Cbmax;
Image6->Picture->Bitmap->PixelFormat=pf24bit;
Image6->AutoSize=true;
Image7->Picture->Bitmap->Width=DCTCrrange*2;
Image7->Picture->Bitmap->Height=Crmax;
Image7->Picture->Bitmap->PixelFormat=pf24bit;
Image7->AutoSize=true;
for( i=0 ; i<DCTYrange ; i++ )
for( i=0 ; i<DCTYrange ; i++ )
{
j=RecordY[i];
k=Ymax;
Image5->Canvas->MoveTo(i*2,k);
Image5->Canvas->LineTo(i*2,k-j);
} for( i=0 ; i<DCTCbrange ; i++ )
{
j=RecordCb[i];
k=Cbmax;
Image6->Canvas->MoveTo(i*2,k);
Image6->Canvas->LineTo(i*2,k-j);
}
for( i=0 ; i<DCTCrrange ; i++ )
{
j=RecordCr[i];
k=Crmax;
Image7->Canvas->MoveTo(i*2,k);
Image7->Canvas->LineTo(i*2,k-j);
}
DCT-OPEN
if(OpenPictureDialog1->Execute())
{
Image1->Picture->LoadFromFile(OpenPictureDialog1->FileName);
}
Image1->AutoSize=true;
Im1H = Image1->Height;
Im1W = Image1->Width;
Image1->Picture->Bitmap->Width=Im1W;
Image1->Picture->Bitmap->Height=Im1H;
Image1->Picture->Bitmap->PixelFormat=pf24bit;
Im1R=new int *[Im1H];
Im1G=new int *[Im1H];
Im1B=new int *[Im1H];
Im1Y=new double *[Im1H];
Im1Cb=new double *[Im1H];
Im1Cr=new double *[Im1H];
Im1DCTY=new double *[Im1H];
Im1DCTCb=new double *[Im1H];
Im1DCTCr=new double *[Im1H];
Im1QuaY=new double *[Im1H];
Im1QuaCb=new double *[Im1H];
Im1QuaCr=new double *[Im1H];
for( i=0; i<Im1H ; i++ )
{
Im1R[i]=new int[Im1W];
Im1G[i]=new int[Im1W];
Im1B[i]=new int[Im1W];
Im1Y[i]=new double[Im1W];
Im1Cb[i]=new double[Im1W];
Im1Cr[i]=new double[Im1W];
Im1DCTY[i]= new double[Im1W];
Im1DCTCb[i]= new double[Im1W];
Im1DCTCr[i]= new double[Im1W];
Im1QuaY[i]=new double [Im1W];
Im1QuaCb[i]=new double [Im1W];
Im1QuaCr[i]=new double [Im1W];
}
for( i=0 ; i {
ptr =(Byte *)Image1->Picture->Bitmap->ScanLine[i];
for( j=0 ; j<Im1W; j++ )
{
Im1R[i][j]=(int)ptr[j*3+2];
tempR=ptr[j*3+2];
RecordR[tempR]++;
//****************
Im1G[i][j]=(int)ptr[j*3+1];
tempG=ptr[j*3+1];
RecordG[tempG]++;
//****************
Im1B[i][j]=(int)ptr[j*3];
tempB=(int)ptr[j*3];
RecordB[tempB]++;
//=====Y,Cb,Cr分格線=====
Im1Y[i][j]=0.2990*(double)tempR+0.5870*(double)tempG+0.1140*(double)tempB;
Im1Cb[i][j]=0.1687*(double)tempR-0.3313*(double)tempG+0.5000*(double)tempB;
Im1Cr[i][j]=0.5000*(double)tempR-0.4187*(double)tempG-0.0813*(double)tempB;
}
}
{
Image1->Picture->LoadFromFile(OpenPictureDialog1->FileName);
}
Image1->AutoSize=true;
Im1H = Image1->Height;
Im1W = Image1->Width;
Image1->Picture->Bitmap->Width=Im1W;
Image1->Picture->Bitmap->Height=Im1H;
Image1->Picture->Bitmap->PixelFormat=pf24bit;
Im1R=new int *[Im1H];
Im1G=new int *[Im1H];
Im1B=new int *[Im1H];
Im1Y=new double *[Im1H];
Im1Cb=new double *[Im1H];
Im1Cr=new double *[Im1H];
Im1DCTY=new double *[Im1H];
Im1DCTCb=new double *[Im1H];
Im1DCTCr=new double *[Im1H];
Im1QuaY=new double *[Im1H];
Im1QuaCb=new double *[Im1H];
Im1QuaCr=new double *[Im1H];
for( i=0; i<Im1H ; i++ )
{
Im1R[i]=new int[Im1W];
Im1G[i]=new int[Im1W];
Im1B[i]=new int[Im1W];
Im1Y[i]=new double[Im1W];
Im1Cb[i]=new double[Im1W];
Im1Cr[i]=new double[Im1W];
Im1DCTY[i]= new double[Im1W];
Im1DCTCb[i]= new double[Im1W];
Im1DCTCr[i]= new double[Im1W];
Im1QuaY[i]=new double [Im1W];
Im1QuaCb[i]=new double [Im1W];
Im1QuaCr[i]=new double [Im1W];
}
for( i=0 ; i
ptr =(Byte *)Image1->Picture->Bitmap->ScanLine[i];
for( j=0 ; j<Im1W; j++ )
{
Im1R[i][j]=(int)ptr[j*3+2];
tempR=ptr[j*3+2];
RecordR[tempR]++;
//****************
Im1G[i][j]=(int)ptr[j*3+1];
tempG=ptr[j*3+1];
RecordG[tempG]++;
//****************
Im1B[i][j]=(int)ptr[j*3];
tempB=(int)ptr[j*3];
RecordB[tempB]++;
//=====Y,Cb,Cr分格線=====
Im1Y[i][j]=0.2990*(double)tempR+0.5870*(double)tempG+0.1140*(double)tempB;
Im1Cb[i][j]=0.1687*(double)tempR-0.3313*(double)tempG+0.5000*(double)tempB;
Im1Cr[i][j]=0.5000*(double)tempR-0.4187*(double)tempG-0.0813*(double)tempB;
}
}
DCT Code (參考學姊,略為修改)
void DCT(int DCTW,int DCTH)
{
for(u = 0;u < v =" 0;v" dbtemp1 =" 0;" dbtemp2 =" 0;" dbtemp3 =" 0;" u ="="" cu =" (double)1/"> 0)
Cu = 1;
if(v == 0)
Cv = (double)1/ sqrt(2);
else if(v > 0)
Cv = 1;
for(i = 0;i < 8;i++)
{
for(j = 0;j < 8;j++)
{
dbTemp1 += (Im1Y[DCTH+i][DCTW + j]-128) * cos((2*i+1) * u * M_PI/16) * cos((2*j+1) * v * M_PI/16);
dbTemp2 += (Im1Cb[DCTH+i][DCTW + j]-128) * cos((2*i+1) * u * M_PI/16) * cos((2*j+1) * v * M_PI/16);
dbTemp3 += (Im1Cr[DCTH+i][DCTW + j]-128) * cos((2*i+1) * u * M_PI/16) * cos((2*j+1) * v * M_PI/16);
}
}
//陣列還沒改變需要更改
Im1DCTY[DCTH+u][DCTW+v] = (Cu * Cv * dbTemp1)/(double)4;
Im1DCTCb[DCTH+u][DCTW+v] = (Cu * Cv * dbTemp2)/(double)4;
Im1DCTCr[DCTH+u][DCTW+v] = (Cu * Cv * dbTemp3)/(double)4;
Im1QuaY[DCTH+u][DCTW+v]= Im1DCTY[DCTH+u][DCTW+v]/YQT[u][v];
Im1QuaCb[DCTH+u][DCTW+v]=Im1DCTCb[DCTH+u][DCTW+v]/CbCrQT[u][v];
Im1QuaCr[DCTH+u][DCTW+v]=Im1DCTCr[DCTH+u][DCTW+v]/CbCrQT[u][v];
}
}
i = DCTW;
j = DCTH;
}
{
for(u = 0;u < v =" 0;v" dbtemp1 =" 0;" dbtemp2 =" 0;" dbtemp3 =" 0;" u ="="" cu =" (double)1/"> 0)
Cu = 1;
if(v == 0)
Cv = (double)1/ sqrt(2);
else if(v > 0)
Cv = 1;
for(i = 0;i < 8;i++)
{
for(j = 0;j < 8;j++)
{
dbTemp1 += (Im1Y[DCTH+i][DCTW + j]-128) * cos((2*i+1) * u * M_PI/16) * cos((2*j+1) * v * M_PI/16);
dbTemp2 += (Im1Cb[DCTH+i][DCTW + j]-128) * cos((2*i+1) * u * M_PI/16) * cos((2*j+1) * v * M_PI/16);
dbTemp3 += (Im1Cr[DCTH+i][DCTW + j]-128) * cos((2*i+1) * u * M_PI/16) * cos((2*j+1) * v * M_PI/16);
}
}
//陣列還沒改變需要更改
Im1DCTY[DCTH+u][DCTW+v] = (Cu * Cv * dbTemp1)/(double)4;
Im1DCTCb[DCTH+u][DCTW+v] = (Cu * Cv * dbTemp2)/(double)4;
Im1DCTCr[DCTH+u][DCTW+v] = (Cu * Cv * dbTemp3)/(double)4;
Im1QuaY[DCTH+u][DCTW+v]= Im1DCTY[DCTH+u][DCTW+v]/YQT[u][v];
Im1QuaCb[DCTH+u][DCTW+v]=Im1DCTCb[DCTH+u][DCTW+v]/CbCrQT[u][v];
Im1QuaCr[DCTH+u][DCTW+v]=Im1DCTCr[DCTH+u][DCTW+v]/CbCrQT[u][v];
}
}
i = DCTW;
j = DCTH;
}
2007年7月19日 星期四
Arduino-程式碼(講師提供)
int a = 2;
int b = 3;
int reset = 4;
int clock = 5;
int sw1 = 13;
int sw2 = 12;
int val1 = 0;
int val2 = 0;
void setup()
{
beginSerial(9600);
pinMode(a,OUTPUT);
pinMode(b,OUTPUT);
pinMode(reset,OUTPUT);
pinMode(clock,OUTPUT);
pinMode(sw1,INPUT);
pinMode(sw2,INPUT);
}
void loop()
{
digitalWrite(reset,1);
val1 = digitalRead(sw1);
val2 = digitalRead(sw2);
if (val1==1&&val2==0){
inputOn();
clockRun();
}
if (val1==1&&val2==1){
inputOff();
clockRun();
}
}
void clockRun()
{
digitalWrite(clock,1);
delay(100);
digitalWrite(clock,0);
delay(100);
}
void inputOn()
{
digitalWrite(a,1);
digitalWrite(b,1);
}
void inputOff()
{
digitalWrite(a,0);
digitalWrite(b,0);
}
void resetall()
{
digitalWrite(reset,1);
digitalWrite(reset,0);
digitalWrite(reset,1);
}
int b = 3;
int reset = 4;
int clock = 5;
int sw1 = 13;
int sw2 = 12;
int val1 = 0;
int val2 = 0;
void setup()
{
beginSerial(9600);
pinMode(a,OUTPUT);
pinMode(b,OUTPUT);
pinMode(reset,OUTPUT);
pinMode(clock,OUTPUT);
pinMode(sw1,INPUT);
pinMode(sw2,INPUT);
}
void loop()
{
digitalWrite(reset,1);
val1 = digitalRead(sw1);
val2 = digitalRead(sw2);
if (val1==1&&val2==0){
inputOn();
clockRun();
}
if (val1==1&&val2==1){
inputOff();
clockRun();
}
}
void clockRun()
{
digitalWrite(clock,1);
delay(100);
digitalWrite(clock,0);
delay(100);
}
void inputOn()
{
digitalWrite(a,1);
digitalWrite(b,1);
}
void inputOff()
{
digitalWrite(a,0);
digitalWrite(b,0);
}
void resetall()
{
digitalWrite(reset,1);
digitalWrite(reset,0);
digitalWrite(reset,1);
}
Arduino-程式碼(紅綠燈)
int greenPin=11;
int redPin=10;
int yellowPin=9;
int value=0;
void setup(){
pinMode(greenPin,OUTPUT);
pinMode(redPin,OUTPUT);
pinMode(yellowPin,OUTPUT);
}
void loop(){
if(value==0)
{
digitalWrite(greenPin,HIGH);
digitalWrite(redPin,LOW);
digitalWrite(yellowPin,LOW);
delay(5000);
value=1;
}
if(value==1)
{
digitalWrite(redPin,LOW);
digitalWrite(greenPin,LOW);
digitalWrite(yellowPin,HIGH);
delay(1000);
value=2;
}
if(value==2)
{
digitalWrite(yellowPin,LOW);
digitalWrite(greenPin,LOW);
digitalWrite(redPin,HIGH);
delay(2000);
value=0;
}
}
//這是我自己寫的....
int redPin=10;
int yellowPin=9;
int value=0;
void setup(){
pinMode(greenPin,OUTPUT);
pinMode(redPin,OUTPUT);
pinMode(yellowPin,OUTPUT);
}
void loop(){
if(value==0)
{
digitalWrite(greenPin,HIGH);
digitalWrite(redPin,LOW);
digitalWrite(yellowPin,LOW);
delay(5000);
value=1;
}
if(value==1)
{
digitalWrite(redPin,LOW);
digitalWrite(greenPin,LOW);
digitalWrite(yellowPin,HIGH);
delay(1000);
value=2;
}
if(value==2)
{
digitalWrite(yellowPin,LOW);
digitalWrite(greenPin,LOW);
digitalWrite(redPin,HIGH);
delay(2000);
value=0;
}
}
//這是我自己寫的....
2007年7月17日 星期二
JSteg
Input: message, cover image
Output: stego image
while data left to embed do
get next DCT coefficient from cover image
if DCT ≠ 0 and DCT ≠ 1 then
get next LSB from message
replace DCT LSB with message LSB
end if
insert DCT into stego image
end while
這是JSteg的Algorithm
Output: stego image
while data left to embed do
get next DCT coefficient from cover image
if DCT ≠ 0 and DCT ≠ 1 then
get next LSB from message
replace DCT LSB with message LSB
end if
insert DCT into stego image
end while
這是JSteg的Algorithm
2007年7月16日 星期一
[嘗試翻譯]Hide and Seek--An Introduction to Stegangraphy
原文:http://niels.xtdnet.nl/papers/practical.pdf
Steganography 是隱藏情報的科學與藝術;一個Steganographic的系統,可以用Media將訊息覆蓋,這樣一來,就不會引起監聽者的懷疑。在過去,人們使用隱藏的刺青或是隱形墨水來傳送或傳達Steganographic訊息。現在,電腦與網路的科技提供Steganography一個易於使用溝通方式。
本來,一個Steganographic的系統在處理資訊隱藏的程序上,開始於定義(鑑定、辨識)一個多餘的媒介(那些可以被修飾)那些植入的程序創造了一個stego medium,被隱藏資料的多餘位元取代。
現代的Steganography的目標,是不僅保持隱藏訊息存在時不被偵測,那些系統讓資料藏的更自然。--讓人遺忘或沒想過要去追查是否有問題。
如果秘密的容器不被暴露(洩漏),它的存在不過就是修飾覆蓋的媒介,改變了它的統計過後的特性,如此一來監聽者能偵測到是失真的統計數據結果。
那個使之找到失真數據的程序叫做統計學上的Steganalysis
這篇文章討論已經存在的Steganographic系統以及目前新進的搜尋偵測技術。
其他調查的焦點在一般的資訊隱藏使用方法上,或提供一個過去使用的偵測用演算法。在這裡,我們準備了新的搜尋方法跟議題以及新的演算法以及與其有關的應用程式。
The basic of embedding
資訊隱藏系統有三個不同的重點,分別是:容量(可藏的資料量)、安全性、強韌性。
容量是指是否能容納下大量的資訊、安全性是指是否能被輕易的偵測到、強韌性則是指隱藏資料的媒介是否容易因為被調動而導致資料被摧毀。
說到資訊隱藏,一般泛指water-marking跟Steganography。
一個water-marking的系統追求高程度的強度,也就是藏進去的東西不可能被移除或是摧毀。而Steganography則是追求容量與安全性。
一個傳統的Steganography系統的安全性依賴於系統的密碼,這種類型可以以羅馬過去的系統作為範例,他們將密碼刺在沒有頭髮的頭皮上。等到頭髮長出來,他就可以將訊息傳送過去。雖然這種方法很花時間,但是這個方法已經足夠通過檢測。
現在的Steganography試圖變成需要擁有一個密碼才能偵測到秘密訊息,也就是所謂的Key。
Steganography 是隱藏情報的科學與藝術;一個Steganographic的系統,可以用Media將訊息覆蓋,這樣一來,就不會引起監聽者的懷疑。在過去,人們使用隱藏的刺青或是隱形墨水來傳送或傳達Steganographic訊息。現在,電腦與網路的科技提供Steganography一個易於使用溝通方式。
本來,一個Steganographic的系統在處理資訊隱藏的程序上,開始於定義(鑑定、辨識)一個多餘的媒介(那些可以被修飾)那些植入的程序創造了一個stego medium,被隱藏資料的多餘位元取代。
現代的Steganography的目標,是不僅保持隱藏訊息存在時不被偵測,那些系統讓資料藏的更自然。--讓人遺忘或沒想過要去追查是否有問題。
如果秘密的容器不被暴露(洩漏),它的存在不過就是修飾覆蓋的媒介,改變了它的統計過後的特性,如此一來監聽者能偵測到是失真的統計數據結果。
那個使之找到失真數據的程序叫做統計學上的Steganalysis
這篇文章討論已經存在的Steganographic系統以及目前新進的搜尋偵測技術。
其他調查的焦點在一般的資訊隱藏使用方法上,或提供一個過去使用的偵測用演算法。在這裡,我們準備了新的搜尋方法跟議題以及新的演算法以及與其有關的應用程式。
The basic of embedding
資訊隱藏系統有三個不同的重點,分別是:容量(可藏的資料量)、安全性、強韌性。
容量是指是否能容納下大量的資訊、安全性是指是否能被輕易的偵測到、強韌性則是指隱藏資料的媒介是否容易因為被調動而導致資料被摧毀。
說到資訊隱藏,一般泛指water-marking跟Steganography。
一個water-marking的系統追求高程度的強度,也就是藏進去的東西不可能被移除或是摧毀。而Steganography則是追求容量與安全性。
一個傳統的Steganography系統的安全性依賴於系統的密碼,這種類型可以以羅馬過去的系統作為範例,他們將密碼刺在沒有頭髮的頭皮上。等到頭髮長出來,他就可以將訊息傳送過去。雖然這種方法很花時間,但是這個方法已經足夠通過檢測。
現在的Steganography試圖變成需要擁有一個密碼才能偵測到秘密訊息,也就是所謂的Key。
針對圖片的YCbCr繪製長條圖
//----第一段程式,做YCbCr的統計----
for(i = 0;i < j =" 0;j">0)
RecordY[ (int)dbIm1Y[j][i] ]++;
else
//處理Y負值的統計
if(dbIm1Cb[j][i]>0)
RecordCb[ (int)dbIm1Cb[j][i] ]++;
else
//處理Cb負值的統計
if(dbIm1Cr[j][i]>0)
RecordCb[ (int)dbIm1Cr[j][i] ]++;
else
//處理Cr負值的統計
}
}
//----第二段程式,處理Y的圖形----
int Im2H,Im2W; //使用Image2
Im2H=Image2->Height; //取得Canvas大小
Im2W=Image2->Width;
Image2->Picture->Bitmap->Width=Im2W; //指定BitMap的大小
Image2->Picture->Bitmap->Height=Im2H;
Image2->Picture->Bitmap->PixelFormat=pf24bit; //指定該圖是24bit的圖
for(i=0;i<300;i++)
{
j=RecordY[i]/6;
Image2->Canvas->MoveTo(2*i+1,300);
Image2->Canvas->LineTo(2*i+1,300-j);
}
//----第三段程式,處理Cb的圖型----
int Im3H,Im3W; //畫在Image3上面
Im3H=Image3->Height; //取得Canvas大小
Im3W=Image3->Width;
Image3->Picture->Bitmap->Width=Im3W; //指定BitMap的大小
Image3->Picture->Bitmap->Height=Im3H;
Image3->Picture->Bitmap->PixelFormat=pf24bit; //指定該圖是24bit的圖
for(i=0;i<300;i++) j="RecordCb[i]/6; ">Canvas->MoveTo(2*i+1,300);
Image3->Canvas->LineTo(2*i+1,300-j);
}
//----第四段程式,處理Cr的圖形----
Im4H,Im4W;
Im4H=Image4->Height; //取得Canvas大小
Im4W=Image4->Width;
Image4->Picture->Bitmap->Width=Im4W; //指定BitMap的大小
Image4->Picture->Bitmap->Height=Im4H;
Image4->Picture->Bitmap->PixelFormat=pf24bit; //指定該圖是24bit的圖
for(i=0;i<300;i++)>
{
j=RecordCr[i]/6;
Image4->Canvas->MoveTo(2*i+1,300);
Image4->Canvas->LineTo(2*i+1,300-j);
}
for(i = 0;i < j =" 0;j">0)
RecordY[ (int)dbIm1Y[j][i] ]++;
else
//處理Y負值的統計
if(dbIm1Cb[j][i]>0)
RecordCb[ (int)dbIm1Cb[j][i] ]++;
else
//處理Cb負值的統計
if(dbIm1Cr[j][i]>0)
RecordCb[ (int)dbIm1Cr[j][i] ]++;
else
//處理Cr負值的統計
}
}
//----第二段程式,處理Y的圖形----
int Im2H,Im2W; //使用Image2
Im2H=Image2->Height; //取得Canvas大小
Im2W=Image2->Width;
Image2->Picture->Bitmap->Width=Im2W; //指定BitMap的大小
Image2->Picture->Bitmap->Height=Im2H;
Image2->Picture->Bitmap->PixelFormat=pf24bit; //指定該圖是24bit的圖
for(i=0;i<300;i++)
{
j=RecordY[i]/6;
Image2->Canvas->MoveTo(2*i+1,300);
Image2->Canvas->LineTo(2*i+1,300-j);
}
//----第三段程式,處理Cb的圖型----
int Im3H,Im3W; //畫在Image3上面
Im3H=Image3->Height; //取得Canvas大小
Im3W=Image3->Width;
Image3->Picture->Bitmap->Width=Im3W; //指定BitMap的大小
Image3->Picture->Bitmap->Height=Im3H;
Image3->Picture->Bitmap->PixelFormat=pf24bit; //指定該圖是24bit的圖
for(i=0;i<300;i++) j="RecordCb[i]/6; ">Canvas->MoveTo(2*i+1,300);
Image3->Canvas->LineTo(2*i+1,300-j);
}
//----第四段程式,處理Cr的圖形----
Im4H,Im4W;
Im4H=Image4->Height; //取得Canvas大小
Im4W=Image4->Width;
Image4->Picture->Bitmap->Width=Im4W; //指定BitMap的大小
Image4->Picture->Bitmap->Height=Im4H;
Image4->Picture->Bitmap->PixelFormat=pf24bit; //指定該圖是24bit的圖
for(i=0;i<300;i++)>
{
j=RecordCr[i]/6;
Image4->Canvas->MoveTo(2*i+1,300);
Image4->Canvas->LineTo(2*i+1,300-j);
}
訂閱:
文章 (Atom)