是否可以重定义Bitmap类的图像大小?

klkvc386 2009-06-30 11:38:57
是否可以重定义Bitmap类的图像大小?
Bitmap *bitmap;
bitmap=new Bitmap(100,100 );

如何把bitmap的大小改成 200,200 或 50,50 或 1000,1000


不会是 bitmap=new Bitmap(100,100 );
delete bitmap;

bitmap=new Bitmap(200,200 );
delete bitmap;
...
...

我想让bitmap 只new 一次,不要重新new ,是否可以实现?
...全文
269 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
hnpdszgz 2009-07-30
  • 打赏
  • 举报
回复
前面的好像都不合楼主的意,看看这个吧。应该可以结贴了。

void ResizeBmp(Bitmap*& pBmp)
{
Bitmap* pTempBmp=new Bitmap(m_pBmp->GetWidth()+100,m_pBmp->GetHeight()+100);
Graphics* pTempG=Graphics::FromImage(pTempBmp);
pTempG->Clear(Color(255, 255,255, 255));
pTempG->DrawImage(m_pBmp,0,0);
delete m_pBmp;
delete m_pTempG;
m_pBmp=pTempBmp;
}
klkvc386 2009-07-02
  • 打赏
  • 举报
回复
呵呵,你确定?我一直这么画的啊,,,,xp vc6.0 vc2005

源图100*100
新建空图 200*200
把源图画到新图上(0,0,200,200)

怎么会不变大呢?


那你源图还是100*100,不是吗?

你画是用的是新建的,不是原来的.

rebecca_zjy 2009-07-02
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 klkvc386 的回复:]

不知道各位是不是理解为,我要实现缩放图片并显示了呢?
我的意思不是缩放图片;
而是把bitmap的size 扩大,用来存更大的图, 比如,原来有一个数组是 int a[20] 而现在我要把他改成 int a[100]

[/Quote]

我给你的却是是缩放原图的函数,不好意思
如果你是要存不同的图,那为什么要改原图的大小呢?两个图存成两个就可以了吧,最多把前面不用的小图先delete掉就好了啊,我觉得多new一次反而比较简单呢
bitmap格式的文件头还是有点复杂的,这样直接改很容易出问题,我试过的
百事烟 2009-07-02
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 klkvc386 的回复:]
呵呵,你确定?我一直这么画的啊,,,,xp vc6.0 vc2005

源图100*100
新建空图 200*200
把源图画到新图上(0,0,200,200)

怎么会不变大呢?


那你源图还是100*100,不是吗?

你画是用的是新建的,不是原来的.
[/Quote]

我看错题目了,
源图放大在Bitmap状态基本是不可能的,在形成Bitmap之前是可以的
不论从文件中来,还是从采集卡来
都得改变信息头和数据(文件还要改变文件头),只有调色板不用改
信息头文件头都好改,但数据是1维BYTE数组,要改变其长度和每个成员的值,改起来很累的,
不如另建1个方便啊





rebecca_zjy 2009-07-02
  • 打赏
  • 举报
回复
bm.bmWidth,bm.bmHeight
这两个参数是源图像的长宽
rebecca_zjy 2009-07-02
  • 打赏
  • 举报
回复
m_bmp->CreateCompatibleBitmap(&dcMem,m_imageW,m_imageH);// DC大小和要显示的图片大小要一致
DcTemp.StretchBlt(0,0,m_imageW,m_imageH,&dcMem,0,0,bm.bmWidth,bm.bmHeight,SRCCOPY);

——————————————————————————————————————————————————————
忘了说明了
这两句里的参数m_imageW,m_imageH就是你修改以后的图像长宽,以像素为单位
我是有很多地方要用这个数值,所以就作为类成员了,可以直接作为参数的
qingfeng5211 2009-07-02
  • 打赏
  • 举报
回复

CBitmap bmp;
bmp.LoadBitmap(IDB_BITMAP1);
BITMAP bMap;
bmp.GetBitmap(&bMap);
bMap.bmWidth = 200;
bMap.bmHeight = 200;
bmp.Detach();
bmp.CreateBitmapIndirect(&bMap);


这样可行吗?不过这不是缩放
klkvc386 2009-07-02
  • 打赏
  • 举报
回复
好的,谢谢大家,就这样吧!
结帖
klkvc386 2009-07-01
  • 打赏
  • 举报
回复
void ResizeBitmap(Bitmap **bmpInput, int newWidth, int newHeight)
{
Bitmap *bmpTemp=(*bmpInput)->Clone(0, 0, newWidth, newHeight, PixelFormat32bppRGB);
delete *bmpInput;
*bmpInput = bmpTemp;
}

找到了这个方法,但是我使用了不行,不知道什么原因,
原来的 100,100
ResizeBitmap( x , 200,200)
Error


ResizeBitmap( x ,50,50)
什么都不显示
klkvc386 2009-07-01
  • 打赏
  • 举报
回复
up
百事烟 2009-07-01
  • 打赏
  • 举报
回复
	int nWidth = 100;	//源图宽
int nHeight = 100; //源图高
Bitmap bmpSrc(nWidth, nHeight, PixelFormat24bppRGB/*24位图*/); //vc用gdi+最好不要用new
//在bmpSrc画东西.......
Bitmap bmpDst(nWidth * 2, nHeight * 2, PixelFormat24bppRGB);
Graphics *pGDIbmpDst = Graphics::FromImage(&bmpDst);
pGDIbmpDst->DrawImage(&bmpSrc,0,0, nWidth * 2, nHeight * 2); // 指定宽和高
delete pGDIbmpDst;
klkvc386 2009-07-01
  • 打赏
  • 举报
回复
改大小以后什么都不显示,也可能是变量生存周期的问题,在用之前就析构了
把它当做类成员变量比较好,类初始化的时候new,类析构的时候delete


我是把Bitmap *bitmap定义为类成员了啊,并且类初始化的时候new,类析构的时候delete

但是,类初始化的时候new (200,200)

但是在使用过程中,我可能要用到, (500,500);的大小啊?
问题就是,怎么实现 (200,200 ) -> (500,500)
klkvc386 2009-07-01
  • 打赏
  • 举报
回复
我自己封装的一个函数,拿去试试吧
类成员变量,当参数也可以:CBitamp *m_bmp;

void ResizeBmp()
...
...

没看明白你的代码,你的代码哪里改了bitmap的大小?
CBitamp *m_bmp; 可以改成 Bitmap *m_bmp吗?



不知道各位是不是理解为,我要实现缩放图片并显示了呢?
我的意思不是缩放图片;
而是把bitmap的size 扩大,用来存更大的图, 比如,原来有一个数组是 int a[20] 而现在我要把他改成 int a[100]


rebecca_zjy 2009-07-01
  • 打赏
  • 举报
回复
改大小以后什么都不显示,也可能是变量生存周期的问题,在用之前就析构了
把它当做类成员变量比较好,类初始化的时候new,类析构的时候delete
rebecca_zjy 2009-07-01
  • 打赏
  • 举报
回复
我自己封装的一个函数,拿去试试吧
类成员变量,当参数也可以:CBitamp *m_bmp;
void ResizeBmp()
{
BITMAP bm;
m_bmp->GetObject(sizeof(bm),&bm);

CDC *pDC = GetDC();
CDC dcMem;//源DC
dcMem.CreateCompatibleDC(pDC);
dcMem.SelectObject(m_bmp);

m_bmp->DeleteObject();
m_bmp->CreateCompatibleBitmap(&dcMem,m_imageW,m_imageH);// DC大小和要显示的图片大小要一致
CDC DcTemp;//目标DC
DcTemp.CreateCompatibleDC(pDC);
DcTemp.SelectObject(m_bmp);

BITMAP hbitmap;
m_bmp->GetBitmap(&hbitmap);
DcTemp.SetStretchBltMode(COLORONCOLOR);
DcTemp.StretchBlt(0,0,m_imageW,m_imageH,&dcMem,0,0,bm.bmWidth,bm.bmHeight,SRCCOPY);

DcTemp.DeleteDC();
dcMem.DeleteDC();
}
Kudeet 2009-07-01
  • 打赏
  • 举报
回复
你用的是GDI+的方法吧,应该是有Resize放缩图像功能的。
刚刚凉 2009-07-01
  • 打赏
  • 举报
回复
用两个CImage 对象,一个通过load存放你的位图对象,然后调用这个CImage 对象成员函数BitBlt或StretchBlt来对你的位图进行放大或缩小存放到另一个位图对象中:
CImage img1,imag2;
img1.Load("c:\\b.bmp");
img2.create(...);
HDC hdcdes = img2.GetDC();
img1.StretchBlt(hdcdes,xDest,yDest,nDestWidth,nDestHeight);

img1.ReleaseDC();
img2.ReleaseDC();

以上就是个大体意思,我没调试过,你再改改,然后封装成一个函数,就是对位图进行重定义大小的函数,可能有别的更简单的方法
bulijun1987 2009-07-01
  • 打赏
  • 举报
回复
是不是可以修改BITMAP的内容
百事烟 2009-07-01
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 klkvc386 的回复:]
用这个画的图,还是和原来的一样大小,没有改变! [/Quote]
呵呵,你确定?我一直这么画的啊,,,,xp vc6.0 vc2005

源图100*100
新建空图 200*200
把源图画到新图上(0,0,200,200)

怎么会不变大呢?
dengxuxing 2009-07-01
  • 打赏
  • 举报
回复
你这样不行吗?
Bitmap *bitmap;
bitmap=new Bitmap();

你想在画的东西之后DC出来就是了。
加载更多回复(3)

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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