把bmp转换成image失败了

花熊 2011-09-04 06:59:03
自己继续查,XDJM帮看下,谢谢

BOOL CGdiEffect::LoadResImage(int nResID,Image * &lpImage, LPCTSTR lpType)
{
// lpImage = NULL;
HRSRC hRsrc = ::FindResource (AfxGetResourceHandle(),MAKEINTRESOURCE(nResID),lpType);
if (!hRsrc)
return FALSE;
// load resource into memory ---------------------------------
DWORD len = SizeofResource(AfxGetResourceHandle(), hRsrc);
BYTE* lpRsrc = (BYTE*)LoadResource(AfxGetResourceHandle(), hRsrc);
if (!lpRsrc)
return FALSE;
// Allocate global memory on which to create stream ----------
HGLOBAL m_hMem = GlobalAlloc(GMEM_MOVEABLE, len);

BYTE* pmem = (BYTE*)GlobalLock(m_hMem);
memcpy(pmem,lpRsrc,len);
IStream* pstm;
HRESULT ht = CreateStreamOnHGlobal(m_hMem,TRUE,&pstm);
if (ht != S_OK)
{
GlobalUnlock(m_hMem);
pstm->Release();
return FALSE ;
}
// load from stream -------------------------------------------
lpImage=Gdiplus::Image::FromStream(pstm);

// free/release stuff -----------------------------------------
GlobalUnlock(m_hMem);
pstm->Release();
FreeResource(lpRsrc);
return TRUE ;
}
//---------测试代码--------------------------------------
ULONG_PTR token;
GdiplusStartupInput input ;
GdiplusStartup(&token, &input, NULL);

CGdiEffect ef ;
Image *pImg = NULL;
ef.LoadResImage(IDB_BITMAP1, pImg, RT_BITMAP);//这个失败了
//ef.LoadResImage(IDB_PNG1, pImg,TEXT("png"));//这个成功了
CWindowDC dc(this);
Graphics g(dc.GetSafeHdc());
//Image img(TEXT("f:\\ScrollBarButtons.bmp"));

g.DrawImage(pImg, 0, 0);
//g.DrawImage(&img, 0, 0);

if(pImg)
delete pImg;
delete []buffer;
GdiplusShutdown(token) ;



,唯一想到的是RT_BITMAP这个传错了???,求真象
...全文
245 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
GDI+加载32位的bitmap的时候,可能有问题,alpha位无法加载进去,导致整张图片是透明的,
要通过循环一个像素一个像素处理。

不知道楼主的问题是不是和这个有关,如果有关,请给点分:)
向立天 2011-10-08
  • 打赏
  • 举报
回复
您好
我是本版版主
此帖已多日无人关注
请您及时结帖
如您认为问题没有解决可按无满意结帖处理
另外本版设置了疑难问题汇总帖
并已在版面置顶
相关规定其帖子中有说明
您可以根据规定提交您帖子的链接
如您目前不想结帖只需回帖说明
我们会删除此结帖通知

见此回复三日内无回应
我们将强制结帖
相关规定详见界面界面版关于版主结帖工作的具体办法
o_yale_o 2011-10-08
  • 打赏
  • 举报
回复
你的错误我没耐心看
但可以给你写个能用的:

//=======================================================================
// 函数原型: BOOL CSYSGlobal::BMP2JPEG(LPCTSTR lpszBMPFileName, LPCTSTR lpszJPEGFileName , long lQuality /*= 100*/ )
// 功能描述: BMP文件转换成JPEG文件
// 参数说明: 名称 类型 说明
// lpszBMPFileName LPCTSTR 要转换的BMP文件名( 已存在文件 )
// lpszJPEGFileName LPCTSTR JPEG文件名( 根据BMP转换 新生成文件 )
// lQuality long 图片质量 ( 默认100% )
// 返 回 值:
// 依 赖 于: GDI+, ATL字符转换( 用 A2W() 转换ASCII -> Unicode )
// 具体 做法如下:
// 1. 加入GDI+支持: 在StdAfx.h的 "#endif // _AFX_NO_AFXCMN_SUPPORT" 前加入如下代码:
// #include <gdiplus.h>
// #include <GdiPlusEnums.h>
// using namespace Gdiplus;
// #pragma comment( lib, "gdiplus.lib" )
//
// //加入ATL字符转换支持: 在StdAfx.h中加入
// #include <atlconv.h>
//-----------------------------------------------------------------------
// 引 用 表: 无
// 更 新 表: 无
// 被引用于: 全局
// 创建日期: 2007年12月21日 16时02分57秒
// 修改日期:
// 修改说明:
//=======================================================================
BOOL CSYSGlobal::BMP2JPEG(LPCTSTR lpszBMPFileName, LPCTSTR lpszJPEGFileName, long lQuality /*= 100*/ )
{
USES_CONVERSION; //调用 A2W() 等宏时,必须先执行该行!!!

CLSID codecClsid;
EncoderParameters encoderParameters;
long quality;
Status stat;
GdiplusStartupInput gdiplusStartupInput;
ULONG gdiplusToken;
BOOL bRet = TRUE;

WCHAR wszcBmpFileName[ 512 ];
WCHAR wszJpgFileName[ 512 ];
WCHAR *lpwcBmpFileName = NULL;
WCHAR *lpwcJpgFileName = NULL;

#ifdef UNICODE
wcscpy( wszcBmpFileName, lpszBMPFileName );
wcscpy( wszJpgFileName, lpszJPEGFileName );
#else
lpwcBmpFileName = A2W( lpszBMPFileName );
lpwcJpgFileName = A2W( lpszJPEGFileName );
wcscpy( wszcBmpFileName, lpwcBmpFileName );
wcscpy( wszJpgFileName, lpwcJpgFileName );
#endif


GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
{
// Get an image from the disk.
Image image( wszcBmpFileName );

// Get the CLSID of the JPEG codec.
CSYSGlobal::GetCodecClsid( L"image/jpeg", &codecClsid );

// Before we call Image::Save, we must initialize an
// EncoderParameters object. The EncoderParameters object
// has an array of EncoderParameter objects. In this
// case, there is only one EncoderParameter object in the array.
// The one EncoderParameter object has an array of values.
// In this case, there is only one value ( of type LONG )
// in the array. We will set this value to 0, 50, and 100.

encoderParameters.Count = 1;
encoderParameters.Parameter[0].Guid = EncoderQuality;
encoderParameters.Parameter[0].Type = EncoderParameterValueTypeLong;
encoderParameters.Parameter[0].NumberOfValues = 1;

// Save the image as a JPEG with quality level 0.
quality = lQuality;
encoderParameters.Parameter[0].Value = &quality;
stat = image.Save( wszJpgFileName, &codecClsid, &encoderParameters);

if( stat == Ok )
{
//AfxMessageBox( _T( "保存JPEG文件成功" ) );
bRet = TRUE;
}
else
{
AfxMessageBox( _T( "保存JPEG文件失败!" ) );
bRet = FALSE;
}
}

GdiplusShutdown(gdiplusToken);

return bRet;
}
ezhong0812 2011-09-12
  • 打赏
  • 举报
回复
GDI+? 不懂,帮顶了。。。
liao_guo_bao 2011-09-10
  • 打赏
  • 举报
回复
IDB_BITMAP1 在资源中位图数据不存在 只是这个ID定义还在而已
花熊 2011-09-10
  • 打赏
  • 举报
回复
分可以加,我只求正确答案,谢谢,请不要凭想像猜测了,上面说的所有方法都试过,无效,
花熊 2011-09-10
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 pcgg5244 的回复:]
手动编辑*.rc

IDB_BITMAP1 BITMAP "res\\bitmap1.bmp"
改成
IDB_BITMAP1 bmp "res\\bitmap1.bmp"

ef.LoadResImage(IDB_BITMAP1, pImg,_T("bmp"));
[/Quote]试过了,程序直接挂掉
pcgg5244 2011-09-09
  • 打赏
  • 举报
回复
手动编辑*.rc

IDB_BITMAP1 BITMAP "res\\bitmap1.bmp"
改成
IDB_BITMAP1 bmp "res\\bitmap1.bmp"

ef.LoadResImage(IDB_BITMAP1, pImg,_T("bmp"));
老猿的春天 2011-09-08
  • 打赏
  • 举报
回复
bmp是32位的??
matrixcl 2011-09-08
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 hgy413 的回复:]

引用 9 楼 shunruo 的回复:
CreateStreamOnHGlobal(m_hMem,TRUE,&amp;pstm);
为TRUE时,pstm Release时m_hMem被释放,应为FALSE

和这个没什么关系,现在是PNG行,BMP不行,
[/Quote]

你的图片在资源里怎么放的?
"PNG"\"BMP"决定了图片的位置
花熊 2011-09-08
  • 打赏
  • 举报
回复
ef.LoadResImage(IDB_BITMAP1, pImg, MAKEINTRESOURCE(RT_BITMAP));

CreateStreamOnHGlobal(m_hMem,TRUE,&pstm);
为TRUE时,pstm Release时m_hMem被释放,应为FALSE

bmp是32位的??

都试过了,无效!!!!!!!!!!!!!!!!!!

花熊 2011-09-08
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 shunruo 的回复:]
CreateStreamOnHGlobal(m_hMem,TRUE,&pstm);
为TRUE时,pstm Release时m_hMem被释放,应为FALSE
[/Quote]
和这个没什么关系,现在是PNG行,BMP不行,
凤矶 2011-09-08
  • 打赏
  • 举报
回复
CreateStreamOnHGlobal(m_hMem,TRUE,&pstm);
为TRUE时,pstm Release时m_hMem被释放,应为FALSE
wyx100 2011-09-08
  • 打赏
  • 举报
回复
ef.LoadResImage(IDB_BITMAP1, pImg, RT_BITMAP);
==》
ef.LoadResImage(IDB_BITMAP1, pImg, MAKEINTRESOURCE(RT_BITMAP));?

buyong 2011-09-08
  • 打赏
  • 举报
回复
单步调试,哪里失败了
花熊 2011-09-08
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 mfc5158 的回复:]
bmp是32位的??
[/Quote]
莫非32位的不行
花熊 2011-09-07
  • 打赏
  • 举报
回复
没人鸟我了
花熊 2011-09-05
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 hastings 的回复:]
ef.LoadResImage(IDB_BITMAP1, pImg, RT_BITMAP);
==》
ef.LoadResImage(IDB_BITMAP1, pImg, MAKEINTRESOURCE(RT_BITMAP));?
[/Quote]
还是不行!
hastings 2011-09-04
  • 打赏
  • 举报
回复
ef.LoadResImage(IDB_BITMAP1, pImg, RT_BITMAP);
==》
ef.LoadResImage(IDB_BITMAP1, pImg, MAKEINTRESOURCE(RT_BITMAP));?
gold_water 2011-09-04
  • 打赏
  • 举报
回复
路过,帮顶!!!
最近搜索了些在内存中转换图片格式的东西,比如截屏后的bmp图片在内存中转为jpg数据流,你可以通过socket发送这段jpg内存数据流,同时,你也可以通过内存数据流逆转换。通过DibFile.h里面的两个函数完成(用的是Gdi+库): Bitmap* CreateBitmapFromMemory(const void *buf, size_t size); void* SaveBitmapToMemory(Bitmap *image, void **outbuf, size_t *size, size_t CodecIndex=0, ULONG quality=50); 说明:CodecIndex取值0-4,分别对应转换为jpg、bmp、gif、png、tiff格式,当为0时,参数quality有用,表示转换jpg的质量,取值0-100,数值越小,压缩比越大。注意:outbuf为指针的指针,会在内部malloc内存,以保存转换后的图片数据流。 虽然此软件中没用到这两个函数,但是测试通过。 你可以进行如下测试:把jpg图片以二进制数据读到内存中,然后通过CreateBitmapFromMemory函数构建Bitmap,然后再SaveBitmapToMemory转换为另一段内存中,把这段内存以二进制数据存入文件,并用其他看图软件打开保存后的图片。 其他说明:此软件在先前版本的基础上修正两处Bug: 1.保存图片时,若文件名含有点,会保存失败; 2.若在浏览图片时,另存图片后,滚动滚轮显示未知格式图片。 加入一个功能:保存为jpg图片时,可以选择图片质量。 有问题联系:hastings1986@163.com
All Office Converter Platinum v6.1 官方简体中文注册版是一款易于使用和专业的文件转换工具。它可以高质量的支持批量转换文件,网页和图像,以改善工作效率。有了这个强大的转换器,您可以创建PDF文件的通用格式,并转换PDF文件到其他通用格式,超级输出质量和效益。更多信息,您可以转换不同的Office文档格式,网页,图片。它可以支持全面的格式:Word(doc, docm, docx), Excel(xls .xlsx. xlsm),PowerPoint(ppt, pptc,  pptm),PDF,XLS,RTF,TXT,HTM/HTML,Website,JPG,BMP,GIF,TIF,WMF,EMF,TGA, RLE,PNG etc. 特征 *提供个性化服务的命令行服务器/开发。 *它可以同时转换不同的格式,以一个特定格式一次。 *它可以转换的网页上的网站或您的计算机。 *易于使用。转换的功能。 *更多的设置选项,让您控制输出文件更准确。 *保存导入的文件清单。 *支持加密的PDF文件。 *创建PDF和图像质量高。 *打开*. HTM或网址如下框架转换。 支持格式: 批量转换: Word (doc,docm,docx) Excel (xls.xlsx.xlsm), PowerPoint (ppt,pptc,pptm), RTF, TXT, HTM, HTML, Website, JPG, BMP, GIF, TIF, WMF, EMF to PDF (as default format, as image format, as text format) 批量转换: PDF to DOC, RTF, XLS, HTM, TXT, JPG, BMP, GIF, TIF, TGA, RLE, PNG, EMF, WMF 批量转换: Word (doc,docm,docx) to PDF (as default format, as image format, as text format), XLS, TXT, HTM, JPG, BMP, GIF, TIF, TGA, RLE, PNG, EMF, WMF. 批量转换: PDF, Excel (xls.xlsx.xlsm), TXT, HTM, HTML, JPG, BMP, GIF, TIF, EMF, WMF to DOC. 批量转换: PowerPoint (ppt,pptc,pptm) to JPG, BMP, GIF, TIF, TGA, RLE, PNG, EMF, WMF, DOC, XLS, RTF, TXT, PDF (as default format, as image format, as text format). 批量转换: HTM, HTML, Website to DOC, PDF (as default format, as image format, as text format), TXT, RTF, XLS, JPG, BMP, GIF, TIF, TGA, RLE, PNG, EMF, WMF. 注:此软件官方内置了对简体中文、繁体中文的支持,安装后在语言(Language)选项那里选择简体中文(Simplified Chinese或者Chinese GB)!

15,978

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧