⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 visualpng.c

📁 A good png library for mulit-platform
💻 C
📖 第 1 页 / 共 2 页
字号:
   // Calculate new X position, then adjust for workarea   xNew = rParent.left + ((wParent - wChild) /2);   if (xNew < rWorkArea.left) {      xNew = rWorkArea.left;   } else if ((xNew+wChild) > rWorkArea.right) {      xNew = rWorkArea.right - wChild;   }   // Calculate new Y position, then adjust for workarea   yNew = rParent.top  + ((hParent - hChild) /2);   if (yNew < rWorkArea.top) {      yNew = rWorkArea.top;   } else if ((yNew+hChild) > rWorkArea.bottom) {      yNew = rWorkArea.bottom - hChild;   }   // Set it, and return   return SetWindowPos (hwndChild, NULL, xNew, yNew, 0, 0, SWP_NOSIZE |          SWP_NOZORDER);}//----------------//  BuildPngList//----------------BOOL BuildPngList (PTSTR pstrPathName, TCHAR **ppFileList, int *pFileCount,     int *pFileIndex){    static TCHAR              szImgPathName [MAX_PATH];    static TCHAR              szImgFileName [MAX_PATH];    static TCHAR              szImgFindName [MAX_PATH];    WIN32_FIND_DATA           finddata;    HANDLE                    hFind;    static TCHAR              szTmp [MAX_PATH];    BOOL                      bOk;    int                       i, ii;    int                       j, jj;    // free previous file-list    if (*ppFileList != NULL)    {        free (*ppFileList);        *ppFileList = NULL;    }    // extract foldername, filename and search-name    strcpy (szImgPathName, pstrPathName);    strcpy (szImgFileName, strrchr (pstrPathName, '\\') + 1);    strcpy (szImgFindName, szImgPathName);    *(strrchr (szImgFindName, '\\') + 1) = '\0';    strcat (szImgFindName, "*.png");    // first cycle: count number of files in directory for memory allocation    *pFileCount = 0;    hFind = FindFirstFile(szImgFindName, &finddata);    bOk = (hFind != (HANDLE) -1);    while (bOk)    {        *pFileCount += 1;        bOk = FindNextFile(hFind, &finddata);    }    FindClose(hFind);    // allocation memory for file-list    *ppFileList = (TCHAR *) malloc (*pFileCount * MAX_PATH);    // second cycle: read directory and store filenames in file-list    hFind = FindFirstFile(szImgFindName, &finddata);    bOk = (hFind != (HANDLE) -1);    i = 0;    ii = 0;    while (bOk)    {        strcpy (*ppFileList + ii, szImgPathName);        strcpy (strrchr(*ppFileList + ii, '\\') + 1, finddata.cFileName);        if (strcmp(pstrPathName, *ppFileList + ii) == 0)            *pFileIndex = i;        ii += MAX_PATH;        i++;        bOk = FindNextFile(hFind, &finddata);    }    FindClose(hFind);    // finally we must sort the file-list    for (i = 0; i < *pFileCount - 1; i++)    {        ii = i * MAX_PATH;        for (j = i+1; j < *pFileCount; j++)        {            jj = j * MAX_PATH;            if (strcmp (*ppFileList + ii, *ppFileList + jj) > 0)            {                strcpy (szTmp, *ppFileList + jj);                strcpy (*ppFileList + jj, *ppFileList + ii);                strcpy (*ppFileList + ii, szTmp);                // check if this was the current image that we moved                if (*pFileIndex == i)                    *pFileIndex = j;                else                    if (*pFileIndex == j)                        *pFileIndex = i;            }        }    }    return TRUE;}//----------------//  SearchPngList//----------------BOOL SearchPngList (        TCHAR *pFileList, int FileCount, int *pFileIndex,        PTSTR pstrPrevName, PTSTR pstrNextName){    if (FileCount > 0)    {        // get previous entry                if (pstrPrevName != NULL)        {            if (*pFileIndex > 0)                *pFileIndex -= 1;            else                *pFileIndex = FileCount - 1;                        strcpy (pstrPrevName, pFileList + (*pFileIndex * MAX_PATH));        }                // get next entry                if (pstrNextName != NULL)        {            if (*pFileIndex < FileCount - 1)                *pFileIndex += 1;            else                *pFileIndex = 0;                        strcpy (pstrNextName, pFileList + (*pFileIndex * MAX_PATH));        }                return TRUE;    }    else    {        return FALSE;    }}//-----------------//  LoadImageFile//-----------------BOOL LoadImageFile (HWND hwnd, PTSTR pstrPathName,                png_byte **ppbImage, int *pxImgSize, int *pyImgSize,                int *piChannels, png_color *pBkgColor){    static TCHAR szTmp [MAX_PATH];    // if there's an existing PNG, free the memory    if (*ppbImage)    {        free (*ppbImage);        *ppbImage = NULL;    }    // Load the entire PNG into memory    SetCursor (LoadCursor (NULL, IDC_WAIT));    ShowCursor (TRUE);    PngLoadImage (pstrPathName, ppbImage, pxImgSize, pyImgSize, piChannels,                  pBkgColor);    ShowCursor (FALSE);    SetCursor (LoadCursor (NULL, IDC_ARROW));    if (*ppbImage != NULL)    {        sprintf (szTmp, "VisualPng - %s", strrchr(pstrPathName, '\\') + 1);        SetWindowText (hwnd, szTmp);    }    else    {        MessageBox (hwnd, TEXT ("Error in loading the PNG image"),            szProgName, MB_ICONEXCLAMATION | MB_OK);        return FALSE;    }    return TRUE;}//----------------//  DisplayImage//----------------BOOL DisplayImage (HWND hwnd, BYTE **ppDib,        BYTE **ppDiData, int cxWinSize, int cyWinSize,        BYTE *pbImage, int cxImgSize, int cyImgSize, int cImgChannels,        BOOL bStretched){    BYTE                       *pDib = *ppDib;    BYTE                       *pDiData = *ppDiData;    // BITMAPFILEHEADER        *pbmfh;    BITMAPINFOHEADER           *pbmih;    WORD                        wDIRowBytes;    png_color                   bkgBlack = {0, 0, 0};    png_color                   bkgGray  = {127, 127, 127};    png_color                   bkgWhite = {255, 255, 255};    // allocate memory for the Device Independant bitmap    wDIRowBytes = (WORD) ((3 * cxWinSize + 3L) >> 2) << 2;    if (pDib)    {        free (pDib);        pDib = NULL;    }    if (!(pDib = (BYTE *) malloc (sizeof(BITMAPINFOHEADER) +        wDIRowBytes * cyWinSize)))    {        MessageBox (hwnd, TEXT ("Error in displaying the PNG image"),            szProgName, MB_ICONEXCLAMATION | MB_OK);        *ppDib = pDib = NULL;        return FALSE;    }    *ppDib = pDib;    memset (pDib, 0, sizeof(BITMAPINFOHEADER));    // initialize the dib-structure    pbmih = (BITMAPINFOHEADER *) pDib;    pbmih->biSize = sizeof(BITMAPINFOHEADER);    pbmih->biWidth = cxWinSize;    pbmih->biHeight = -((long) cyWinSize);    pbmih->biPlanes = 1;    pbmih->biBitCount = 24;    pbmih->biCompression = 0;    pDiData = pDib + sizeof(BITMAPINFOHEADER);    *ppDiData = pDiData;    // first fill bitmap with gray and image border    InitBitmap (pDiData, cxWinSize, cyWinSize);    // then fill bitmap with image    if (pbImage)    {        FillBitmap (            pDiData, cxWinSize, cyWinSize,            pbImage, cxImgSize, cyImgSize, cImgChannels,            bStretched);    }    return TRUE;}//--------------//  InitBitmap//--------------BOOL InitBitmap (BYTE *pDiData, int cxWinSize, int cyWinSize){    BYTE *dst;    int x, y, col;    // initialize the background with gray    dst = pDiData;    for (y = 0; y < cyWinSize; y++)    {        col = 0;        for (x = 0; x < cxWinSize; x++)        {            // fill with GRAY            *dst++ = 127;            *dst++ = 127;            *dst++ = 127;            col += 3;        }        // rows start on 4 byte boundaries        while ((col % 4) != 0)        {            dst++;            col++;        }    }    return TRUE;}//--------------//  FillBitmap//--------------BOOL FillBitmap (        BYTE *pDiData, int cxWinSize, int cyWinSize,        BYTE *pbImage, int cxImgSize, int cyImgSize, int cImgChannels,        BOOL bStretched){    BYTE *pStretchedImage;    BYTE *pImg;    BYTE *src, *dst;    BYTE r, g, b, a;    const int cDIChannels = 3;    WORD wImgRowBytes;    WORD wDIRowBytes;    int cxNewSize, cyNewSize;    int cxImgPos, cyImgPos;    int xImg, yImg;    int xWin, yWin;    int xOld, yOld;    int xNew, yNew;    if (bStretched)    {        cxNewSize = cxWinSize - 2 * MARGIN;        cyNewSize = cyWinSize - 2 * MARGIN;        // stretch the image to it's window determined size        // the following two are the same, but the first has side-effects        // because of rounding//      if ((cyNewSize / cxNewSize) > (cyImgSize / cxImgSize))        if ((cyNewSize * cxImgSize) > (cyImgSize * cxNewSize))        {            cyNewSize = cxNewSize * cyImgSize / cxImgSize;            cxImgPos = MARGIN;            cyImgPos = (cyWinSize - cyNewSize) / 2;        }        else        {            cxNewSize = cyNewSize * cxImgSize / cyImgSize;            cyImgPos = MARGIN;            cxImgPos = (cxWinSize - cxNewSize) / 2;        }        pStretchedImage = malloc (cImgChannels * cxNewSize * cyNewSize);        pImg = pStretchedImage;        for (yNew = 0; yNew < cyNewSize; yNew++)        {            yOld = yNew * cyImgSize / cyNewSize;            for (xNew = 0; xNew < cxNewSize; xNew++)            {                xOld = xNew * cxImgSize / cxNewSize;                r = *(pbImage + cImgChannels * ((yOld * cxImgSize) + xOld) + 0);                g = *(pbImage + cImgChannels * ((yOld * cxImgSize) + xOld) + 1);                b = *(pbImage + cImgChannels * ((yOld * cxImgSize) + xOld) + 2);                *pImg++ = r;                *pImg++ = g;                *pImg++ = b;                if (cImgChannels == 4)                {                    a = *(pbImage + cImgChannels * ((yOld * cxImgSize) + xOld)                        + 3);                    *pImg++ = a;                }            }        }        // calculate row-bytes        wImgRowBytes = cImgChannels * cxNewSize;        wDIRowBytes = (WORD) ((cDIChannels * cxWinSize + 3L) >> 2) << 2;        // copy image to screen        for (yImg = 0, yWin = cyImgPos; yImg < cyNewSize; yImg++, yWin++)        {            if (yWin >= cyWinSize - cyImgPos)                break;            src = pStretchedImage + yImg * wImgRowBytes;            dst = pDiData + yWin * wDIRowBytes + cxImgPos * cDIChannels;            for (xImg = 0, xWin = cxImgPos; xImg < cxNewSize; xImg++, xWin++)            {                if (xWin >= cxWinSize - cxImgPos)                    break;                r = *src++;                g = *src++;                b = *src++;                *dst++ = b; /* note the reverse order */                *dst++ = g;                *dst++ = r;                if (cImgChannels == 4)                {                    a = *src++;                }            }        }        // free memory        if (pStretchedImage != NULL)        {            free (pStretchedImage);            pStretchedImage = NULL;        }    }    // process the image not-stretched    else    {        // calculate the central position        cxImgPos = (cxWinSize - cxImgSize) / 2;        cyImgPos = (cyWinSize - cyImgSize) / 2;        // check for image larger than window        if (cxImgPos < MARGIN)            cxImgPos = MARGIN;        if (cyImgPos < MARGIN)            cyImgPos = MARGIN;        // calculate both row-bytes        wImgRowBytes = cImgChannels * cxImgSize;        wDIRowBytes = (WORD) ((cDIChannels * cxWinSize + 3L) >> 2) << 2;        // copy image to screen        for (yImg = 0, yWin = cyImgPos; yImg < cyImgSize; yImg++, yWin++)        {            if (yWin >= cyWinSize - MARGIN)                break;            src = pbImage + yImg * wImgRowBytes;            dst = pDiData + yWin * wDIRowBytes + cxImgPos * cDIChannels;            for (xImg = 0, xWin = cxImgPos; xImg < cxImgSize; xImg++, xWin++)            {                if (xWin >= cxWinSize - MARGIN)                    break;                r = *src++;                g = *src++;                b = *src++;                *dst++ = b; /* note the reverse order */                *dst++ = g;                *dst++ = r;                if (cImgChannels == 4)                {                    a = *src++;                }            }        }    }    return TRUE;}//-----------------//  end of source//-----------------

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -