CFileDialog dlg(TRUE);
if(dlg.DoModal()== IDOK)
{
CString filename=dlg.GetFileName();
CImage img;
img.Load(filename);
CImage bmp;
if( bmp.Create(10240,10240,32))
{ int w=img.GetWidth();
int h=img.GetHeight(); for (int i =0;i<w ;i ++ )
{
for (int j=0;j <h ;j ++)
{
bmp.SetPixel(i,j,img.GetPixel(i,j));
}
}
bmp.Save(_T("g:\\aaaaa.jpg")); } }

解决方案 »

  1.   


    CFileDialog dlg(TRUE);
    if(dlg.DoModal()== IDOK)
    {
    CString filename=dlg.GetFileName();
    CImage img;
    img.Load(filename);
    CImage bmp;
    if( bmp.Create(10240,10240,32))
    {int w=img.GetWidth();
    int h=img.GetHeight();for (int i =0;i<w ;i ++ )
    {
          for (int j=0;j <h ;j ++)
          {
              bmp.SetPixel(i,j,img.GetPixel(i,j));
          }
    }
    bmp.Save(_T("g:\\aaaaa.jpg"));}}如何生成大图片??
      

  2.   

    SetPixel()??开玩笑吧~应该会慢死~10240 * 10240大小的图片,算算有300M,太扯了吧~可以有大的图像数据,2G,但是显示的时候只取窗口大小的数据出来显示就好了~一屏幕的数据应该不至于大成那样吧
      

  3.   

    这是一个vb程序
    生成图片后的摘要:
    生成之后图片宽度29999像素
    高度29999像素
    水平分辩率 254 dpi
    垂直分辩率 254 dpi
    位深度 24
    帧数1 
      

  4.   

    SetPixel 只是示例。根据就没有办法创建这么大的图片。有没有别的处理方式??
      

  5.   

    应该没有直接的这么大图像的创建,要真这么大,也不会按常规的方式(bmp, jpg)存储吧,最好是设计自己的显示格式,尽可能的在内存里操作,不知道setPixel是不是要显示器中断的,巨慢无比,操作都到内存里搞定好了,实在要显示,从内存读取部分数据,显示就好了~
      

  6.   

    就是要生成3米*3米的图片。输出的图片交给打印设备进行打印。图片不能分割。输出之后的图才由刀片之类的进行分割。
    vb可以处理这个东西。vc处理不了嘛??
      

  7.   

    bmp位图的头信息里面的位图大小是32bit长度,理论上可以表示4G px * 4G px大小的图片。photoshop可以处理3G左右的psd文件,大约打印尺寸在2m*6m左右。(机器内存为4G, 更大的psd文件本人没有测试过。)可以肯定的是一般的图像处理软件在处理大图时会吃光所有内存。当然了,使用windows系统内建的gdi函数也会吃光内存。建议楼主自己想办法解决。比如分块存储。或者自己处理dib数据。
      

  8.   

    有没有哪位处理过。 #3楼 得分:0回复于:2010-08-17 16:30:39这是一个vb程序
    生成图片后的摘要:
    生成之后图片宽度29999像素
    高度29999像素
    水平分辩率 254 dpi
    垂直分辩率 254 dpi
    位深度 24
    帧数1  
     
    这是VB程序处理出来的数据。
      

  9.   

    30000*30000的24bits图像已经2个多G,直接申请内存是不现实了。
    用内存映像文件吧。
    先填好BITMAPFILEHEADER写文件里面。
    再填好BITMAPINFOHEADER写进去。注意BITMAPINFOHEADER有一个biSizeImage不要超过4G,再大了就不要用这样的方法了。
    然后写29999*29999*3的空间放像素(行不被4整除是要调整一下)。
    然后将这个大文件一部分一部分地映射到内存里面处理。当然也可以先创建内存映像文件再写文件头和信息头。
    这样大小的图不算特别大,还是好处理的。
      

  10.   


    VB有这个能力,能给出VB的代码吗?
    GDI肯定是没有办法创建这么大的图像的
    也许你看到这个文件只是文件而已,我也可以创建一个比这更大的图像,但是创建了你用GDI却打不开。
      

  11.   

    个人觉得你得了解bmp文件格式将要创建的位图分为不同的小块,然后将小块的信息写入bmp文件,最后组装成大图。
      

  12.   


    在window server 2003 64bit下,可以分配这么大的内存。
    不知道CImage这个类,是否设置了最大值。
      

  13.   


    VB有这个能力,能给出VB的代码吗?
    GDI肯定是没有办法创建这么大的图像的
    也许你看到这个文件只是文件而已,我也可以创建一个比这更大的图像,但是创建了你用GDI却打不开。没说一定要用gdi实现。自己感觉GDI实现不了。vb生成的图片预览还是可以看到的。VB写的程序。是一个jpg的图片。生成内存在900M左右。不过是50 M递增。
    不过这个vb程序不是我写的。
    30000*30000的24bits图像已经2个多G,直接申请内存是不现实了。
    用内存映像文件吧。
    先填好BITMAPFILEHEADER写文件里面。
    再填好BITMAPINFOHEADER写进去。注意BITMAPINFOHEADER有一个biSizeImage不要超过4G,再大了就不要用这样的方法了。
    然后写29999*29999*3的空间放像素(行不被4整除是要调整一下)。
    然后将这个大文件一部分一部分地映射到内存里面处理。当然也可以先创建内存映像文件再写文件头和信息头。
    这样大小的图不算特别大,还是好处理的。13楼的方法和我想的一样。可是不知道代码该如何写。
      

  14.   

    回楼上,找个例子。研究下CreateFileMapping()和 MapViewOfFile()等相关函数。不是很难。