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

📄 15. 与设备无关的位图.txt

📁 本书介绍了在Microsoft Windows 98、Microsoft Windows NT 4.0和Windows NT 5.0下程序写作的方法
💻 TXT
📖 第 1 页 / 共 5 页
字号:
BITMAPV5HEADER, * PBITMAPV5HEADER ;
        
这里有四个新字段,只有其中三个有用。这些字段支持ICC Profile Format Specification,这是由「国际色彩协会(International Color Consortium)」(由Adobe、Agfa、Apple、Kodak、Microsoft、Silicon Graphics、Sun Microsystems及其它公司组成)建立的。您能在http://www.icc.org上取得这个标准的副本。基本上,每个输入(扫描仪和摄影机)、输出(打印机和胶片记录器)以及显示(显示器)设备与将原始设备相关颜色(一般为RGB或CMYK)联系到设备无关颜色规格的设定文件有关,最终依据CIE XYZ值来修正颜色。这些设定文件的扩展名是.ICM(指「图像颜色管理:image color management」)。设定文件能嵌入DIB文件中或从DIB文件连结以指出建立DIB的方式。您能在/Platform SDK/Graphics and Multimedia Services/Color Management中取得有关Windows「图像颜色管理」的详细信息。

BITMAPV5HEADER的bV5CSType字段能拥有几个不同的值。如果是LCS_CALIBRATED_RGB,那么它就与BITMAPV4HEADER结构兼容。bV5Endpoints字段和伽马字段必须有效。

如果bV5CSType字段是LCS_sRGB,就不用设定剩余的字段。预设的颜色空间是「标准」的RGB颜色空间,这是由Microsoft和Hewlett-Packard主要为Internet设计的,它包含设备无关的内容而不需要大量的设定文件。此文件位于http://www.color.org/contrib/sRGB.html。

如果bV5CSType字段是LCS_Windows_COLOR_SPACE,就不用设定剩余的字段。Windows通过API函数呼叫使用预设的颜色空间显示位图。

如果bV5CSType字段是PROFILE_EMBEDDED,则DIB文件包含一个ICC设定文件。如果字段是PROFILE_LINKED,DIB文件就包含了ICC设定文件的完整路径和文件名称。在这两种情况下,bV5ProfileData都是从BITMAPV5HEADER开始到设定文件数据或文件名称起始位置的偏移量。bV5ProfileSize字段给出了数据或文件名的大小。不必设定bV5Endpoints和伽马字段。

显示DIB信息


现在让我们来看一些程序代码。实际上我们并不未充分了解显示DIB的知识,但至少能表从头结构上显示有关DIB的信息。如程序15-1 DIBHEADS所示。

程序15-1 DIBHEADS 
        
DIBHEADS.C
        
/*---------------------------------------------------------------------------
        
  DIBHEADS.C -- Displays DIB Header Information
        
                          (c) Charles Petzold, 1998
        
---------------------------------------------------------------------------*/
        
#include <windows.h>
        
#include "resource.h"
        

LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
        
TCHAR szAppName[] = TEXT ("DibHeads") ;
        
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
        
                   PSTR szCmdLine, int iCmdShow)
        
{
        
           HACCEL                hAccel ;
        
           HWND                  hwnd ;
        
           MSG                           msg ;
        
   WNDCLASS              wndclass ;
        

           wndclass.style                               = CS_HREDRAW | CS_VREDRAW ;
        
           wndclass.lpfnWndProc                 = WndProc ;
        
           wndclass.cbClsExtra                  = 0 ;
        
           wndclass.cbWndExtra                  = 0 ;
        
           wndclass.hInstance                   = hInstance ;
        
           wndclass.hIcon                       = LoadIcon (NULL, IDI_APPLICATION) ;
        
           wndclass.hCursor                     = LoadCursor (NULL, IDC_ARROW) ;
        
           wndclass.hbrBackground              = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
        
           wndclass.lpszMenuName                = szAppName ;
        
           wndclass.lpszClassName               = szAppName ;
        

           if (!RegisterClass (&wndclass))
        
           {
        
                  MessageBox (NULL, TEXT ("This program requires Windows NT!"),
        
                                  szAppName, MB_ICONERROR) ;
        
                  return 0 ;
        
           }
        
   
        
           hwnd = CreateWindow (szAppName, TEXT ("DIB Headers"),
        
                                  WS_OVERLAPPEDWINDOW,
        
                                  CW_USEDEFAULT, CW_USEDEFAULT,
        
                                  CW_USEDEFAULT, CW_USEDEFAULT,
        
                                  NULL, NULL, hInstance, NULL) ;
        
   
        
           ShowWindow (hwnd, iCmdShow) ;
        
           UpdateWindow (hwnd) ;
        

           hAccel = LoadAccelerators (hInstance, szAppName) ;
        
           while (GetMessage (&msg, NULL, 0, 0))
        
           {
        
                  if (!TranslateAccelerator (hwnd, hAccel, &msg))
        
                  {
        
                                  TranslateMessage (&msg) ;
        
                                 DispatchMessage (&msg) ;
        
                  }
        
           }
        
           return msg.wParam ;
        
}
        

void Printf (HWND hwnd, TCHAR * szFormat, ...)
        
{
        
           TCHAR                 szBuffer [1024] ;
        
           va_list       pArgList ;
        

           va_start (pArgList, szFormat) ;
        
           wvsprintf (szBuffer, szFormat, pArgList) ;
        
           va_end (pArgList) ;
        

           SendMessage (hwnd, EM_SETSEL, (WPARAM) -1, (LPARAM) -1) ;
        
           SendMessage (hwnd, EM_REPLACESEL, FALSE, (LPARAM) szBuffer) ;
        
           SendMessage (hwnd, EM_SCROLLCARET, 0, 0) ;
        
}
        
void DisplayDibHeaders (HWND hwnd, TCHAR * szFileName)
        
{
        
static TCHAR   * szInfoName []= { TEXT ("BITMAPCOREHEADER"),
        
                                   TEXT ("BITMAPINFOHEADER"),
        
                                   TEXT ("BITMAPV4HEADER"),
        
                                   TEXT ("BITMAPV5HEADER") } ;
        
Static TCHAR  * szCompression []={TEXT ("BI_RGB"),
        
TEXT    ("BI_RLE8"),
        
                                   TEXT ("BI_RLE4"),
        
                                   TEXT ("BI_BITFIELDS"),
        
                                   TEXT ("unknown") } ;
        
    BITMAPCOREHEADER      *      pbmch ;
        
    BITMAPFILEHEADER      *      pbmfh ;
        
    BITMAPV5HEADER*      pbmih ;
        
    BOOL                          bSuccess ;
        
    DWORD                 dwFileSize, dwHighSize, dwBytesRead ;
        
    HANDLE                hFile ;
        
  int                 i ;
        
  PBYTE               pFile ;
        
  TCHAR             * szV ;
        

                          // Display the file name
        

           Printf (hwnd, TEXT ("File: %s\r\n\r\n"), szFileName) ;
        
                          // Open the file
        
           hFile = CreateFile (szFileName, GENERIC_READ, FILE_SHARE_READ, NULL,
        
       OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, NULL) ;
        
           if (hFile == INVALID_HANDLE_VALUE)
        
           {
        
                          Printf (hwnd, TEXT ("Cannot open file.\r\n\r\n")) ;
        
                          return ;
        
    }
        
        
        
                          // Get the size of the file
        
           dwFileSize = GetFileSize (hFile, &dwHighSize) ;
        
           if (dwHighSize)
        
           {
        
                  Printf (hwnd, TEXT ("Cannot deal with >4G files.\r\n\r\n")) ;
        
                  CloseHandle (hFile) ;
        
                  return ;
        
    }
        
                          // Allocate memory for the file
        
           pFile = malloc (dwFileSize) ;
        
           if (!pFile)
        
           {
        
                  Printf (hwnd, TEXT ("Cannot allocate memory.\r\n\r\n")) ;
        
                  CloseHandle (hFile) ;
        
                  return ;
        
           }
        

                                  // Read the file
        
           SetCursor (LoadCursor (NULL, IDC_WAIT)) ;
        
           ShowCursor (TRUE) ;
        

           bSuccess = ReadFile (hFile, pFile, dwFileSize, &dwBytesRead, NULL) ;
        
           ShowCursor (FALSE) ;
        
           SetCursor (LoadCursor (NULL, IDC_ARROW)) ;
        

           if (!bSuccess || (dwBytesRead != dwFileSize))
        
           {
        
                         Printf (hwnd, TEXT ("Could not read file.\r\n\r\n")) ;
        
                          CloseHandle (hFile) ;
        
                   free (pFile) ;
        
                  return ;
        
           }
        

                                  // Close the file
        
           CloseHandle (hFile) ;
        
                                  // Display file size
        
           Printf (hwnd, TEXT ("File size = %u bytes\r\n\r\n"), dwFileSize) ;
        
                                  // Display BITMAPFILEHEADER structure
        
           pbmfh = (BITMAPFILEHEADER *) pFile ;
        
           Printf (hwnd, TEXT   ("BITMAPFILEHEADER\r\n")) ;
        
           Printf (hwnd, TEXT   ("\t.bfType = 0x%X\r\n"), pbmfh->bfType) ;
        

⌨️ 快捷键说明

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