为什么我的图片加载到印章管理中失败

为什么我的图片加载到印章管理中失败,第1张

请确认您的是否是单色位图,目前系统只支持单色位图的电子章。使用WINDOWS自带的画图工具,打开要作为电子章的,然后另存,保存类型更改为单色位图(bmp;dib)即可。对于用户使用手写签名作为公章的也要进行上述 *** 作。谢谢您对电信产品的关注,祝您生活愉快。 如果以上信息没有解决您的问题,也可登录广东电信手机商城(>

DIB是单独的虚拟饰品。至于安全性,游戏饰品本身就是虚拟的东西。因为都是虚拟的东西,就不会像实物一样有恒定的价值,会根据市场需求有波动,也许会涨也许会跌。有利益的东西一定会伴随风险。当然如果你只是想玩这个饰品而不是靠它赚钱,我会非常推荐你使用它,因为DIB它这个饰品本身可以通过社区免费获取到,而你在玩游戏的同时也在活跃社区,他内部有一套自己的生态逻辑,刚出来吧就有好几个大网站都支持这东西了,我自己感觉挺好的。

在MFC下自己构造一个dib类实现上述功能还是有很多现成的代码~

下面就是一个构造的dib类,但是仅仅提供了最基本的一些 *** 作,代码来自《Visual C++数字图像处理典型算法及实现》。// dibImageh: interface for the CdibImage class

//

//////////////////////////////////////////////////////////////////////

#if !defined(AFX_dibIMAGE_H__254F3D1E_BB20_40DA_AE07_E8E0219DFA8C__INCLUDED_)

#define AFX_dibIMAGE_H__254F3D1E_BB20_40DA_AE07_E8E0219DFA8C__INCLUDED_

#if _MSC_VER > 1000

#pragma once

#endif // _MSC_VER > 1000

DECLARE_handle(Hdib); // dib句柄

#define PALVERSION 0x300 // dib常量

/ dib宏 /

// 判断是否是Win 30的dib

#define IS_WIN30_dib(lpbi) (((LPdword)(lpbi)) == sizeof(BITMAPINFOHEADER))

// 计算矩形区域的宽度

#define RECTWIDTH(lpRect) ((lpRect)->right - (lpRect)->left)

// 计算矩形区域的高度

#define RECTHEIGHT(lpRect) ((lpRect)->bottom - (lpRect)->top)

// 在计算图像大小时,采用公式:biSizeImage = biWidth' × biHeight。

// 是biWidth',而不是biWidth,这里的biWidth'必须是4的整倍数,表示

// 大于或等于biWidth的,离4最近的整倍数。WIDTHBYTES就是用来计算

// biWidth'

#define WIDTHBYTES(bits) (((bits) + 31) / 32 4)

// dib文件头标志(字符串"BM",写dib时用到该常数)

#define dib_HEADER_MARKER ((WORD) ('M' << 8) | 'B')

class CdibImage

{

// Constructor and Destructor ///////////////////////////////

public:

CdibImage();

virtual ~CdibImage();

// function /////////////////////////////////////////////////

public:

bool Paintdib (hdc, LPRECT, Hdib, LPRECT, CPalette pPal);

bool CreatedibPalette(Hdib hdib, CPalette cPal);

LPSTR FinddibBits (LPSTR lpbi);

dword dibWidth (LPSTR lpdib);

dword dibHeight (LPSTR lpdib);

WORD PaletteSize (LPSTR lpbi);

WORD dibNumColors (LPSTR lpbi);

HGLOBAL Copyhandle (HGLOBAL h);

bool Savedib (Hdib hdib, CFile& file);

Hdib ReaddibFile(CFile& file);

};

#endif // !defined(AFX_dibIMAGE_H__254F3D1E_BB20_40DA_AE07_E8E0219DFA8C__INCLUDED_)

///////////////////////////////////////////////////////////////////////

// dibImagecpp: implementation of the CdibImage class

// dib(Independent Bitmap) 函数:

//

// Paintdib() - 绘制dib对象

// CreatedibPalette() - 创建dib对象调色板

// FinddibBits() - 返回dib图像象素起始位置

// dibWidth() - 返回dib宽度

// dibHeight() - 返回dib高度

// PaletteSize() - 返回dib调色板大小

// dibNumColors() - 计算dib调色板颜色数目

// Copyhandle() - 拷贝内存块

//

// Savedib() - 将dib保存到指定文件中

// ReaddibFile() - 重指定文件中读取dib对象

//////////////////////////////////////////////////////////////////////

#include "stdafxh"

#include "dibDisplayh"

#include "dibImageh"

#ifdef _debug

#undef THIS_FILE

static char THIS_FILE[]=__FILE__;

#define new debug_NEW

#endif

//////////////////////////////////////////////////////////////////////

// Construction/Destruction

//////////////////////////////////////////////////////////////////////

CdibImage::CdibImage()

{

}

CdibImage::~CdibImage()

{

}

//////////////////////////////////////////////////////////////////////

// function

//////////////////////////////////////////////////////////////////////

/

函数名称:

Paintdib()

参数:

hdc hdc - 输出设备DC

LPRECT lpDCRect - 绘制矩形区域

Hdib hdib - 指向dib对象的指针

LPRECT lpdibRect - 要输出的dib区域

CPalette pPal - 指向dib对象调色板的指针

返回值:

bool - 绘制成功返回TRUE,否则返回FALSE。

说明:

该函数主要用来绘制dib对象。其中调用了Stretchdibits()或者

SetdibitsToDevice()来绘制dib对象。输出的设备由由参数hdc指

定;绘制的矩形区域由参数lpDCRect指定;输出dib的区域由参数

lpdibRect指定。

/

bool CdibImage::Paintdib(hdc hdc,

LPRECT lpDCRect,

Hdib hdib,

LPRECT lpdibRect,

CPalette pPal)

{

LPSTR lpdibHdr; // BITMAPINFOHEADER指针

LPSTR lpdibBits; // dib象素指针

bool bSuccess=FALSE; // 成功标志

HPALETTE hPal=NULL; // dib调色板

HPALETTE hOldPal=NULL; // 以前的调色板

if (hdib == NULL)

{

return FALSE;

}

lpdibHdr = (LPSTR)::GlobalLock((HGLOBAL) hdib);// 锁定dib

lpdibBits = FinddibBits(lpdibHdr); // 找到dib图像象素起始位置

if (pPal != NULL) // 获取dib调色板,并选中它

{

hPal = (HPALETTE) pPal->m_hObject;

hOldPal = ::SelectPalette(hdc, hPal, TRUE); // 选中调色板

}

::SetStretchBltMode(hdc, COLORONCOLOR); // 设置显示模式

// 判断是调用Stretchdibits()还是SetdibitsToDevice()来绘制dib对象

if ((RECTWIDTH(lpDCRect) == RECTWIDTH(lpdibRect)) &&

(RECTHEIGHT(lpDCRect) == RECTHEIGHT(lpdibRect)))

{

// 原始大小,不用拉伸。

bSuccess = ::SetdibitsToDevice(hdc, // hdc

lpDCRect->left, // DestX

lpDCRect->top, // DestY

RECTWIDTH(lpDCRect), // nDestWidth

RECTHEIGHT(lpDCRect), // nDestHeight

lpdibRect->left, // SrcX

(int)dibHeight(lpdibHdr) -

lpdibRect->top -

RECTHEIGHT(lpdibRect), // SrcY

0, // nStartScan

(WORD)dibHeight(lpdibHdr), // nNumScans

lpdibBits, // lpBits

(LPBITMAPINFO)lpdibHdr, // lpBitsInfo

dib_RGB_COLORS); // wUsage

}

else

{

// 非原始大小,拉伸。

bSuccess = ::Stretchdibits(hdc, // hdc

lpDCRect->left, // DestX

lpDCRect->top, // DestY

RECTWIDTH(lpDCRect), // nDestWidth

RECTHEIGHT(lpDCRect), // nDestHeight

lpdibRect->left, // SrcX

lpdibRect->top, // SrcY

RECTWIDTH(lpdibRect), // wSrcWidth

RECTHEIGHT(lpdibRect), // wSrcHeight

lpdibBits, // lpBits

(LPBITMAPINFO)lpdibHdr, // lpBitsInfo

dib_RGB_COLORS, // wUsage

SRCCOPY); // dwROP

}

::GlobalUnlock((HGLOBAL) hdib); // 解除锁定

if (hOldPal != NULL)

{

::SelectPalette(hdc, hOldPal, TRUE); // 恢复以前的调色板

}

return bSuccess;

}

/

函数名称:

CreatedibPalette()

参数:

Hdib hdib - 指向dib对象的指针

CPalette pPal - 指向dib对象调色板的指针

返回值:

bool - 创建成功返回TRUE,否则返回FALSE。

说明:

该函数按照dib创建一个逻辑调色板,从dib中读取颜色表并存到调色板中,

最后按照该逻辑调色板创建一个新的调色板,并返回该调色板的句柄。这样

可以用最好的颜色来显示dib图像。

/

bool CdibImage::CreatedibPalette(Hdib hdib, CPalette pPal)

{

LPLOGPALETTE lpPal; // 指向逻辑调色板的指针

handle hLogPal; // 逻辑调色板的句柄

HPALETTE hPal = NULL; // 调色板的句柄

int i; // 循环变量

WORD wNumColors; // 颜色表中的颜色数目

LPSTR lpbi; // 指向dib的指针

LPBITMAPINFO lpbmi; // 指向BITMAPINFO结构的指针(Win30)

LPBITMAPCOREINFO lpbmc; // 指向BITMAPCOREINFO结构的指针

bool bWinStyledib; // 表明是否是Win30 dib的标记

bool bResult = FALSE; // 创建结果

if (hdib == NULL)

{

return FALSE;

}

lpbi = (LPSTR) ::GlobalLock((HGLOBAL) hdib); // 锁定dib

lpbmi = (LPBITMAPINFO)lpbi; // 获取指向BITMAPINFO结构的指针(Win30)

lpbmc = (LPBITMAPCOREINFO)lpbi; // 获取指向BITMAPCOREINFO结构的指针

wNumColors = dibNumColors(lpbi);// 获取dib中颜色表中的颜色数目

if (wNumColors != 0)

{

// 分配为逻辑调色板内存

hLogPal = ::GlobalAlloc(GHND, sizeof(LOGPALETTE)

+ sizeof(PALETTEENTRY)

wNumColors);

// 如果内存不足,退出

if (hLogPal == 0)

{

::GlobalUnlock((HGLOBAL) hdib); // 解除锁定

return FALSE;

}

lpPal = (LPLOGPALETTE) ::GlobalLock((HGLOBAL) hLogPal);

lpPal->palVersion = PALVERSION; // 设置版本号

lpPal->palNumEntries = (WORD)wNumColors;// 设置颜色数目

bWinStyledib = IS_WIN30_dib(lpbi); // 判断是否是WIN30的dib

// 读取调色板

for (i = 0; i < (int)wNumColors; i++)

{

if (bWinStyledib)

{

// 读取红色绿色蓝色分量

lpPal->palPalEntry[i]peRed = lpbmi->bmiColors[i]rgbRed;

lpPal->palPalEntry[i]peGreen = lpbmi->bmiColors[i]rgbGreen;

lpPal->palPalEntry[i]peBlue = lpbmi->bmiColors[i]rgbBlue;

// 保留位

lpPal->palPalEntry[i]peFlags = 0;

}

else

{

// 读取红色绿色蓝色分量

lpPal->palPalEntry[i]peRed = lpbmc->bmciColors[i]rgbtRed;

lpPal->palPalEntry[i]peGreen = lpbmc->bmciColors[i]rgbtGreen;

lpPal->palPalEntry[i]peBlue = lpbmc->bmciColors[i]rgbtBlue;

// 保留位

lpPal->palPalEntry[i]peFlags = 0;

}

}

bResult = pPal->CreatePalette(lpPal);// 按照逻辑调色板创建调色板,并返回指针

::GlobalUnlock((HGLOBAL) hLogPal); // 解除锁定

::GlobalFree((HGLOBAL) hLogPal); // 释放逻辑调色板

}

::GlobalUnlock((HGLOBAL) hdib); // 解除锁定

return bResult;

}

/

函数名称:

FinddibBits()

参数:

LPSTR lpbi - 指向dib对象的指针

返回值:

LPSTR - 指向dib图像象素起始位置

说明:

该函数计算dib中图像象素的起始位置,并返回指向它的指针。

/

LPSTR CdibImage::FinddibBits(LPSTR lpbi)

{

return (lpbi + (LPdword)lpbi + PaletteSize(lpbi));

}

/

函数名称:

dibWidth()

参数:

LPSTR lpbi - 指向dib对象的指针

返回值:

dword - dib中图像的宽度

说明:

该函数返回dib中图像的宽度。对于Windows 30 dib,返回BITMAPINFOHEADER

中的biWidth值;对于其它返回BITMAPCOREHEADER中的bcWidth值。

/

dword CdibImage::dibWidth(LPSTR lpdib)

{

LPBITMAPINFOHEADER lpbmi; // 指向BITMAPINFO结构的指针(Win30)

LPBITMAPCOREHEADER lpbmc; // 指向BITMAPCOREINFO结构的指针

lpbmi = (LPBITMAPINFOHEADER)lpdib;

lpbmc = (LPBITMAPCOREHEADER)lpdib;

// 返回dib中图像的宽度

if (IS_WIN30_dib(lpdib))

{

return lpbmi->biWidth; // 对于Windows 30 dib,返回lpbmi->biWidth

}

else

{

return (dword)lpbmc->bcWidth; // 对于其它格式的dib,返回lpbmc->bcWidth

}

}

/

函数名称:

dibHeight()

参数:

LPSTR lpdib - 指向dib对象的指针

返回值:

dword - dib中图像的高度

说明:

该函数返回dib中图像的高度。对于Windows 30 dib,返回BITMAPINFOHEADER

中的biHeight值;对于其它返回BITMAPCOREHEADER中的bcHeight值。

/

dword CdibImage::dibHeight(LPSTR lpdib)

{

LPBITMAPINFOHEADER lpbmi; // 指向BITMAPINFO结构的指针(Win30)

LPBITMAPCOREHEADER lpbmc; // 指向BITMAPCOREINFO结构的指针

lpbmi = (LPBITMAPINFOHEADER)lpdib;

lpbmc = (LPBITMAPCOREHEADER)lpdib;

// 返回dib中图像的宽度

if (IS_WIN30_dib(lpdib))

{

return lpbmi->biHeight; // 对于Windows 30 dib,返回lpbmi->biHeight

}

else

{

return (dword)lpbmc->bcHeight; // 对于其它格式的dib,返回lpbmc->bcHeight

}

}

/

函数名称:

PaletteSize()

参数:

LPSTR lpbi - 指向dib对象的指针

返回值:

WORD - dib中调色板的大小

说明:

该函数返回dib中调色板的大小。对于Windows 30 dib,返回颜色数目×

RGBQUAD的大小;对于其它返回颜色数目×RGBTRIPLE的大小。

/

WORD CdibImage::PaletteSize(LPSTR lpbi)

{

// 计算dib中调色板的大小

if (IS_WIN30_dib (lpbi))

{

//返回颜色数目×RGBQUAD的大小

return (WORD)(dibNumColors(lpbi) sizeof(RGBQUAD));

}

else

{

//返回颜色数目×RGBTRIPLE的大小

return (WORD)(dibNumColors(lpbi) sizeof(RGBTRIPLE));

}

}

/

函数名称:

dibNumColors()

参数:

LPSTR lpbi - 指向dib对象的指针

返回值:

WORD - 返回调色板中颜色的种数

说明:

该函数返回dib中调色板的颜色的种数。对于单色位图,返回2,

对于16色位图,返回16,对于256色位图,返回256;对于真彩色

位图(24位),没有调色板,返回0。

/

WORD CdibImage::dibNumColors(LPSTR lpbi)

{

WORD wBitCount;

// 对于Windows的dib, 实际颜色的数目可以比象素的位数要少。

// 对于这种情况,则返回一个近似的数值。

// 判断是否是WIN30 dib

if (IS_WIN30_dib(lpbi))

{

dword dwClrUsed;

dwClrUsed = ((LPBITMAPINFOHEADER)lpbi)->biClrUsed; // 读取dwClrUsed值

if (dwClrUsed != 0)

{

// 如果dwClrUsed(实际用到的颜色数)不为0,直接返回该值

return (WORD)dwClrUsed;

}

}

// 读取象素的位数

if (IS_WIN30_dib(lpbi))

{

wBitCount = ((LPBITMAPINFOHEADER)lpbi)->biBitCount; // 读取biBitCount值

}

else

{

wBitCount = ((LPBITMAPCOREHEADER)lpbi)->bcBitCount; // 读取biBitCount值

}

// 按照象素的位数计算颜色数目

switch (wBitCount)

{

case 1:

return 2;

break;

case 4:

return 16;

break;

case 8:

return 256;

break;

default:

return 0;

break;

}

}

/

函数名称:

Copyhandle()

参数:

HGLOBAL h - 要复制的内存区域

返回值:

HGLOBAL - 复制后的新内存区域

说明:

该函数复制指定的内存区域。返回复制后的新内存区域,出错时返回0。

/

HGLOBAL CDibImage::Copyhandle (HGLOBAL h)

{

if (h == NULL)

{

return NULL;

}

dword dwLen = ::GlobalSize((HGLOBAL) h); // 获取指定内存区域大小

HGLOBAL hCopy = ::GlobalAlloc(GHND, dwLen); // 分配新内存空间

if (hCopy != NULL) // 判断分配是否成功

{

void lpCopy = ::GlobalLock((HGLOBAL) hCopy);

void lp = ::GlobalLock((HGLOBAL) h);

memcpy(lpCopy, lp, dwLen);

::GlobalUnlock(hCopy);

::GlobalUnlock(h);

}

return hCopy;

}

/

函数名称:

SaveDIB()

参数:

HDIB hDib - 要保存的DIB

CFile& file - 保存文件CFile

返回值:

bool - 成功返回TRUE,否则返回FALSE或者CFileException

说明:

该函数将指定的DIB对象保存到指定的CFile中。该CFile由调用程序打开和关闭。

/

bool CDibImage::SaveDIB(HDIB hDib, CFile& file)

{

BITMAPFILEHEADER bmfHdr; // Bitmap文件头

LPBITMAPINFOHEADER lpBI; // 指向BITMAPINFOHEADER的指针

dword dwDIBSize; // DIB大小

if (hDib == NULL)

{

return FALSE;

}

// 读取BITMAPINFO结构,并锁定

lpBI = (LPBITMAPINFOHEADER) ::GlobalLock((HGLOBAL) hDib);

if (lpBI == NULL)

{

return FALSE;

}

// 判断是否是WIN30 DIB

if (!IS_WIN30_DIB(lpBI))

{

// 不支持其它类型的DIB保存

::GlobalUnlock((HGLOBAL) hDib);

return FALSE;

}

////////////////////////////////////////////////////////////////////////

// 填充文件头///////////////////////////////////////////////////////////

bmfHdrbfType = DIB_HEADER_MARKER; // 文件类型"BM"

// 计算DIB大小时,最简单的方法是调用GlobalSize()函数。但是全局内存大小并

// 不是DIB真正的大小,它总是多几个字节。这样就需要计算一下DIB的真实大小。

// 文件头大小+颜色表大小

// (BITMAPINFOHEADER和BITMAPCOREHEADER结构的第一个dword都是该结构的大小)

dwDIBSize = (LPdword)lpBI + PaletteSize((LPSTR)lpBI);

// 计算图像大小

if ((lpBI->biCompression == BI_RLE8) || (lpBI->biCompression == BI_RLE4))

{

// 对于RLE位图,没法计算大小,只能信任biSizeImage内的值

dwDIBSize += lpBI->biSizeImage;

}

else

{

dword dwBmBitsSize; // 象素的大小

dwBmBitsSize = WIDTHBYTES((lpBI->biWidth)((dword)lpBI->biBitCount))

lpBI->biHeight; // 大小为Width Height

dwDIBSize += dwBmBitsSize; // 计算出DIB真正的大小

// 更新biSizeImage(很多bmp文件头中biSizeImage的值是错误的)

lpBI->biSizeImage = dwBmBitsSize;

}

// 计算文件大小:DIB大小+BITMAPFILEHEADER结构大小

bmfHdrbfSize = dwDIBSize + sizeof(BITMAPFILEHEADER);

// 两个保留字

bmfHdrbfReserved1 = 0;

bmfHdrbfReserved2 = 0;

// 计算偏移量bfOffBits,它的大小为Bitmap文件头大小+DIB头大小+颜色表大小

bmfHdrbfOffBits = (dword)sizeof(BITMAPFILEHEADER) + lpBI->biSize

+ PaletteSize((LPSTR)lpBI);

/////////////////////////////////////////////////////////////////////////

// 尝试写文件////////////////////////////////////////////////////////////

TRY

{

fileWrite((LPSTR)&bmfHdr, sizeof(BITMAPFILEHEADER)); // 写文件头

fileWriteHuge(lpBI, dwDIBSize); // 写DIB头和象素

}

catch (CFileException, e)

{

::GlobalUnlock((HGLOBAL) hDib);

THROW_LAST();

}

END_catch

::GlobalUnlock((HGLOBAL) hDib);

return TRUE;

}

/

函数名称:

ReadDIBFile()

参数:

CFile& file - 要读取得文件文件CFile

返回值:

HDIB - 成功返回DIB的句柄,否则返回NULL。

说明:

该函数将指定的文件中的DIB对象读到指定的内存区域中。除BITMAPFILEHEADER

外的内容都将被读入内存。

/

HDIB CDibImage::ReadDIBFile(CFile& file)

{

BITMAPFILEHEADER bmfHeader;

HDIB hDIB;

LPSTR pDIB;

dword dwBitsSize;

dwBitsSize = fileGetLength(); // 获取DIB(文件)长度(字节)

// 尝试读取DIB文件头

if (fileRead((LPSTR)&bmfHeader, sizeof(bmfHeader)) != sizeof(bmfHeader))

{

return NULL;

}

// 判断是否是DIB对象,检查头两个字节是否是"BM"

if (bmfHeaderbfType != DIB_HEADER_MARKER)

{

return NULL;

}

// 为DIB分配内存

hDIB = (HDIB) ::GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT, dwBitsSize);

if (hDIB == 0)

{

return NULL;

}

pDIB = (LPSTR) ::GlobalLock((HGLOBAL) hDIB);

if (fileReadHuge(pDIB, dwBitsSize - sizeof(BITMAPFILEHEADER)) !=

dwBitsSize - sizeof(BITMAPFILEHEADER) ) // 读象素

{

::GlobalUnlock((HGLOBAL) hDIB);

::GlobalFree((HGLOBAL) hDIB);

return NULL;

}

::GlobalUnlock((HGLOBAL) hDIB);

return hDIB;

}

对于对象:ObjPtr(对象名) 可以获得这个对象储存在内存中数据的地址

但是这个地址对于框来说一定不等于其内容的地址 因为是这个对象的一个属性

一般框是DDB(Device Dependent Bitmap,相对于DIB,设备无关位图)的位图,数据被系统封装,因此你只能 *** 作其DC(Device Context 设备上下文)或 *** 作被选入DC的位图:

使用系统提供的语句完成图像的处理(例如位图复制等),不能直接去修改内存实现位图数据的修改。

例如,

可以用GetBitmapBits,SetBitmapBits等函数来读取或修改位图的数据

可以用BitBlt函数来复制一个DC内容到另一个DC上

DC与位图区别在于DC是一个绘图的环境,DC更高层一点,而位图则是纯粹的数据

如果想直接通过修改内存(例如创建了一个数组,储存图像),请先建立一个DIB位图,然后SelectObject选入DC。

创建DIB可以用CreateDIBSection函数,这个函数可以从指定内存创建DIB位图,或者分配一个内存并返回其地址

(得到数据储存的地址以后就可以在vb中修改SafeArray结构来很容易地通过访问数组来访问该块内存)

注意:picturebox的DC是picturehdc,而不能用GetDC(picturehwnd),因为在AutoRedraw=True的时候这样会出问题。

#include <windowsh>

//读bmp需要两个结构

#pragma pack(push, enter_defBM, 1) //指定内存对齐单位为1。

typedef struct tagBmpFileHeader

{

WORD  bfType;      // 文件类型  BM

DWORD bfSize;      // 文件大小

WORD  bfReserved1; // 保留字

WORD  bfReserved2; // 保留字

DWORD bfOffBits;   // 位图的数据信息离文件头的偏移量

} BFH;

typedef struct tagBmpImgHeader

{

DWORD biSize;          // 表示本结构的大小,0X28

LONG  biWidth;         // 位图的宽度

LONG  biHeight;        // 位图的高度

WORD  biPlanes;        // 位面数永远为1

WORD  biBitCount;      // 位图的位数

DWORD biCompression;   // 压缩类型

DWORD biSizeImage;     // 表示位图数据区域的大小

LONG  biXPelsPerMeter; // 表示显示设备的水平分辨率

LONG  biYPelsPerMeter; // 表示显示设备的垂直分辨率

DWORD biClrUsed;       // 实际使用的颜色数目

DWORD biClrImportant;  // 重要的颜色数量

} BIH;

#pragma pack(pop, enter_defBM) //恢复默认内存对齐单位。

#define HDIB HANDLE // 位图句柄

DWORD WINAPI DIBNumColors(BYTE  data)

{

WORD wBitCount;

DWORD dwClrUsed = ((BIH )data)->biClrUsed;

if (dwClrUsed != 0) return (WORD)dwClrUsed;

wBitCount = ((BIH )data)->biBitCount;

return 1 << wBitCount;

}

WORD WINAPI PaletteSize(BYTE  data)

{

return (WORD)(::DIBNumColors(data)  sizeof(RGBQUAD));

BYTE   WINAPI FindDIBBits(BYTE  data)

{

return (data + (DWORD )data + ::PaletteSize(data));

}

// 获取Bmp的宽度

DWORD FAR DIBWidth(const BYTE  data)   

{   

BIH  pbmi;

pbmi = (BIH )data; 

if(pbmi->biSize == sizeof(BIH)) return pbmi->biWidth;

else return -1;

}   

// 获取Bmp的高度

DWORD FAR DIBHeight(const BYTE  data)   

{   

BIH  pbmi;

pbmi = (BIH )data; 

if(pbmi->biSize == sizeof(BIH)) return pbmi->biHeight;

else return -1;

}   

// 从文件读取Bmp图像数据

HDIB WINAPI ReadDIBFile(FILE  fp)

{

BFH    bmf;

HDIB   hDIB;

BYTE  pData;

rewind(fp);

if(fread(&bmf, sizeof(BFH), 1, fp) != 1) return NULL; // 文件读取错误

if(bmfbfType != 19778) return NULL;                  // 文件类型错误

hDIB = (HDIB) ::GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT, bmfbfSize); // 为DIB分配内存

if (hDIB == 0) return NULL;                           // 内存分配失败。

pData = (BYTE )::GlobalLock((HGLOBAL) hDIB);         // 锁定

if(fread(pData, 1, bmfbfSize - sizeof(BFH), fp) != (bmfbfSize - sizeof(BFH))) // 文件读取错误

{

::GlobalUnlock((HGLOBAL) hDIB); // 解除锁定

::GlobalFree((HGLOBAL) hDIB);   // 释放内存

return NULL;

}

::GlobalUnlock((HGLOBAL) hDIB);     // 解除锁定

return hDIB;                        // 返回DIB句柄

}

BOOL WINAPI PaintDIB(HDC hDC, int posX, int posY, HDIB hDIB)

{

BYTE    pDIBHd;             // BITMAPINFOHEADER指针

BYTE    pDIBBits;           // DIB象素指针

BOOL     bSuccess = FALSE;   // 成功标志

HPALETTE hPal     = NULL;    // DIB调色板

//HPALETTE hOldPal  = NULL;    // 以前的调色板

if (hDIB == NULL) return FALSE;                    // 判断DIB对象是否为空

pDIBHd    = (BYTE ) ::GlobalLock((HGLOBAL) hDIB); // 锁定DIB

pDIBBits  = ::FindDIBBits(pDIBHd);                 // 找到DIB图像象素起始位置

::SetStretchBltMode(hDC, COLORONCOLOR);            // 设置显示模式

    // 调用SetDIBitsToDevice()来绘制DIB对象

bSuccess = ::SetDIBitsToDevice(hDC, // hDC

           posX, posY, 

   ((BIH )pDIBHd)->biWidth,    // nDestWidth

   ((BIH )pDIBHd)->biHeight,   // nDestHeight

           0,                           // SrcX

           0,                           // SrcY

           0,                           // nStartScan

           (WORD)DIBHeight(pDIBHd),     // nNumScans

           pDIBBits,                    // lpBits

           (LPBITMAPINFO)pDIBHd,        // lpBitsInfo

           DIB_RGB_COLORS);             // wUsage

::GlobalUnlock((HGLOBAL) hDIB);     // 解除锁定

return bSuccess;

}

// 打印位图信息

VOID WINAPI PrintDIBInfo(HDIB hDIB)

{

BYTE    pDIBHd = (BYTE )::GlobalLock((HGLOBAL) hDIB);

BIH     pbmi   = (BIH )pDIBHd;

const char lp[] = 

{

"位图信息长度: %d\n",

"位图图像大小: %dx%d\n",

"位面数:%d\n",

"位图颜色深度: %d\n",

"位图数据压缩类型: %d\n",

"位图数据区域大小: %d\n",

"位图分辨率: 水平 %d dpi, 垂直 %d dpi\n",

};

printf("Windows V3 cBitmapInfoHeader 信息\n\n");

printf(lp[0], pbmi->biSize);

printf(lp[1], pbmi->biWidth, pbmi->biHeight);

printf(lp[2], pbmi->biPlanes);

printf(lp[3], pbmi->biBitCount);

printf(lp[4], pbmi->biCompression);

printf(lp[5], pbmi->biSizeImage);

printf(lp[6], (LONG)(pbmi->biXPelsPerMeter  00254f + 05f), (LONG)(pbmi->biYPelsPerMeter  00254f + 05f));

::GlobalUnlock((HGLOBAL) hDIB);     // 解除锁定

}

int main(int argc, char argv[])

{

HDIB x;

FILE  fp = fopen("1bmp", "rb");

if(fp==NULL) return -1;

x = ReadDIBFile(fp);

printf("DIB handle %u", x);

PaintDIB(GetDC(NULL), 0, 0, x);

PrintDIBInfo(x);

return 0;

}

位图图像可以由特殊的数字化采集设备获得。这些数字设备常用的有扫描仪、数码相机、数码摄像机和数码录像机等。 静态图像常见文件存储格式有: ⑴ BMP格式 ⑵ DIB格式 ⑶ GIF格式 ⑷ TIFF格式 ⑸ TGA格式 ⑹ PCX格式 ⑺ JPG格式 ⑻ EPS格式 ⑼ PNG格式

以上就是关于为什么我的图片加载到印章管理中失败全部的内容,包括:为什么我的图片加载到印章管理中失败、如何用实现更改图片的位深为8位,急。、DIB饰品是什么游戏的饰品这样的虚拟游戏饰品安全吗等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9490566.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-28
下一篇 2023-04-28

发表评论

登录后才能评论

评论列表(0条)

保存