如何把png格式的图片编译到程序中,以及提取的方法(急求)

songguozhi 2009-06-26 04:18:00
我的程序中需要使用很多PNG格式的图片,我想把图片随程序一起编译进去,有两个问题:
1.能不能直接编译到主程序中去,具体方法??
2.做成DLL的话,怎么写资源文件,怎么编译,怎么提取?

希望高人指点???????????
...全文
303 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
songguozhi 2009-06-27
  • 打赏
  • 举报
回复
谢谢CCRUN,不过,我需要加上
// 显示在Image中
Image1->Picture->Bitmap->Assign(NULL);
Image1->Picture->Bitmap->Assign(png);
否则的话,以前的图片还在

可能是因为我现在这台电脑上的2009没有升级Update 3,4造成的


我还要提问把TXT文本文件怎么制作成DLL,以及读取的方法,最好是采用Stream的方式?
hnzlk 2009-06-27
  • 打赏
  • 举报
回复
这样做是不是图片还是要存在一个目录下,如果要让别人找不到图片怎么办,就像编译进exe,或者dll中!
hnzlk 2009-06-27
  • 打赏
  • 举报
回复
如果是bcb6呢?
ccrun.com 2009-06-26
  • 打赏
  • 举报
回复
ccrun.com 2009-06-26
  • 打赏
  • 举报
回复
我来了!!!楼主都说了“需要使用很多PNG格式的图片”,把这些PNG图片打包进EXE的资源,显然不太明智。可以专门做一个资源Dll,下面我举个完整的例子:

打开2009,new一个Dynamic-link Library工程,可以不选择“使用VCL”。在dll工程中,再做一个纯文本的.rc文件,内容如下:
[code=BatchFile]CrnPNG1 RCDATA "C:\\ccrun\\123.png"
CrnPNG2 RCDATA "C:\\ccrun\\234.png"
CrnPNG3 RCDATA "C:\\ccrun\\345.png"
CrnPNG4 RCDATA "C:\\ccrun\\456.png"[/code]

注意我示例中的图片放在C:\ccrun目录,你需要更改为自己的图片目录和文件
最后直接编译这个dll工程,会生成一个dll文件,留着后面用。

在2009中new一个VCL Forms Application,然后添加一个Image和一个按钮在窗体,然后在.h文件中添加以下代码:
#include <PngImage.hpp>
// 以下添加到Form类中
private: // User declarations
HANDLE hDll;
TPngImage *png;


在.cpp文件中,Form的构造函数,OnClose事件和Button1的OnClick事件中添加以下代码:

__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
hDll = LoadLibrary(TEXT("dll.dll"));
png = new TPngImage;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
FreeLibrary(hDll);
delete png;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
// 从Dll资源中直接装载PNG图片
png->LoadFromResourceName(int(hDll), String("CrnPNG1")); // CrnPNG2, CrnPNG3....
// 显示在Image中
Image1->Picture->Bitmap->Assign(png);
}
fairchild811 2009-06-26
  • 打赏
  • 举报
回复
在2009,直接在TImage控件的object inspetor的Picture属性内添加,就编译到程序中了
mgsg 2009-06-26
  • 打赏
  • 举报
回复
在BCB6下通过.
资源文件的方法.
lyuan png lyuan.png


void Tfm_main::GetImageRes(Gdiplus::Graphics &g,String pngName)
{

TResourceStream *Res1 = new TResourceStream((int)HInstance,pngName,"png");
HRSRC hRsrc = ::FindResource ((HMODULE )HInstance,pngName.c_str(),"png");
if (!hRsrc)
return ;

//load resource into memory
DWORD len = SizeofResource((HMODULE )HInstance, hRsrc);
BYTE* lpRsrc = (BYTE*)LoadResource((HMODULE )HInstance, hRsrc);
if (!lpRsrc)
return ;

//Allocate global memory on which to create stream
HGLOBAL m_hMem = GlobalAlloc(GMEM_FIXED, len);
BYTE* pmem = (BYTE*)GlobalLock(m_hMem);
memcpy(pmem,lpRsrc,len);
IStream* pstm;
CreateStreamOnHGlobal(m_hMem,FALSE,&pstm);
Gdiplus::Bitmap * Image = Gdiplus::Bitmap::FromStream(pstm); //Gdiplus::Bitmap::FromStream(pstm);

RectF r(0,0,Image->GetWidth() ,Image->GetHeight());
g.DrawImage(Image,r);
//free/release stuff
//GlobalUnlock(m_hMem);
pstm->Release();
GlobalFree(m_hMem);
FreeResource(lpRsrc);

//m_Image->GetWidth(),m_Image->GetHeight()
delete Res1;
delete Image;


}
songguozhi 2009-06-26
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 ccrun 的回复:]
先说清楚,你是用CBuilder6还是2009?因为2009已经内置TPNGImage,如果是6的话,就要麻烦一些。
[/Quote]
版本:
2009的
CodeGear™ RAD Studio 2009 Version 12.0.3420.21218 Copyright © 2009 Embarcadero Technologies, Inc. All Rights Reserved.
songguozhi 2009-06-26
  • 打赏
  • 举报
回复
2009的
CodeGear™ RAD Studio 2009 Version 12.0.3420.21218 Copyright © 2009 Embarcadero Technologies, Inc. All Rights Reserved.
lghndyz 2009-06-26
  • 打赏
  • 举报
回复
当然可以把直接编译到主程序中去,图片随程序一起编译进去一般都会导致程序执行缓慢
ccrun.com 2009-06-26
  • 打赏
  • 举报
回复
先说清楚,你是用CBuilder6还是2009?因为2009已经内置TPNGImage,如果是6的话,就要麻烦一些。

604

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder VCL组件使用和开发
社区管理员
  • VCL组件使用和开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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