16,473
社区成员
发帖
与我相关
我的任务
分享
#include <stdio.h>
#include <stdlib.h>
#include <tchar.h>
#include <windows.h>
#define WHSIZE 32
int _tmain(int, char**)
{
BITMAPINFOHEADER bih = {0}; //生成位图信息头
bih.biSize = sizeof(bih);
bih.biBitCount = 24;
bih.biWidth = bih.biHeight = WHSIZE;
bih.biPlanes = 1;
bih.biSizeImage = bih.biWidth * 3 * bih.biHeight;
void* lpBits = NULL;
HBITMAP hBitmap = CreateDIBSection(NULL, (BITMAPINFO*)&bih, DIB_RGB_COLORS, &lpBits, NULL, 0);
if (hBitmap != NULL)
{ //用CreateDIBSection创建HBITMAP
for (int i = 0; i < bih.biHeight; i++) //生成一个渐变位图
memset(((char*)lpBits) + i * bih.biWidth * 3, 0xFF * i / (bih.biHeight - 1), bih.biWidth * 3);
BITMAPFILEHEADER bfh = {0}; //生成文件头
bfh.bfType = 'MB';
bfh.bfOffBits = sizeof(bfh) + sizeof(bih);
bfh.bfSize = bfh.bfOffBits + bih.biSizeImage;
{ //写文件
HANDLE hFile = CreateFile(_T("E:\\a.bmp"), GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, 0, NULL);
if (hFile)
{
DWORD dwUseless = 0;
WriteFile(hFile, &bfh, sizeof(bfh), &dwUseless, NULL);
WriteFile(hFile, &bih, sizeof(bih), &dwUseless, NULL);
WriteFile(hFile, lpBits, bih.biSizeImage, &dwUseless, NULL);
CloseHandle(hFile);
printf("%s", "Write a.bmp succeeded!\r\n");
}
}
HBITMAP hBitmap2 = (HBITMAP)OleDuplicateData(hBitmap, CF_BITMAP, 0); //用下面的CopyImage就没问题,或者源是LoadImage出来的也没问题
//HBITMAP hBitmap2 = (HBITMAP)CopyImage(hBitmap, IMAGE_BITMAP, 0, 0, 0);
if (hBitmap2)
{
HDC hdc = GetDC(NULL);
if (hdc != NULL)
{
char chBits[WHSIZE * 3 * WHSIZE];
if (GetDIBits(hdc, hBitmap2, 0, bih.biHeight, chBits, (BITMAPINFO*)&bih, DIB_RGB_COLORS) != 0)
{
HANDLE hFile = CreateFile(_T("E:\\b.bmp"), GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, 0, NULL);
if (hFile)
{
DWORD dwUseless = 0;
WriteFile(hFile, &bfh, sizeof(bfh), &dwUseless, NULL);
WriteFile(hFile, &bih, sizeof(bih), &dwUseless, NULL);
WriteFile(hFile, chBits, bih.biSizeImage, &dwUseless, NULL);
CloseHandle(hFile);
printf("%s", "Write b.bmp succeeded!\r\n");
}
}
ReleaseDC(NULL, hdc);
}
DeleteObject(hBitmap2);
}
DeleteObject(hBitmap);
}
system("PAUSE");
return 0;
}
BOOL test()
{
// 用LoadImage()函数test.
HBITMAP hBmp1 = ( HBITMAP )::LoadImage( NULL, "car.bmp"/* 24Bit BMP*/, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION );
CMyDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// 取Doc打开的原图
HBITMAP hBitmap = pDoc->GetBMP()->GetHBitmap();
// 用LoadImage() load出来的复制一个新句柄
HBITMAP hBmp = ( HBITMAP )OleDuplicateData( hBmp1, CF_BITMAP, 0 );
if( !hBmp )
MessageBox( "fail.." );
HDC hDC = ::GetDC( NULL );
// 取来BitBlt() 复制的句柄
HDC hDrawDC = pDoc->GetBMP()->BeginDraw( hDC );
// 用来选入dupe的句柄然后BitBlt()
HDC hMemDC = CreateCompatibleDC( hDC );
HBITMAP hOld = ( HBITMAP )SelectObject( hMemDC, hBmp );
RECT rc;
rc.left = rc.top = 0; rc.right = pDoc->GetBMP()->GetWidth();
rc.bottom = pDoc->GetBMP()->GetHeight();
// 先刷白它
FillRect( hDrawDC, &rc, ( HBRUSH )GetStockObject( WHITE_BRUSH ) );
// BitBlt() dupe来的句柄
BitBlt( hDrawDC, 0, 0, rc.right, rc.bottom, hMemDC, 0, 0, SRCCOPY );
// 释放....
pDoc->GetBMP()->EndDraw();
SelectObject( hMemDC, hOld );
DeleteObject( hBmp );
::ReleaseDC( NULL, hDC );
Invalidate();
DeleteObject( hBmp1 );
return 1;
// 注: 用来test的两幅图象画面是一样的(32bit/24bit),系统色深32bit.
// 所以偶先Fill白再bitblt()
}