您好 [登錄] [免費注冊]
        歡迎來到123儀器網(wǎng)!24年專注 · 正品保障 · 閃電發(fā)貨

        檢測屏幕分辨率和顏色深度

        2011-03-02

                                                             檢測屏幕分辨率和顏色深度

                全球紡織采購供應(yīng)鏈色彩解決方案商——天友利,近幾年來,越來越多的頂尖零售商和服裝品牌廠家選擇天友利作為自己的優(yōu)選或共選色彩技術(shù)提供商。產(chǎn)品涉及行業(yè):塑料、 涂料、 紡織、 汽車、 化妝品、 數(shù)碼影像、 印前 、印刷、 油墨、 色覺測試、 包裝等。

        ---- Windows API函數(shù)GetDeviceCaps()可提供廣泛的關(guān)于設(shè)備背景的信息,其中包括屏幕分辨率和顏色深度。GUI程序設(shè)計允許將圖形元素作為抽象的對象,不管硬件設(shè)備的情況及用戶設(shè)置的選擇。這對大多數(shù)情況,比如典型的窗口畫面和設(shè)備無關(guān)位圖操作都能滿足。但是在某些特殊情況下將受到限制,程序員需要其它方法來獲得相關(guān)設(shè)備的實際情況信息。本文就介紹一獲取屏幕分辨率和顏色深度的應(yīng)用程序。

        ---- 一、GetDeviceCaps()的功能

        ---- API函數(shù)GetDeviceCaps()可用來獲取設(shè)備的很多信息,它也就成為應(yīng)用和設(shè)備驅(qū)動程序的網(wǎng)關(guān)。下列為它在wingdi.h中的原型:int GetDeviceCaps(HDC hdc,int nIndex);

        ---- 第一項參數(shù)是與檢測設(shè)備有關(guān)的設(shè)備背景,第二個參數(shù)表示檢測值。函數(shù)的具體功能在Win32SDK文件中有詳細介紹,本文集中介紹二個與顯示設(shè)備相關(guān)的特性:分辨率(水平和垂直)和能顯示的不同顏色數(shù)。這些值能分別由HORZRES,VERTRES和BITSPIXEL返回給 GetDeviceCaps()的第二個參數(shù)。BITSPIXEL返回描述一個像素顏色需要的位數(shù),要確定實際顏色數(shù)只要計算以2作為冪的返回值的指數(shù)。

        ---- 下列給出的C代碼就是檢測屏幕分辨率和顏色深度:

         屏幕dc初始化
        HDC screenDC;
        int colorBits, xRes, yRes;
        screenDC = CreateDC(DISPLAY, NULL, NULL, NULL);
         檢索設(shè)備
        colorBits = GetDeviceCaps(screenDC, BITSPIXEL);
        xRes = GetDeviceCaps(screenDC, HORZRES);
        yRes = GetDeviceCaps(screenDC, VERTRES);
         清除
        DeleteDC(dc);

        ---- 從上述代碼看好象很簡單,而且這在大多數(shù)情況下是可行的,但當在32K彩色模式時就不行了,在這種情況下GetDeviceCaps()返回16而不是期望的15(2^15是32,768)。另外,32K和64K顏色之間的區(qū)別(兩者也作為高-顏色方式)不大,當用15bit設(shè)備顯示64K顏色位圖時 Windows應(yīng)用抖動算法實現(xiàn)。那么,怎么能檢測32K顏色情況和將它與64K情況區(qū)別開
        ---- 二、開發(fā)SetPixel()函數(shù)功能

        ---- API函數(shù)比SetPixel(),以指定RGB顏色設(shè)置像素在設(shè)備背景上,還返回RGB值,而如果匹配不好的話,此返回的可能不是我們需要的顏色值。雖然,這一特性看上去沒什么用處,但你可用它解決GetDeviceCaps()對15位顏色模式返回16位問題。如果用提供的RGB值設(shè)置一像素的顏色,并比較其返回的COLORREF,就能確定設(shè)備是否支持那種顏色。將上述算法放入一循環(huán)中,使RGB組合不斷改變,設(shè)備既是視頻卡,計算比較值為真的次數(shù)有多少。

        ---- 顯然,用上述方法要對SetPixel()調(diào)用2^24次在時間上是不合理的,其實并不需要在所有可能的值之中重復(fù),分別比較每個顏色組合(先紅色,然后綠色,然后藍色)也可產(chǎn)生相同的結(jié)果,并且迭代次數(shù)可減少到255次。

        ---- GetScrResolution()僅僅是對GetDeviceCaps(HORZRES)和GetDeviceCaps(VERTRES)的接連處理:

        BOOL GetScrResolution(WORD pWidth, WORD pHeight)
        {
        HDC screenDC;
        screenDC = CreateDC(DISPLAY, NULL, NULL, NULL);
        if (!screenDC)
          return FALSE;

        pWidth = GetDeviceCaps(screenDC, HORZRES);
        pHeight = GetDeviceCaps(screenDC, VERTRES);

        DeleteDC(screenDC);
        return TRUE;
        }

        ---- GetScrColorDepth()調(diào)用GetDeviceCaps(BITSPIXEL),但是,當API返回16時,它使用 GetScrRGBBitsPerPixel()來依次計算紅色、綠色和藍色組合。如果他們都等于32,API返回代碼16顯然是不正確的,而實際上因是 15。
        BYTE GetScrColorDepth()
        {
        HDC screenDC;
        BYTE numOfBits;

        screenDC = CreateDC(DISPLAY, NULL, NULL, NULL);
        if (!screenDC)
          return 0;
        numOfBits = GetDeviceCaps(screenDC, BITSPIXEL);
        DeleteDC(screenDC);

        if (numOfBits == 16)
          {
                是否為64K色,或32K
          WORD red, green, blue;
          GetScrRGBBitsPerPixel(&red, &green, &blue);
          if (red == 32 && green == 32 && blue == 32)
                       323232 = 2^15 色
           numOfBits = 15;
        }

        return numOfBits;
        }

        GetScrRGBBitsPerPixel()通過255次循環(huán)測
        試設(shè)備支持的紅、綠色和藍色值。

        BOOL GetScrRGBBitsPerPixel(WORD pRedBits,
                                   WORD pGreenBits,
                                   WORD pBlueBits)
        {
        BOOL isError = FALSE;
        HDC screenDC, memDC;
        HBITMAP bmp = NULL;
        HBITMAP bmpOld = NULL;

        pRedBits = pGreenBits = pBlueBits = 1;

        screenDC = CreateDC(DISPLAY, NULL,
          NULL, NULL);
        memDC = CreateCompatibleDC(NULL);
        bmp = CreateCompatibleBitmap(screenDC, 1, 1);
        isError = screenDC && memDC && bmp;
        if (!isError)
          goto CleanUp;
           有時goto語句是處理出錯的一種很簡便的方法
        bmpOld = (HBITMAP)SelectObject(memDC, bmp);

        {
          COLORREF oldColor;
          COLORREF curColor = RGB(255, 255, 255);
          int n;
          for (n = 255; n = 0; --n)
          {
           oldColor = curColor;
           curColor = SetPixel(memDC,
           0, 0, RGB(n, n, n));
           isError = curColor;
           if (isError == CLR_INVALID)
           {
            isError = TRUE;
            goto CleanUp;
           }
            計算紅、綠和藍匹配情況
           if (GetRvalue(curColor)
            GetRvalue(oldColor))
            ++(pRedBits);
           if (GetGvalue(curColor)
            GetGvalue(oldColor))
            ++(pGreenBits);
           if (GetBvalue(curColor)
           GetBvalue(oldColor))
            ++(pBlueBits);
          }
        }
        CleanUp
          if (bmpOld)
           DeleteObject(bmpOld);
          if (bmp)
           DeleteObject(bmp);
          if (isError)
           pRedBits = pGreenBits
          = pBlueBits = 0;
          if (screenDC)
           DeleteDC(screenDC);
          if (memDC)
           DeleteDC(memDC);

          return !isError;
        }

        ---- 可見GetScrRGBBitsPerPixel()不僅是解決本問題的核心,而且還可得到正使用的紅色、綠色和藍色各自的位數(shù)。例如,當有16位顏色時,哪一個顏色獲得6位,而不是另二個的5位,你可通過測試發(fā)現(xiàn),一般綠色成分多一些。

               深圳市天友利標準光源有限公司主營產(chǎn)品:標準光源對色燈箱、英國-美國標準光源箱、汽車檢測光源、鏡頭攝像頭測試用標準光源、印刷行業(yè)用標準光源、電腦測色儀、分光密度儀、色卡、分辨率卡、色溫照度計等光學(xué)儀器。

        人妻少妇看A偷人无码精品| 国产高清在线精品一本大道国产| 国产精品激情综合久久| 99热在线只有精品| 黑人巨大精品播放| 久久精品国产亚洲av麻豆图片| 亚洲国产午夜中文字幕精品黄网站| 亚洲国产精品国自产电影| 精品91一区二区三区| 99re视频精品全部免费| 亚洲高清国产拍精品青青草原| 精品久久8x国产免费观看| 99视频在线观看精品| 99久久免费精品国产72精品九九| 国产在线不卡午夜精品2021| 国产精品剧情原创麻豆国产| 91精品国产色综合久久不| 国产香蕉国产精品偷在线观看| 亚洲日韩精品无码专区加勒比☆| 中文字幕精品亚洲无线码二区 | 亚洲精品第一国产综合境外资源| 91www永久在线精品果冻传媒| 精品精品国产国产| 精品国产18久久久久久| 91精品国产亚洲爽啪在线影院| 国产在线精品一区二区不卡麻豆 | AAA级久久久精品无码片| 最新国产精品剧情在线SS| 亚洲2022国产成人精品无码区| 久久九九久精品国产| www.精品视频| 国产精品成久久久久三级| 日韩精品一卡2卡3卡4卡新区乱码| 亚洲av永久无码精品三区在线4 | 亚洲精品国产福利一二区| 国内精品一区二区三区在线观看| 亚洲国产精品美女| 中文字幕精品视频| 久久99国产乱子伦精品免费| 亚洲综合一区二区精品导航| 久久国产精品免费专区|