亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? dibpal.c

?? widows編程例題程序13-18章
?? C
?? 第 1 頁 / 共 2 頁
字號(hào):
     free (piCount) ;
     free (plp) ;

     return hPalette ;
}

/*-------------------------------------------------------
   Structures used for implementing median cut algorithm
  -------------------------------------------------------*/

typedef struct           // defines dimension of a box
{
     int Rmin, Rmax, Gmin, Gmax, Bmin, Bmax ;
}
MINMAX ;

typedef struct           // for Compare routine for qsort
{
     int     iBoxCount ;
     RGBQUAD rgbBoxAv ;
}
BOXES ;

/*----------------------------
   FindAverageColor: In a box
  ----------------------------*/

static int FindAverageColor (int * piCount, MINMAX mm, 
                             int iRes, RGBQUAD * prgb)
{
     int R, G, B, iR, iG, iB, iTotal, iCount ;

          // Initialize some variables

     iTotal = iR = iG = iB = 0 ;
          
          // Loop through all colors in the box
          
     for (R = mm.Rmin ; R <= mm.Rmax ; R++)
     for (G = mm.Gmin ; G <= mm.Gmax ; G++)
     for (B = mm.Bmin ; B <= mm.Bmax ; B++)
     {
               // Get the number of pixels of that color

          iCount = piCount [PACK_RGB (R, G, B, iRes)] ;

               // Weight the pixel count by the color value

          iR += iCount * R ;
          iG += iCount * G ;
          iB += iCount * B ;

          iTotal += iCount ;
     }
          // Find the average color

     prgb->rgbRed   = (BYTE) ((iR / iTotal) << (8 - iRes)) ;
     prgb->rgbGreen = (BYTE) ((iG / iTotal) << (8 - iRes)) ;
     prgb->rgbBlue  = (BYTE) ((iB / iTotal) << (8 - iRes)) ;

          // Return the total number of pixels in the box
     
     return iTotal ;
}

/*------------------------------
   CutBox:  Divide a box in two
  ------------------------------*/

static void CutBox (int * piCount, int iBoxCount, MINMAX mm,
                    int iRes, int iLevel, BOXES * pboxes, int * piEntry)
{
     int    iCount, R, G, B ;
     MINMAX mmNew ;
     
          // If the box is empty, return 

     if (iBoxCount == 0)
          return ;

          // If the nesting level is 8, or the box is one pixel, we're ready
          //   to find the average color in the box and save it along with
          //   the number of pixels of that color

     if (iLevel == 8 || (mm.Rmin == mm.Rmax && 
                         mm.Gmin == mm.Gmax && 
                         mm.Bmin == mm.Bmax))
     {
          pboxes[*piEntry].iBoxCount = 
               FindAverageColor (piCount, mm, iRes, &pboxes[*piEntry].rgbBoxAv) ;

          (*piEntry) ++ ;
     }
          // Otherwise, if blue is the largest side, split it

     else if ((mm.Bmax - mm.Bmin > mm.Rmax - mm.Rmin) && 
              (mm.Bmax - mm.Bmin > mm.Gmax - mm.Gmin))
     {
               // Initialize a counter and loop through the blue side

          iCount = 0 ;

          for (B = mm.Bmin ; B < mm.Bmax ; B++)
          {
                    // Accumulate all the pixels for each successive blue value

               for (R = mm.Rmin ; R <= mm.Rmax ; R++)
               for (G = mm.Gmin ; G <= mm.Gmax ; G++)
                    iCount += piCount [PACK_RGB (R, G, B, iRes)] ;

                    // If it's more than half the box count, we're there

               if (iCount >= iBoxCount / 2)
                    break ;

                    // If the next blue value will be the max, we're there

               if (B == mm.Bmax - 1)
                    break ;
          }
               // Cut the two split boxes.
               //   The second argument to CutBox is the new box count.
               //   The third argument is the new min and max values.

          mmNew = mm ;
          mmNew.Bmin = mm.Bmin ;
          mmNew.Bmax = B ;

          CutBox (piCount, iCount, mmNew, iRes, iLevel + 1, 
                  pboxes, piEntry) ;

          mmNew.Bmin = B + 1 ;
          mmNew.Bmax = mm.Bmax ;

          CutBox (piCount, iBoxCount - iCount, mmNew, iRes, iLevel + 1,
                  pboxes, piEntry) ;
     }
          // Otherwise, if red is the largest side, split it (just like blue)

     else if (mm.Rmax - mm.Rmin > mm.Gmax - mm.Gmin)
     {
          iCount = 0 ;

          for (R = mm.Rmin ; R < mm.Rmax ; R++)
          {
               for (B = mm.Bmin ; B <= mm.Bmax ; B++)
               for (G = mm.Gmin ; G <= mm.Gmax ; G++)
                    iCount += piCount [PACK_RGB (R, G, B, iRes)] ;

               if (iCount >= iBoxCount / 2)
                    break ;

               if (R == mm.Rmax - 1)
                    break ;
          }
          mmNew = mm ;
          mmNew.Rmin = mm.Rmin ;
          mmNew.Rmax = R ;

          CutBox (piCount, iCount, mmNew, iRes, iLevel + 1, 
                  pboxes, piEntry) ;

          mmNew.Rmin = R + 1 ;
          mmNew.Rmax = mm.Rmax ;

          CutBox (piCount, iBoxCount - iCount, mmNew, iRes, iLevel + 1,
                  pboxes, piEntry) ;
     }
          // Otherwise, split along the green size
     else 
     {
          iCount = 0 ;

          for (G = mm.Gmin ; G < mm.Gmax ; G++)
          {
               for (B = mm.Bmin ; B <= mm.Bmax ; B++)
               for (R = mm.Rmin ; R <= mm.Rmax ; R++)
                    iCount += piCount [PACK_RGB (R, G, B, iRes)] ;

               if (iCount >= iBoxCount / 2)
                    break ;

               if (G == mm.Gmax - 1)
                    break ;
          }
          mmNew = mm ;
          mmNew.Gmin = mm.Gmin ;
          mmNew.Gmax = G ;

          CutBox (piCount, iCount, mmNew, iRes, iLevel + 1, 
                  pboxes, piEntry) ;

          mmNew.Gmin = G + 1 ;
          mmNew.Gmax = mm.Gmax ;

          CutBox (piCount, iBoxCount - iCount, mmNew, iRes, iLevel + 1,
                  pboxes, piEntry) ;
     }
}

/*---------------------------
   Compare routine for qsort
  ---------------------------*/

static int Compare (const BOXES * pbox1, const BOXES * pbox2)
{
     return pbox1->iBoxCount - pbox2->iBoxCount ;
}

/*-----------------------------------------------------------------
   DibPalMedianCut:  Creates palette based on median cut algorithm
  -----------------------------------------------------------------*/

HPALETTE DibPalMedianCut (HDIB hdib, int iRes)
{
     BOXES        boxes [256] ;
     HPALETTE     hPalette ;
     int          i, iArraySize, iCount, R, G, B, iTotCount, iDim, iEntry = 0 ;
     int        * piCount ;
     LOGPALETTE * plp ;
     MINMAX       mm ;

          // Validity checks
    
     if (DibBitCount (hdib) < 16)
          return NULL ;

     if (iRes < 3 || iRes > 8)
          return NULL ;

          // Accumulate counts of pixel colors

     iArraySize = 1 << (3 * iRes) ;

     if (NULL == (piCount = calloc (iArraySize, sizeof (int))))
          return NULL ;

     AccumColorCounts (hdib, piCount, iRes) ;

          // Find the dimensions of the total box

     iDim = 1 << iRes ;

     mm.Rmin = mm.Gmin = mm.Bmin = iDim - 1 ;
     mm.Rmax = mm.Gmax = mm.Bmax = 0 ;

     iTotCount = 0 ;

     for (R = 0 ; R < iDim ; R++)
     for (G = 0 ; G < iDim ; G++)
     for (B = 0 ; B < iDim ; B++)
          if ((iCount = piCount [PACK_RGB (R, G, B, iRes)]) > 0)
          {
               iTotCount += iCount ;

               if (R < mm.Rmin) mm.Rmin = R ;
               if (G < mm.Gmin) mm.Gmin = G ;
               if (B < mm.Bmin) mm.Bmin = B ;

               if (R > mm.Rmax) mm.Rmax = R ;
               if (G > mm.Gmax) mm.Gmax = G ;
               if (B > mm.Bmax) mm.Bmax = B ;
          }

          // Cut the first box (iterative function).
          //   On return, the boxes structure will have up to 256 RGB values, 
          //        one for each of the boxes, and the number of pixels in
          //        each box.
          //   The iEntry value will indicate the number of non-empty boxes.

     CutBox (piCount, iTotCount, mm, iRes, 0, boxes, &iEntry) ;
     free (piCount) ;

          // Sort the RGB table by the number of pixels for each color

     qsort (boxes, iEntry, sizeof (BOXES), Compare) ;

     plp = malloc (sizeof (LOGPALETTE) + (iEntry - 1) * sizeof (PALETTEENTRY)) ;

     if (plp == NULL)
          return NULL ;

     plp->palVersion    = 0x0300 ;
     plp->palNumEntries = iEntry ;

     for (i = 0 ; i < iEntry ; i++)
     {
          plp->palPalEntry[i].peRed   = boxes[i].rgbBoxAv.rgbRed ;
          plp->palPalEntry[i].peGreen = boxes[i].rgbBoxAv.rgbGreen ;
          plp->palPalEntry[i].peBlue  = boxes[i].rgbBoxAv.rgbBlue ;
          plp->palPalEntry[i].peFlags = 0 ;
     }

     hPalette = CreatePalette (plp) ;

     free (plp) ;
     return hPalette ;
}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧洲一区在线观看| 亚洲精品国产第一综合99久久 | 国产一区啦啦啦在线观看| 国产精品久久看| 69堂亚洲精品首页| 成人精品电影在线观看| 日本欧美一区二区三区| 亚洲美女视频在线观看| 久久久久久麻豆| 5858s免费视频成人| 99精品视频一区二区三区| 极品少妇xxxx偷拍精品少妇| 午夜精品久久久久久久久| 中文字幕不卡在线播放| 日韩一区二区免费在线观看| 在线视频欧美区| 波多野结衣精品在线| 国产综合色产在线精品| 日韩avvvv在线播放| 亚洲成人资源网| 亚洲人吸女人奶水| 中文字幕欧美激情一区| 欧美成人激情免费网| 欧美精品日韩一本| 欧美日韩视频在线一区二区 | 国产999精品久久| 另类欧美日韩国产在线| 日本成人中文字幕| 日韩中文字幕91| 亚洲第一电影网| 亚洲国产视频一区| 亚洲国产另类精品专区| 一区二区三区鲁丝不卡| 亚洲免费观看高清完整版在线观看 | 欧美变态口味重另类| 欧美一区二区视频在线观看| 欧美精品日日鲁夜夜添| 欧美欧美午夜aⅴ在线观看| 欧美在线视频不卡| 欧美色图12p| 欧美美女一区二区三区| 欧美日韩国产小视频| 91精品福利在线| 欧美天堂亚洲电影院在线播放| 91福利区一区二区三区| 在线观看一区二区精品视频| 欧美午夜电影网| 欧美日韩另类一区| 欧美一区二区三区视频| 欧美一级免费大片| 精品日产卡一卡二卡麻豆| 久久综合九色综合97婷婷| 久久久久久久精| 亚洲国产精品黑人久久久| 国产精品三级av在线播放| 国产精品久久三| 亚洲精品一二三| 性久久久久久久| 老司机免费视频一区二区| 精品一区二区免费在线观看| 国产在线不卡视频| jlzzjlzz亚洲日本少妇| 在线亚洲免费视频| 欧美区一区二区三区| 精品国产乱子伦一区| 国产午夜精品一区二区| 日韩理论片中文av| 亚洲 欧美综合在线网络| 美女视频黄频大全不卡视频在线播放| 国产一区二区在线观看视频| 成人免费视频一区| 欧美在线一二三| 2020国产精品| 一区二区三区欧美在线观看| 爽好多水快深点欧美视频| 国内精品在线播放| 91色在线porny| 91精品国产全国免费观看| 久久久亚洲精品石原莉奈 | 精品国产1区2区3区| 国产精品国产三级国产普通话99 | 亚洲综合一二区| 久久精品国产免费看久久精品| 高清不卡在线观看av| 欧美日韩一区二区三区不卡| 精品成人私密视频| 亚洲欧美激情在线| 看国产成人h片视频| 99久久久精品| 欧美成人国产一区二区| 亚洲乱码日产精品bd| 久久爱www久久做| 91久久国产最好的精华液| 国产色婷婷亚洲99精品小说| 午夜精品视频一区| 99在线视频精品| 久久亚洲二区三区| 香蕉加勒比综合久久| 成人免费的视频| 91精品国产乱码| 亚洲一区中文日韩| 成人h动漫精品一区二区| 日韩一区二区三区在线| 一区二区三区免费看视频| 国产一区二区女| 91麻豆精品国产91久久久 | 国产一区二区三区电影在线观看 | a亚洲天堂av| 在线观看中文字幕不卡| 91麻豆精品国产无毒不卡在线观看| 欧美日韩精品是欧美日韩精品| 丁香激情综合国产| 麻豆91精品视频| 偷偷要91色婷婷| 亚洲男人的天堂一区二区| 欧美刺激脚交jootjob| 精品日本一线二线三线不卡| 国产精品欧美一区二区三区| 亚洲美女免费在线| 久久激情五月激情| 成人夜色视频网站在线观看| 综合网在线视频| 国产宾馆实践打屁股91| 国产精品国产三级国产aⅴ中文| 国产麻豆成人精品| 一区二区三区在线观看欧美| 97久久超碰国产精品电影| 精品国偷自产国产一区| 美女看a上一区| 久久在线免费观看| 在线视频观看一区| 欧美大片顶级少妇| 成人av在线播放网站| 中文字幕中文字幕一区| 欧美精品一区男女天堂| 亚洲国产成人精品视频| 欧美精品自拍偷拍动漫精品| 日韩专区一卡二卡| 久久久久久久久99精品| 成人av在线播放网站| 亚洲色图.com| 久久精品视频网| 欧美亚洲综合久久| 粉嫩av亚洲一区二区图片| 精品福利一二区| 北条麻妃国产九九精品视频| 亚洲国产精品一区二区久久| 精品久久99ma| 日韩一卡二卡三卡| 不卡一区在线观看| 精品制服美女丁香| 亚洲免费av在线| 亚洲欧洲国产日本综合| 日韩视频一区二区三区在线播放| 国产伦精品一区二区三区在线观看| 有坂深雪av一区二区精品| 欧美r级电影在线观看| 久久久久久久久久看片| 国产精品人人做人人爽人人添| 国产欧美精品一区| 亚洲自拍都市欧美小说| 欧美日本国产视频| 美女mm1313爽爽久久久蜜臀| 2014亚洲片线观看视频免费| 99视频精品免费视频| 亚洲制服丝袜av| 欧美本精品男人aⅴ天堂| 成人午夜视频网站| 一级做a爱片久久| 日韩视频免费观看高清完整版在线观看 | 欧美图区在线视频| 麻豆精品精品国产自在97香蕉| 国产人成一区二区三区影院| 99久久国产综合精品麻豆| 午夜精品国产更新| 久久九九99视频| 欧美性猛交xxxxxx富婆| 久久国产福利国产秒拍| 亚洲人成在线播放网站岛国| 91精品国产综合久久精品图片 | 欧美视频精品在线观看| 国内欧美视频一区二区| 亚洲男人的天堂网| 精品久久久网站| 色女孩综合影院| 国产原创一区二区| 夜夜精品视频一区二区| 精品国产不卡一区二区三区| 一本久久精品一区二区| 麻豆91在线播放免费| 一区二区成人在线| 久久夜色精品国产噜噜av| 在线国产亚洲欧美| 国产精品乡下勾搭老头1| 日韩精品91亚洲二区在线观看| 中文字幕av一区 二区| 日韩三级免费观看| 欧美视频在线不卡| jizzjizzjizz欧美| 国产自产高清不卡|