📄 15. 与设备无关的位图.txt
字号:
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 + -