MFC對話框繪製灰度直方圖

本文主要講述基於VC++6.0 MFC圖像處理的應用知識,主要結合自己大三所學課程《數字圖像處理》及課件進行回憶講解,主要通過MFC單文檔視圖實現點擊彈出對話框繪製BMP圖片的灰度直方圖,再獲取平均灰度、中指灰度和標準差等值。文章比較詳細基礎,希望該篇文章對你有所幫助~
       【數字圖像處理】一.MFC詳解顯示BMP格式圖片
       【數字圖像處理】二.MFC單文檔分割窗口顯示圖片
       【數字圖像處理】三.MFC實現圖像灰度、採樣和量化功能詳解
        免費資源下載地址:
        http://download.csdn.net/detail/eastmount/8757243

 

一. 程序運行結果

        該篇文章主要是在上一篇文章基礎上進行的講解,其中當打開一張BMP圖像後,點擊”直方圖“-》”顯示原圖直方圖“如下。




 

二. 灰度直方圖原理

        什麼是灰度直方圖?
        灰度直方圖(histogram)是灰度級的函數,描述的是圖像中每種灰度級像素的個數,反映圖像中每種灰度出現的頻率。橫座標是灰度級,縱座標是灰度級出現的頻率。


        對於連續圖像,平滑地從中心的高灰度級變化到邊緣的低灰度級。直方圖定義爲:

        其中A(D)爲閾值面積函數:爲一幅連續圖像中被具有灰度級D的所有輪廓線所包圍的面積。對於離散函數,固定ΔD爲1,則:H(D)=A(D)-A(D+1)
        色彩直方圖是高維直方圖的特例,它統計色彩的出現頻率,即色彩概率分佈信息。
        通常這需要一定的量化過程,將色彩分成若干互不重疊的種類。一般不直接在RGB色彩空間中統計,而是在將亮度分離出來後,對代表色彩部分的信息進行統計,如在HSI空間的HS子空間、YUV空間的UV子空間,以及其它反映人類視覺特點的彩色空間表示中進行。
        其中直方圖的計算方法如下:
        依據定義,若圖像具有L(通常L=256,即8位灰度級)級灰度,則大小爲MxN的灰度圖像f(x,y)的灰度直方圖hist[0…L-1]可用如下計算獲得。
        1、初始化 hist[k]=0; k=0,…,L-1 
        2、統計 hist[f(x,y)]++; x=0,…,M-1, y =0,…,N-1 
        3、歸一化 hist[f(x,y)]/=M*N 
        那麼說了這麼多,直方圖究竟有什麼作用呢?
        在使用輪廓線確定物體邊界時,通過直方圖更好的選擇邊界閾值,進行閾值化處理;對物體與背景有較強對比的景物的分割特別有用;簡單物體的面積和綜合光密度IOD可以通過圖像的直方圖求得。

 

 

三. 程序實現

 

1.建立直方圖對話框

       第一步:創建Dialog
        將視圖切換到ResourceView界面,選中Dialog右鍵鼠標新建一個Dialog,並新建一個名爲IDD_DIALOG_ZFT,設置成下圖對話框。

 

        右鍵添加屬性如下:
        對話框-原始直方圖-IDD_DIALOG_ZFT
        組框-RGB-IDC_STATIC_RGB
        圖像-框架-IDC_STATIC_KJ-蝕刻(重點:有它才能添加直方圖在此處,注意GetDlgItem()函數中是IDC而不是IDD對話框)
        添加蝕刻線(圖像蝕刻形成的直線)形如圖中的3個矩形框,並添加靜態文本:Red、Green、Blue、紅、綠、藍、像素、平均灰度、中值灰度、標準差;這些靜態文本都是IDC_STATIC且爲默認屬性
        添加紅色4個值(Static)、綠色4個值、藍色4個值,分別爲:
        IDC_STATIC_XS_RED(GREEN BLUE)對應像素XS
        IDC_STATIC_PJHD_RED(GREEN BLUE)對應平均灰度PJHD
        IDC_STATIC_ZZHD_RED(GREED BLUE)對應中值灰度ZZHD
        IDC_STATIC_BZC_RED(GREEN BLUE)對應標準差BZC
 

       第二步:建立類嚮導MFC ClassWizard
        (1) 在對話框資源模板空白區雙擊鼠標(Ctrl+W),創建一個新類,命名爲CImageZFTDlg會自動生成它的.h和.cpp文件。在類嚮導中選中類名CImageZFTDlg,IDs爲CImageZFTDlg,WM_INITDIALOG建立這個函數用於初始化。
        (2) 打開類嚮導,選擇Member Variables頁面,添加如下變量,類型均爲CString。
        像素 m_redXS、m_greenXS、m_blueXS
        標準差 m_redBZC、m_greeenBZC、m_blueBZC
        平均灰度 m_redPJHD、m_greenPJHD、m_bluePJHD
        中值灰度 m_redZZHD、m_greenZZHD、m_blueZZHD

        (3) 在View.cpp中添加直方圖的頭文件 #include "ImageZFTDlg.h"

        第三步:設置菜單欄調用直方圖對話框
        (1) 將視圖切換到ResourceView界面,選中Menu,在IDR_MAINFRAM中添加菜單項“直方圖”,菜單屬性中選擇“彈出”,在“直方圖”中添加子菜單“顯示原圖直方圖”。
        (2) 設置其屬性爲ID_ZFT_YT(顯示直方圖原圖),同時建立類嚮導,選擇ID_ZFT_YT(IDs),通過COMMAND建立顯示直方圖函數OnZftYt()。


       第四步:添加代碼及計算4個值
        在ImageProcessingView.cpp中添加如下代碼,註釋中有如何求平均灰度、中值灰度和標準差的消息算法過程。


 
  1. //引用顯示直方圖頭文件

  2. #include "ImageZFTDlg.h"

  3. #include "math.h"

  4.  
  5. /*全局變量在TestZFTDlg.cpp中引用 用extern*/

  6. int Red[256],Green[256],Blue[256];

  7.  
  8. /**************************************************/

  9. /* 添加直方圖顯示功能,並在直方圖下方顯示相關信息

  10. /* 如平均灰度、中值灰度、標準差和像素總數

  11. /* ID_ZFT_YT:直方圖原圖顯示

  12. /**************************************************/

  13. void CImageProcessingView::OnZftYt()

  14. {

  15. if(numPicture==0) {

  16. AfxMessageBox("載入圖片後才能顯示原圖直方圖!",MB_OK,0);

  17. return;

  18. }

  19. AfxMessageBox("顯示原圖直方圖!",MB_OK,0);

  20. CImageZFTDlg dlg;

  21.  
  22. //打開臨時的圖片

  23. FILE *fpo = fopen(BmpName,"rb");

  24. fread(&bfh,sizeof(BITMAPFILEHEADER),1,fpo);

  25. fread(&bih,sizeof(BITMAPINFOHEADER),1,fpo);

  26.  
  27. int i,j;

  28. for(j=0;j<256;j++) { //定義數組並清零

  29. Red[j]=0;

  30. Green[j]=0;

  31. Blue[j]=0;

  32. }

  33.  
  34. //計算4個數據

  35. unsigned char red,green,blue;

  36. int IntRed,IntGreen,IntBlue; //強制轉換

  37. double sumRedHD=0,sumGreenHD=0,sumBlueHD=0; //記錄像素總的灰度值和

  38. for(i=0; i<m_nImage/3; i++ )

  39. {

  40. fread(&red,sizeof(char),1,fpo);

  41. IntRed=int(red);

  42. sumRedHD=sumRedHD+IntRed;

  43. if( IntRed>=0 && IntRed<256 ) Red[IntRed]++; //像素0-255之間

  44.  
  45. fread(&green,sizeof(char),1,fpo);

  46. IntGreen=int(green);

  47. sumGreenHD=sumGreenHD+IntGreen;

  48. if( IntGreen>=0 && IntGreen<256 ) Green[IntGreen]++;

  49.  
  50. fread(&blue,sizeof(char),1,fpo);

  51. IntBlue=int(blue);

  52. sumBlueHD=sumBlueHD+IntBlue;

  53. if( IntBlue>=0 && IntBlue<256 ) Blue[IntBlue]++;

  54. }

  55. fclose(fpo);

  56.  
  57. //像素:int型轉換爲CString型

  58. dlg.m_redXS.Format("%d",m_nImage);

  59. dlg.m_greenXS.Format("%d",m_nImage);

  60. dlg.m_blueXS.Format("%d",m_nImage);

  61.  
  62. //平均灰度值:計算24位bmp圖片的灰度值,我是記錄RGB中的所有平均值

  63. float pinRedHD,pinGreenHD,pinBlueHD;

  64. pinRedHD=sumRedHD*3/m_nImage;

  65. pinGreenHD=sumGreenHD*3/m_nImage; //平均灰度=總灰度/總像素

  66. pinBlueHD=sumBlueHD*3/m_nImage;

  67.  
  68. dlg.m_redPJHD.Format("%.2f",pinRedHD);

  69. dlg.m_greenPJHD.Format("%.2f",pinGreenHD);

  70. dlg.m_bluePJHD.Format("%.2f",pinBlueHD);

  71.  
  72. /****************************************************************/

  73. /* 中值灰度:算法重點(黃凱大神提供)

  74. /* 中值灰度:所有像素中的中位數,應該所有像素排序找到中間的灰度值

  75. /* 算法:num[256]記錄各灰度出現次數,sum+=num[i],找到sum=總像素/2

  76. /****************************************************************/

  77. int sumRedZZHD=0,sumGreenZZHD=0,sumBlueZZHD=0;

  78. int redZZHD,greenZZHD,blueZZHD;

  79. for(i=0;i<256;i++)

  80. {

  81. sumRedZZHD=sumRedZZHD+Red[i];

  82. if(sumRedZZHD>=m_nImage/6) //m_nImage被分成3份RGB並且sum=總像素/2

  83. {

  84. redZZHD=i;

  85. break;

  86. }

  87. }

  88. for(i=0;i<256;i++)

  89. {

  90. sumGreenZZHD=sumGreenZZHD+Green[i];

  91. if(sumGreenZZHD>=m_nImage/6) //m_nImage被分成3份RGB並且sum=總像素/2

  92. {

  93. greenZZHD=i;

  94. break;

  95. }

  96. }

  97. for(i=0;i<256;i++)

  98. {

  99. sumBlueZZHD=sumBlueZZHD+Blue[i];

  100. if(sumBlueZZHD>=m_nImage/6) //m_nImage被分成3份RGB並且sum=總像素/2

  101. {

  102. blueZZHD=i;

  103. break;

  104. }

  105. }

  106.  
  107. dlg.m_redZZHD.Format("%d",redZZHD);

  108. dlg.m_greenZZHD.Format("%d",greenZZHD);

  109. dlg.m_blueZZHD.Format("%d",blueZZHD);

  110.  
  111. /******************************************************************/

  112. /*標準差:標準差=方差的算術平方根

  113. /* 方差s^2=[(x1-x)^2+(x2-x)^2+......(xn-x)^2]/n

  114. /* 算法:不用開m_nImage數組進行計算 用num[256]中數進行

  115. /* 方差=(平均灰度-i)*(平均灰度-i)*Red[i] 有Red[i]個灰度值爲i的數

  116. /******************************************************************/

  117. float redBZC,greenBZC,blueBZC; //標準差

  118. double redFC=0,greenFC=0,blueFC=0; //方差

  119. for(i=0;i<256;i++)

  120. {

  121. redFC=redFC+(pinRedHD-i)*(pinRedHD-i)*Red[i]; //有Red[i]個像素i

  122. greenFC=greenFC+(pinGreenHD-i)*(pinGreenHD-i)*Green[i];

  123. blueFC=blueFC+(pinBlueHD-i)*(pinBlueHD-i)*Blue[i];

  124. }

  125.  
  126. redBZC=sqrt(redFC*3/m_nImage);

  127. greenBZC=sqrt(greenFC*3/m_nImage);

  128. blueBZC=sqrt(blueFC*3/m_nImage);

  129.  
  130. dlg.m_redBZC.Format("%.2lf",redBZC);

  131. dlg.m_greenBZC.Format("%.2lf",greenBZC);

  132. dlg.m_blueBZC.Format("%.2lf",blueBZC);

  133.  
  134. //重點必須添加該語句才能彈出對話框

  135. if(dlg.DoModal()==IDOK)

  136. {

  137.  
  138. }

  139. }

        第五步:此時運行結果如下圖所示,打開圖片可以顯示參數。



 

2.建立對話框與View聯繫並繪製直方圖

        重點(極其重要*)
        (1) 如何在MFC中(View中)實現對子對話框的畫圖或直方圖響應?
        解決方法:在子對話框中.cpp文件中實現畫圖響應,不要再View.cpp中實現,否則圖像會以menu背景爲座標,而在ImageZFTDlg.cpp中建立OnPaint函數實現畫圖,它默認會以子對話框爲標準。
        (2) 如何把View.cpp中的圖片像素直方圖信息傳遞給子對話框ImageZFTDlg.cpp呢?
        解決方法:如果自定義ImageStruct.h中建立全局變量,每個.cpp中引用該頭文件調用總是報錯(未知),所以我在View.h中建立一個全局變量int Red[256];再在子文件.cpp中函數裏調用該全局變量即可extern int Red[256],這是非常重要的一個C語言知識。
        (3) 畫圖函數OnPaint()參考源代碼中詳細註釋。
        如何繪製座標軸、文字、圖像,其實自己繪製而沒調用第三方庫還是挺有意思的。

        第一步:建立畫直方圖函數OnPaint
        打開類嚮導(Ctrl+W),類名選擇CImageZFTDlg,IDs選擇CImageZFTDlg,在Message函數中建立WM_PAINT映射,默認函數名爲OnPaint建立函數void CImageZFTDlg::OnPaint()

        第二步:繪製直方圖大致思想如下
        (1) 重點:獲取要繪製直方圖的位置和圖像資源的對應號ID(IDC_STATIC_KJ 框架),我當時認爲繪製直方圖只能繪製到”圖像“控件IDC中,不能是對話框IDD。
        CWnd *pWnd = GetDlgItem(IDC_STATIC_KJ);
        CDC *pDC = pWnd->GetDC();
        (2) 獲取對話框矩形的長和寬
        CRect rectpic;
        GetDlgItem(IDC_STATIC_KJ)->GetWindowRect(&rectpic);
        (3) 創建畫筆對象並對畫筆進行顏色設置
        CPen *RedPen = new CPen();
        RedPen->CreatePen(PS_SOLID,1RGB(255,0,0));
        (4) 選中當前畫筆並保存以前畫筆
        CGdiObject *RedOlderPen = pDC->SelectObject(RedPen);
        (5) 繪製直方圖(圖像座標自己算)
        矩形 pDC->Rectangle(9,327,312,468);
        移動 pDC->MoveTo(15,331);
        直線 pDC->LineTo(15,488);
        文字 pDC->TextOut(15+48*i,450,str);
        (6) 恢復以前畫筆
        pDC->SelectObject(RedOlderPen);
        delete RedPen;
        ReleaseDC(pDC);

        第三步:源代碼與詳細註釋思想
        在ImageZFTDlg.cpp中修改OnPaint函數:


 
  1. //****************繪製原圖直方圖*********************//

  2. void CImageZFTDlg::OnPaint()

  3. {

  4. CPaintDC dc(this); // device context for painting

  5.  
  6. // TODO: Add your message handler code here

  7.  
  8. /********************************************************************************/

  9. /* 重點知識:(百度)

  10. /* 如何在View.cpp中把一個變量的值傳給其它對話框

  11. /*

  12. /* 錯誤一:在View.h中定義的pubic變量只能在View.cpp中用

  13. /* 錯誤二:定義一個Struct.h中存全局變量,在2個函數中分別調用#include "Struct.h"

  14. /*

  15. /* 解決方法一: (CSDN 不會)參數用 A& a 兩個對話框裏都可以訪問a

  16. /* 解決方法二: (CSDN 不會)重載

  17. /*

  18. /* 解決:在View.cpp中定義全局變量 void CBmpDrawView::OnZftYt() 前面 並函數中操作

  19. /* 在dialog的cpp中即void CTestZFTDlg::OnPaint()中在定義一個extern int a

  20. /********************************************************************************/

  21.  
  22. extern int Red[256],Green[256],Blue[256];

  23.  
  24. /*寫在該空間中可以省略Invalidate()語句*/

  25. /*獲取控件的CDC指針*/

  26. CRect rectpic;

  27. GetDlgItem(IDC_STATIC_KJ)->GetWindowRect(&rectpic);

  28.  
  29. int x,y;

  30. x=rectpic.Width();

  31. y=rectpic.Height();

  32.  
  33. CWnd *pWnd=GetDlgItem(IDC_STATIC_KJ);

  34. CDC *pDC=pWnd->GetDC();

  35.  
  36. /***********************/

  37. /*重點:畫直方圖 紅色

  38. /**********************/

  39. CPen *RedPen=new CPen(); //創建畫筆對象

  40. RedPen->CreatePen(PS_SOLID,1,RGB(255,0,0)); //紅色畫筆

  41. CGdiObject *RedOlderPen=pDC->SelectObject(RedPen); //選中當前紅色畫筆並保存以前的畫筆

  42.  
  43. /*畫圖*/

  44. pDC->Rectangle(9,16,312,147); //畫一個矩形框

  45. pDC->MoveTo(15,20); //繪製座標軸

  46. pDC->LineTo(15,128); //Y豎軸

  47. pDC->LineTo(305,128); //X橫軸

  48.  
  49. pDC->MoveTo(305,128); //繪製X箭頭

  50. pDC->LineTo(300,123); //繪製上邊箭頭

  51. pDC->MoveTo(305,128);

  52. pDC->LineTo(300,133); //繪製下邊箭頭

  53.  
  54. pDC->MoveTo(15,20); //繪製Y箭頭

  55. pDC->LineTo(10,25); //繪製左邊箭頭

  56. pDC->MoveTo(15,20);

  57. pDC->LineTo(20,25); //繪製右邊箭頭

  58.  
  59. /**********************************************************************/

  60. /* TextOut函數功能:

  61. /* 該函數用當前選擇的字體、背景顏色和正文顏色將一個字符串寫到指定位置

  62. /* BOOL TextOut(HDC hdc,int x,int y,LPCTSTR str,int numStr)

  63. /* 表示:x起始座標,y起始座標,字符串,字符串中字符個數

  64. /*

  65. /* SetTextColor函數功能:

  66. /* 設置指定設備環境(HDC)的字體顏色

  67. /* SetTextColor (HDC, COLORREF) 如:SetTextColor(HDC,RGB(255,0,0));

  68. /**********************************************************************/

  69.  
  70. CString str;

  71. int i;

  72. for(i=0;i<=5;i++) //寫X軸刻度線

  73. {

  74. str.Format("%d",i*50); //0-255之間添加6個刻度值

  75. pDC->SetTextColor(RGB(255,0,255)); //設置字體顏色

  76. pDC->TextOut(15+48*i,130,str); //輸出字體

  77. pDC->MoveTo(15+48*i,128); //繪製X軸刻度

  78. pDC->LineTo(15+48*i,125);

  79. }

  80. for(i=0;i<=5;i++) //寫Y軸刻度線

  81. {

  82. pDC->MoveTo(15,128-20*i); //繪製Y軸刻度

  83. pDC->LineTo(18,128-20*i);

  84. }

  85.  
  86. /*繪製直方圖主要的代碼*/

  87. for(i=1;i<256;i++)

  88. {

  89. pDC->MoveTo(15+i,128);

  90. if( (128-16) > (Red[i]/40) )

  91. pDC->LineTo(15+i,128-(Red[i]/40));

  92. else

  93. pDC->LineTo(15+i,16); //超過矩形的畫矩形高

  94. }

  95.  
  96.  
  97. /**********************/

  98. /*重點:畫直方圖 綠色

  99. /**********************/

  100. CPen *GreenPen=new CPen(); //創建畫筆對象

  101. GreenPen->CreatePen(PS_SOLID,1,RGB(0,255,0)); //綠色畫筆

  102. CGdiObject *GreenOlderPen=pDC->SelectObject(GreenPen);

  103.  
  104. pDC->Rectangle(9,167,312,308); //畫一個矩形框

  105. pDC->MoveTo(15,171); //繪製座標軸

  106. pDC->LineTo(15,288); //Y豎軸

  107. pDC->LineTo(305,288); //X橫軸

  108.  
  109. pDC->MoveTo(305,288); //繪製X箭頭

  110. pDC->LineTo(300,283); //繪製上邊箭頭

  111. pDC->MoveTo(305,288);

  112. pDC->LineTo(300,293); //繪製下邊箭頭

  113.  
  114. pDC->MoveTo(15,171); //繪製Y箭頭

  115. pDC->LineTo(10,176); //繪製左邊箭頭

  116. pDC->MoveTo(15,171);

  117. pDC->LineTo(20,176); //繪製右邊箭頭

  118.  
  119. for(i=0;i<=5;i++) //寫X軸刻度線

  120. {

  121. str.Format("%d",i*50); //0-255之間添加6個刻度值

  122. pDC->SetTextColor(RGB(255,0,255)); //設置字體顏色

  123. pDC->TextOut(15+48*i,290,str); //輸出字體

  124.  
  125. pDC->MoveTo(15+48*i,288); //繪製X軸刻度

  126. pDC->LineTo(15+48*i,285);

  127. }

  128. for(i=0;i<=5;i++) //寫Y軸刻度線

  129. {

  130. pDC->MoveTo(15,288-20*i); //繪製Y軸刻度

  131. pDC->LineTo(18,288-20*i);

  132. }

  133.  
  134. /*繪製直方圖主要的代碼*/

  135. for(i=1;i<256;i++)

  136. {

  137. pDC->MoveTo(15+i,288);

  138. if( (288-167) > (Green[i]/40) )

  139. pDC->LineTo(15+i,288-(Green[i]/40));

  140. else

  141. pDC->LineTo(15+i,167); //超過矩形的畫矩形高

  142. }

  143.  
  144.  
  145. /**********************/

  146. /*重點:畫直方圖 藍色

  147. /***************((*****/

  148. CPen *BluePen=new CPen(); //創建畫筆對象

  149. BluePen->CreatePen(PS_SOLID,1,RGB(0,0,255)); //藍色畫筆

  150. CGdiObject *BlueOlderPen=pDC->SelectObject(BluePen);

  151.  
  152. pDC->Rectangle(9,327,312,468); //畫一個矩形框

  153. pDC->MoveTo(15,331); //繪製座標軸

  154. pDC->LineTo(15,448); //Y豎軸

  155. pDC->LineTo(305,448); //X橫軸

  156.  
  157. pDC->MoveTo(305,448); //繪製X箭頭

  158. pDC->LineTo(300,443); //繪製上邊箭頭

  159. pDC->MoveTo(305,448);

  160. pDC->LineTo(300,453); //繪製下邊箭頭

  161.  
  162. pDC->MoveTo(15,331); //繪製Y箭頭

  163. pDC->LineTo(10,336); //繪製左邊箭頭

  164. pDC->MoveTo(15,331);

  165. pDC->LineTo(20,336); //繪製右邊箭頭

  166.  
  167.  
  168. for(i=0;i<=5;i++) //寫X軸刻度線

  169. {

  170. str.Format("%d",i*50); //0-255之間添加6個刻度值

  171. pDC->SetTextColor(RGB(255,0,255)); //設置字體顏色

  172. pDC->TextOut(15+48*i,450,str); //輸出字體

  173.  
  174. pDC->MoveTo(15+48*i,448); //繪製X軸刻度

  175. pDC->LineTo(15+48*i,445);

  176. }

  177. for(i=0;i<=5;i++) //寫Y軸刻度線

  178. {

  179. pDC->MoveTo(15,448-20*i); //繪製Y軸刻度

  180. pDC->LineTo(18,448-20*i);

  181. }

  182.  
  183. /*繪製直方圖主要的代碼*/

  184. for(i=1;i<256;i++)

  185. {

  186. pDC->MoveTo(15+i,448);

  187. if( (448-327) > (Blue[i]/40) )

  188. pDC->LineTo(15+i,448-(Blue[i]/40));

  189. else

  190. pDC->LineTo(15+i,327); //超過矩形的畫矩形高

  191. }

  192.  
  193.  
  194. //恢復以前的畫筆

  195. pDC->SelectObject(RedOlderPen);

  196. pDC->SelectObject(GreenOlderPen);

  197. pDC->SelectObject(BlueOlderPen);

  198. delete RedPen;

  199. delete GreenPen;

  200. delete BluePen;

  201. ReleaseDC(pDC);

  202. return;

  203.  
  204. // Do not call CDialog::OnPaint() for painting messages

  205. }

        

//////////////////////////////////////////////////////////////////

轉載:https://blog.csdn.net/eastmount/article/details/46237463

 

發佈了46 篇原創文章 · 獲贊 88 · 訪問量 19萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章