GDI+ 获取图像内存像素指针

  方法1:static Bitmap* FromHBITMAP(HBITMAP hbm, HPALETTE hpal); 

  方法2:static Bitmap* FromBITMAPINFO(  const BITMAPINFO* gdiBitmapInfo, VOID* gdiBitmapData ); 

   方法1 关联的时候好像是copy了一份图像像素数据;    Bitmap::LockBits,获取BitmapData,必须是有ImageLockModeUserInputBuf,否则获取的数据有错误;
   方法2 关联的时候好像直接关联操作了关联的像素数据;可以直接操作关联时候的像素指针了;

   方法3 一般Bitmap bitmap(L"LockBitsTest1.bmp") 关联位图,可直接Bitmap::LockBits,无需ImageLockModeUserInputBuf。

 

//
  GDI+ 获取的像素指针: BYTE* pixels = (BYTE*)bitmapData->Scan0; 排列顺序是 从左到右,从上到下;
      (bitmapData->Stride小于0,否则反之;如果ImageLockModeUserInputBuf时,程序员自己设置bitmapData->Stride值(包括bitmapData->Scan0指向的内存空间),不可小于0);

  一般读文件方式得到的像素指针 , 排列顺序是 从左到右,从下到上;
//

 

//  ImageLockModeUserInputBuf实例:

 BitmapData bitmapData;     

 bitmapData.Stride = 1920 ;   

 bitmapData.Scan0 = new BYTE[w*h*3];
  Rect rect(0,0, w, h);

  ptempBitmap->LockBits(   &rect,  ImageLockModeRead|ImageLockModeWrite |ImageLockModeUserInputBuf, 

   PixelFormat24bppRGB,  &bitmapData); 

   memcpy(pBuffer, (BYTE*)bitmapData.Scan0, BufferLen);     

  ptempBitmap->UnlockBits( &bitmapData);   
  delete bitmapData.Scan0;

实例2:

BOOL CMainFrame::SaveBitmapDataToBin(CString szBMPPath)  
{  
	BitmapData data; 
	Bitmap *bmp = ::new Bitmap(szBMPPath.AllocSysString());  
	if (bmp->GetLastStatus() != Ok)  
	{
		::delete bmp; 
		return FALSE; 
	}

	Gdiplus::Rect bmpRect(0, 0, bmp->GetWidth(), bmp->GetHeight());  
	UINT pixelSize = GetPixelFormatSize(PixelFormat16bppRGB565);  
	data.Stride = ((pixelSize * bmpRect.Width + 31) & 0xffffffe0) >> 3;  
	data.Scan0 = (void*)new char[bmpRect.Height * data.Stride];  
	bmp->LockBits(&bmpRect, ImageLockModeRead | ImageLockModeUserInputBuf, PixelFormat16bppRGB565, &data);  
	bmp->UnlockBits(&data);  
	::delete bmp; 

	CString BinName = m_szProjectPath.Left(m_szProjectPath.ReverseFind('\\') + 1) + _T("output");

	if(!PathIsDirectory(BinName))//判断文件夹是否存在
		CreateDirectory(BinName, NULL);//创建一个新的文件夹

	szBMPPath.Delete(0, szBMPPath.ReverseFind('\\'));
	//计算文本文件名
	BinName += szBMPPath;
	BinName = BinName.Left(BinName.Find('.'));
	BinName +=_T( ".bin");

	char * hexData = (char *)data.Scan0;
	CArray<char *> arr;
	for (int i = 0; i < bmpRect.Height * data.Stride; i++)
	{
		arr.Add((char *)(hexData + i));
	}

	CFile file;
	if(!file.Open(BinName, CFile::modeCreate | CFile::modeWrite))
	{
		::delete[] data.Scan0;
		return FALSE;
	}
	//file.Write((char *)data.Scan0, bmpRect.Height * data.Stride);
	for (int i = 0; i < bmpRect.Height * data.Stride; i += 4)
	{
		file.Write(arr.GetAt(i + 1), 1);
		file.Write(arr.GetAt(i + 0), 1);
		
		file.Write(arr.GetAt(i + 3), 1);
		file.Write(arr.GetAt(i + 2), 1);
	}

	file.Close();
	::delete[] data.Scan0;

	return TRUE;  
}  

示例下载地址:http://download.csdn.net/detail/qq_23992597/9540333

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值