300分再急问:如何将一系列2560*1920的JPG图像转换为100*75的BMP图像,然后保存到一个文件中????

byry 2003-12-03 11:24:15
要求:
1、使用CPicture类或者IPicture接口进行操作
2、使用隐式转换的方式,也就是说该过程在后台进行
3、将每个转化好的BMP临时图像都存储到一个文件中
4、能从该文件中将所有的BMP格式图像信息都读出来,并且能够显示这些图像

疑问:
1、怎么在后台进行隐式转化,不在界面上表现出来?
2、如何将转化好的BMP图像都存储到一个文件中?
3、怎样该定义文件结构,使得能从该文件中将所有的BMP格式图像信息都读出来

整个过程:
JPG(2560*1920)->BMP(100*75)->保存到一个文件中->读取全部图像信息

整个问题300分!!!如果大家的解答对我很有帮助的话,我还会加分感谢大家!!
...全文
61 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
byry 2004-01-12
  • 打赏
  • 举报
回复
关注!
epico 2004-01-11
  • 打赏
  • 举报
回复
要求上写得很清楚,用IPicture显然是使用ole的文件格式,gdi+是支持ole2的,用它写入IStream中,是能用OleLoadPicture得出来的,你再试试。
Image::Save(IStream*,CLSID*,EncoderParameters*) The Save method saves this image to a stream.
epico 2004-01-11
  • 打赏
  • 举报
回复
用gdi+渲染图片,存在ole2 storage文件格式中。
ms的东西交钱就可以了,不会涉及到版权的问题。
save(IStream * stream)
gnu的话,libjpeg + berkeley DB(存储文件)即可
xx_xuxiandi 2004-01-10
  • 打赏
  • 举报
回复
慢就慢在GetPixel上了

你可以试试用GetDIBits函数
因为你已经Render到某个bitmap上了,所以用GetDIBits应该能得到相应的数据
wuyapu 2004-01-09
  • 打赏
  • 举报
回复
IJG 的libjpeg
wuyapu 2004-01-09
  • 打赏
  • 举报
回复
为什么必须用IPicture接口?
随便找个免费的库自己实现很快的
photomm 2004-01-08
  • 打赏
  • 举报
回复
UP
nonocast 2003-12-25
  • 打赏
  • 举报
回复
其实如果用CxImage只需要几句就好了
不如看看http://www.codeproject.com/bitmap/cximage.asp

May you succeed!
byry 2003-12-25
  • 打赏
  • 举报
回复
UP
robinzo 2003-12-16
  • 打赏
  • 举报
回复
GDI+, CImage
用起来很easy,不用这么费劲了,为什么不用
donger 2003-12-16
  • 打赏
  • 举报
回复
上面他们说的方法是可行的阿~虽然并不是很好的
找个图形库吧
byry 2003-12-16
  • 打赏
  • 举报
回复
这涉及到版权,兄弟,我们要自主开发,难为我了
byry 2003-12-15
  • 打赏
  • 举报
回复
已经半个月了,期待中。。。
bsbcn 2003-12-09
  • 打赏
  • 举报
回复
我也刚提出了这个问题很类似,呵呵,我期待,新手我的说
byry 2003-12-08
  • 打赏
  • 举报
回复
问题还是没有解决,等待中。。。
byry 2003-12-04
  • 打赏
  • 举报
回复
我要一次处理近100张2560*1920的JPG图像,而且还要将处理好的BMP图像保存,请问这样大约要多久?
byry 2003-12-03
  • 打赏
  • 举报
回复
曾经有认这么做:


用IPicture加载Jpg,然后用IPicture::Render函数把它画到一个DC上,这个函数本身是支持缩放的。

然后你可以用GetPixel()得到每个点的像素,也就是得到了位图的数据,然后你就自己保存BMP了。bmp的格式很简单,你自己保存不回太难。


但是这样做就会让户用看到,不能实现该过程对用户的隐藏,所以,这种方法不理想


ddddh 2003-12-03
  • 打赏
  • 举报
回复
对了

上次我测过的,Render一幅1600x1200的jpg(缩小显示的),在我的XP1800+ 512
DDR上的速度是不到20ms


楼主可以放心了
ddddh 2003-12-03
  • 打赏
  • 举报
回复
render速度很快的

慢就慢在GetPixel上了

你可以试试用GetDIBits函数
因为你已经Render到某个bitmap上了,所以用GetDIBits应该能得到相应的数据


试试看吧!
spark_zh 2003-12-03
  • 打赏
  • 举报
回复
用gdiplus做就可以了。


CString sBmpFile = "X:\\XXX.bmp"; //已有的bmp文件名

WCHAR wFile[MAX_PATH];
MultiByteToWideChar(CP_ACP, 0, sBmpFile, -1, wFile, MAX_PATH);
Image image(wFile);
Image* pThumbnail = image.GetThumbnailImage(100,75,NULL,NULL);

CString sJpgFile = "X:\\XXX.jpg"; //要生成的jpg文件名
CLSID pngClsid;
GetEncoderClsid(L"image/jpeg", &pngClsid);

MultiByteToWideChar(CP_ACP, 0, sJpgFile, -1, wFile, MAX_PATH);
pThumbnail->Save(wFile, &pngClsid, NULL);

pThumbnail->GetWidth(); //宽度
pThumbnail->GetHeight(); //高度

//上面用到了这个函数
int GetEncoderClsid(const WCHAR *format, CLSID *pClsid)
{
UINT num = 0; // number of image encoders
UINT size = 0; // size of the image encoder array in bytes

ImageCodecInfo* pImageCodecInfo = NULL;

GetImageEncodersSize(&num, &size);
if(size == 0)
return -1; // Failure

pImageCodecInfo = (ImageCodecInfo*)(malloc(size));
if(pImageCodecInfo == NULL)
return -1; // Failure

GetImageEncoders(num, size, pImageCodecInfo);

for(UINT j = 0; j < num; ++j)
{
if( wcscmp(pImageCodecInfo[j].MimeType, format) == 0 )
{
*pClsid = pImageCodecInfo[j].Clsid;
free(pImageCodecInfo);
return j; // Success
}
}

free(pImageCodecInfo);
return -1; // Failure

}
加载更多回复(5)

19,468

社区成员

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

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