<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                # 10.5 使用wxImage編程 你可以使用wxImage對圖形進行一些平臺無關的調整,或者將其作為圖片加載和保存的中間步驟.圖片在wxImage中是按照每一個象素使用一個分別代表紅色,綠色和藍色的字節的格式保存的,如果圖片包含alpha通道,則還會占用額外的一個字節. wxImage主要的函數如下: | wxImage | wxImage的創建方法包括:指定寬度和高度, 從另外一幅圖片創建, 使用XPM數據, 圖片元數據(char[]) 和可選的alpha通道數據,文件名及其類型,以及通過輸入流等多種方式創建. | |:--- |:--- | | ConvertAlphaToMask | 將alpla通道(如果有的話)轉換成一個透明遮罩. | | ConvertToMono | 轉換成一個黑白圖片. | | Copy | 返回一個不使用引用記數器的完全一樣的拷貝. | | Create | 創建一個指定大小的圖片,可選的參數指明是否初始化圖片數據. | | Destroy | 如果沒有人再使用的話,釋放內部數據. | | GeTData, SetData | 獲取和設置內部數據指針(unsigned char*). | | GetImageCount | 返回一個文件或者流中的圖片個數. | | GetOption, GetOptionInt, SetOption, HasOption | 獲取, 設置和測試某個選項是否設置. | | GetSubImage | 將圖片的一部分返回為一個新的圖像. | | GetWidth, GetHeight | 返回圖片大小. | | Getred, GetGreen, GetBlue, SetRGB, GetAlpha, SetAlpha | 獲得和指定某個象素的RGB以及Alpha通道的值. | | HasMask, GetMaskRed, GetMaskGreen, GetMaskBlue, SetMaskColour | 用來測試圖像是否有一個遮罩,以及遮罩顏色的RGB值或者整個顏色的值. | | LoadFile, SaveFile | 各種圖片格式文件的讀取和保存操作. | | Mirror | 在各種方向上產生鏡像,返回一個新圖片. | | Ok | 判斷圖片是否已初始化. | | Paste | 將某個圖片粘貼在這個圖片的指定位置. | | Rotate, Rotate90 | 旋轉圖片,返回一個新圖片. | | SetMaskFromImage | 通過指定的圖片和透明顏色產生一個遮罩并且設置這個遮罩. | | Scale, Rescale | 縮放產生一個新圖片或者縮放本圖片. | 加載和保存圖像 wxImage可以讀取和保存各種各樣的圖片格式,并且使用圖像處理過程來增加擴展的能力.其它的圖像類(比如wxBitmap)在某個平臺不具備處理某種圖形格式的能力的時候,也通常使用的都是wxImage的圖象處理過程來加載特定格式的圖形. 本章第二小節中展示了wxWidgets支持的各種圖形處理過程.其中wxBMPHandler是默認支持的,而要支持其它的圖形格式處理,就需要使用 wxImage::AddHandler函數增加對應的圖形處理過程或者使用wxInitAllImageHandlers增加所有支持的圖形處理過程. 如果你只需要特定的圖形格式支持,可以在OnInit函數中使用類似下面的代碼: ``` #include "wx/image.h" wxImage::AddHandler( new wxPNGHandler ); wxImage::AddHandler( new wxJPEGHandler ); wxImage::AddHandler( new wxGIFHandler ); wxImage::AddHandler( new wxXPMHandler ); ``` 或者,你可以簡單的調用: ``` wxInitAllImageHandlers(); ``` 下面演示了幾種從文件或者流讀取圖片的方式,注意在實際使用過程中,最好使用絕對路徑以避免依賴于當前路徑的設置: ``` // 使用構造函數指定類型來讀取圖像 wxImage image(wxT("image.png"), wxBITMAP_TYPE_PNG); if (image.Ok()) { ... } // 不指定圖像類型一般也能正常工作 wxImage image(wxT("image.png")); // 使用兩步法創建圖像 wxImage image; if (image.LoadFile(wxT("image.png"))) { ... } // 如果一個文件包含兩副圖片Two-step loading with an index into a multi-image file: // 下面演示選擇第2副加載 wxImage image; int imageCount = wxImage::GetImageCount(wxT("image.tif")); if (imageCount &gt; 2) image.LoadFile(wxT("image.tif"), wxBITMAP_TYPE_TIFF, 2); // 從文件流加載圖片 wxFileInputStream stream(wxT("image.tif")); wxImage image; image.LoadFile(stream, wxBITMAP_TYPE_TIF); // 保存到一個文件 image.SaveFile(wxT("image.png")), wxBITMAP_TYPE_PNG); // 保存到一個流 wxFileOutputStream stream(wxT("image.tif")); image.SaveFile(stream, wxBITMAP_TYPE_TIF); ``` 除了XPM和PCX格式以外,其它的圖片格式都將以24位顏色深度保存(譯者注:GIF格式因為版權方面的原因不支持保存到文件),這兩種格式的圖形處理過程將會計算實際的顏色個數從而選擇相應的顏色深度.JPEG格式還擁有一個質量選項可供設置.它的值的范圍為從0到100,0代表最低的圖片質量和最高的壓縮比,100則代表最高的圖片質量和最低的壓縮比.如下所示: ``` // 設置一個合理的質量壓縮比 image.SetOption(wxIMAGE_OPTION_QUALITY, 80); image.SaveFile(wxT("picture.jpg"), wxBITMAP_TYPE_JPEG); ``` 另外如果以XPM格式保存到流輸出中的時候,需要使用wxImage::SetOption函數設置一個名稱否則,處理函數不知道該用什么名稱命名對應的C變量. ``` // 保存XPM到流格式 image.SetOption(wxIMAGE_OPTION_FILENAME, wxT("myimage")); image.SaveFile(stream, wxBITMAP_TYPE_XPM); ``` 注意處理函數會自動在你設置的名稱后增加"_xpm". 透明 有兩種方式設置一個wxImage為透明的圖像:使用顏色遮罩或者alpha通道.一種顏色可以被指定為透明顏色,通過這種方法在將wxImage轉換成wxBitmap的時候可以很容易的制作一個透明遮罩. wxImage也支持alpha通道數據,在每一個象素的RGB顏色之外來由另外一個字節用來指示alpha通道的值,0代表完全透明,255則代表完全不透明.中間的值代表半透明. 不是所有的圖片都用有alpha通道數據的,因此在使用GetAlpha函數之前,應該使用HasAlpha函數來判斷圖像是否擁有 alpha通道數據.到目前為止,只有PNG文件或者調用SetAlpha設置了alpha通道的圖像才擁有alpha通道數據.保存一個帶有alpha 通道的圖像目前還不被支持.繪制一個擁有alpha通道的方法是先將其轉換成wxBitmap然后使用wxDC::DrawBitmap或者wxDC:: Blit函數. 下面的代碼演示了怎樣使用顏色掩碼創建一個透明的wxImage,它是藍色的,擁有一個透明的矩形區域: ``` // 創建一個有顏色掩碼的wxBitmap // 首先,在這個wxBitmap上繪畫 wxBitmap bitmap(400, 400); wxMemoryDC dc; dc.SelectObject(bitmap); dc.SetBackground(*wxBLUE_BRUSH); dc.Clear(); dc.SetPen(*wxRED_PEN); dc.SetBrush(*wxRED_BRUSH); dc.DrawRectangle(50, 50, 200, 200); dc.SelectObject(wxNullBitmap); // 將其轉換成wxImage wxImage image = bitmap.ConvertToImage(); // 設置掩碼顏色 image.SetMaskColour(255, 0, 0); ``` 在下面的例子中,使用從一個圖片創建顏色遮罩的方式,其中image.bmp是原始圖像,而mask.bmp則是一個掩碼圖像,在后者中所有透明的部分都是黑色顯示的. ``` // 加載一副圖片和它的掩碼遮罩 wxImage image(wxT("image.bmp"), wxBITMAP_TYPE_BMP); wxImage maskImage(wxT("mask.bmp"), wxBITMAP_TYPE_BMP); // 從后者創建一個遮罩并且設置給前者. image.SetMaskFromImage(maskImage, 0, 0, 0); ``` 如果你加載的圖片本身含有透明顏色,你可以檢測并且直接創建遮罩: ``` // 加載透明圖片 wxImage image(wxT("image.png"), wxBITMAP_TYPE_PNG); // 獲取掩碼 if (image.HasMask()) { wxColour maskColour(image.GetMaskRed(), image.GetMaskGreen(), image.GetMaskBlue()); } ``` 變形 wxImage支持縮放,旋轉以及鏡像等多種變形方式,下面各舉一些例子: ``` // 把原始圖片縮放到200x200,并保存在新的圖片里 // 原圖保持不變. wxImage image2 = image1.Scale(200, 200); // 將原圖縮放到200x200 image1.Rescale(200, 200); // 旋轉固定角度產生新圖片. // 原圖片保持不變. wxImage image2 = image1.Rotate(0.5); // 順時針旋轉90度產生新圖片. // 原圖保持不變. wxImage image2 = image1.Rotate90(true); // 水平鏡像產生新圖片. // 原圖保持不變. wxImage image2 = image1.Mirror(true); ``` 顏色消減 如果你想對某個圖像的顏色進行消減,你可以使用wxQuantize類的一些靜態函數,其中最有趣的函數Quantize的參數為一個輸入圖片,一個輸出圖片,一個可選的wxPalette**指針用來存放經過消減的顏色,以及一個你希望保留的顏色個數,你也可以傳遞一個unsigned char**變量來獲取一個8-bit顏色深度的輸出圖像.最后的一個參數style(類型)用來對返回的圖像進行一些更深入的控制,詳情請參考 wxWidgets的手冊. 下面的代碼演示了怎樣將一幅圖片的顏色消減到最多256色: ``` #include "wx/image.h" #include "wx/quantize.h" wxImage image(wxT("image.png")); int maxColorCount = 256; int colors = image.CountColours(); wxPalette* palette = NULL; if (colors &gt; maxColorCount ) { wxImage reducedImage; if (wxQuantize::Quantize(image, reducedImage, & palette, maxColorCount)) { colors = reducedImage.CountColours(); image = reducedImage; } } ``` 一個wxImage可以設置一個wxPalette,例如加載GIF文件的時候. 然后,圖片內部仍然是以RGB的方式存儲數據的,調色板僅代表圖片加載時候的顏色隱射關系.調色板的另外一個用途是某些圖片處理函數用它來將圖片保存為低顏色深度的圖片,例如windows的BMP圖片處理過程將檢測是否設置了wxBMP_8BPP_PALETTE標記,如果設置了,則將使用調色板.而如果設置了wxBMP_8BPP標記(而不是wxBMP_8BPP_PALETTE),它將使用自己的算法進行顏色消減.另外某些圖片處理過程自己也進行顏色消減,比如PCX的處理過程,除非它認為剩余的顏色個數已經足夠低了,否則它將對圖片的顏色進行消減. 關于調色板更多的信息請參考第5章的"調色板"小節. 直接操作wxImage 的元數據 你可以直接通過GetData函數訪問wxImage的元數據以便以比GeTRed, GetBlue, GetGreen和SetRGB更快的方式對其進行操作,下面舉了一個使用這種方法將一個圖片轉換成灰度圖片的方法: ``` void wxImage::ConvertToGrayScale(wxImage& image) { double red2Gray = 0.297; double green2Gray = 0.589; double blue2Gray = 0.114; int w = image.GetWidth(), h = image.GetHeight(); unsigned char *data = image.GetData(); int x,y; for (y = 0; y &lt; h; y++) for (x = 0; x &lt; w; x++) { long pos = (y * w + x) * 3; char g = (char) (data[pos]*red2Gray + data[pos+1]*green2Gray + data[pos+2]*blue2Gray); data[pos] = data[pos+1] = data[pos+2] = g; } } ```
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看