如何将位图拉伸显示,急

时间:2021-09-30 23:35:34
我现在加了一个pictrue控件,想想在程序运行的期间动态调入图象在其中显示。但是总不能把图片拉伸,显示在控件里。
    我把控件的属性的Center Image选中了,各位高手帮我解决

13 个解决方案

#1


CDC* temp=GetDC();

    CDC* dc=GetDC();

    CDC mydc;
CBitmap bit;
bit.LoadBitmap("d:\\1.bmp");
mydc.CreateCompatibleDC(temp);
mydc.SelectObject(&bit);
dc->StretchBlt(1,1,400,400,temp,1,1,726,886,SRCCOPY);

上边是代码,但是我搞不清楚为什么调不进这个bmp图,
dc->StretchBlt(1,1,400,400,temp,1,1,726,886,SRCCOPY);这一句绘制的总是屏幕上显示的内容,不知道错在哪里了。
    大家帮帮忙,急啊!

#2


CDC* temp=GetDC();

    CDC* dc=GetDC();

    CDC mydc;
CBitmap bit;
bit.LoadBitmap("d:\\1.bmp");
mydc.CreateCompatibleDC(temp);
mydc.SelectObject(&bit);
dc->StretchBlt(1,1,400,400,temp,1,1,726,886,SRCCOPY);

上边是代码,但是我搞不清楚为什么调不进这个bmp图,
dc->StretchBlt(1,1,400,400,temp,1,1,726,886,SRCCOPY);这一句绘制的总是屏幕上显示的内容,不知道错在哪里了。
    大家帮帮忙,急啊!

#3


CDC* temp=GetDC();

    CDC* dc=GetDC();

    CDC mydc;
CBitmap bit;
bit.LoadBitmap("d:\\1.bmp");
mydc.CreateCompatibleDC(temp);
mydc.SelectObject(&bit);
dc->StretchBlt(1,1,400,400,temp,1,1,726,886,SRCCOPY);

上边是代码,但是我搞不清楚为什么调不进这个bmp图,
dc->StretchBlt(1,1,400,400,temp,1,1,726,886,SRCCOPY);这一句绘制的总是屏幕上显示的内容,不知道错在哪里了。
    大家帮帮忙,急啊!

#4


用gdiplus 很好用的。

HDC hdc=::GetDC(m_hWnd);
Graphics graphics(hdc);

LPCTSTR filename1=filename.GetBuffer(filename.GetLength());
WCHAR filename2[512];
MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, (LPCTSTR)filename1, -1,filename2 , 512);
Image tmpImage(filename2);

graphics.DrawImage(&tmpImage, destRect);//你可以任意設置destRect。


#5


你获取的设备上下文有问题
并且最好把图片作为资源来载入

#6


用GDIPlus:

HDC hdc=::GetDC(m_hWnd);
Graphics graphics(hdc);

Image tmpImage(L"filename");

graphics.DrawImage(&tmpImage, destRect);
很好用的。

#7


位图的调入没那么简单吧,除非你现在资源中加入位图,如果像读文件那样调入,我用了一个类(CDib),很多位图处理都用它,其中的读文件函数是

BOOL CDib::Read(CFile* pFile)
{
// 1. read file header to get size of info hdr + color table
// 2. read info hdr (to get image size) and color table
// 3. read image
// can't use bfSize in file header

// 清除DIB
Empty();

int nCount, nSize;
BITMAPFILEHEADER bmfh;

// 尝试读取BMP文件
try
{
// 读BMP文件头
nCount = pFile->Read((LPVOID) &bmfh, sizeof(BITMAPFILEHEADER));

// 判断读取文件头的大小是否
if(nCount != sizeof(BITMAPFILEHEADER))
{
// 读文件出错
throw new CException;
}

// 判断是否是"BM"
if(bmfh.bfType != 0x4d42)
{
// 不是BMP文件,抛出异常
throw new CException;
}
nSize = bmfh.bfOffBits - sizeof(BITMAPFILEHEADER);
m_lpBMIH = (LPBITMAPINFOHEADER) new char[nSize];
m_nBmihAlloc = m_nImageAlloc = crtAlloc;
nCount = pFile->Read(m_lpBMIH, nSize); // info hdr & color table
ComputeMetrics();
ComputePaletteSize(m_lpBMIH->biBitCount);
MakePalette();
m_lpImage = (LPBYTE) new char[m_dwSizeImage];//此处读出位图数据
nCount = pFile->Read(m_lpImage, m_dwSizeImage); // image only
}
catch(CException* pe)
{
AfxMessageBox("Read error");
pe->Delete();
return FALSE;
}
return TRUE;
}

然后在自己程序的view 中:
void CDemo_ViewDibView::OnFileOpen() 
{
// TODO: Add your command handler code here
CFileDialog dlg(TRUE,"bmp","*.bmp");
if(dlg.DoModal ()!=IDOK)
return ;

CFile file;
file.Open (dlg.GetPathName (),CFile::modeRead);
if (m_DibObject.Read (&file)==TRUE)//m_DibObject 是我在view 中定义的指向CDib的成员变量
{

Invalidate();
}


至于拉伸显示你的函数是对的!
我也是搞图像的,有空联系;frankcai2002@sina.com.cn

#8


'Graphics' : undeclared identifier

呵呵,如何声明?谢谢

#9


#include "gdiplus.h"
using namespace Gdiplus;

#10


你可能需要安裝 Gdiplus.
絕對是值得的,處理圖像非常方便。

#11


不用LoadBitMap,用LoadImage。就可以拉伸位图。

#12


感谢各位的帮忙,我已经解决,还是我原来的方法,
frankcai_2001(Frank) 说的很对,这样调入图象要求作为资源文件,但是可以在程序运行的过程中动态改变对应的文件,所以还是可以实现。

   再次感谢各位的帮忙。

#13


dc->SetStretchBltMode(COLORONCOLOR);
而且用上面的语句可以使拉伸后的图像显示效果比较好

#1


CDC* temp=GetDC();

    CDC* dc=GetDC();

    CDC mydc;
CBitmap bit;
bit.LoadBitmap("d:\\1.bmp");
mydc.CreateCompatibleDC(temp);
mydc.SelectObject(&bit);
dc->StretchBlt(1,1,400,400,temp,1,1,726,886,SRCCOPY);

上边是代码,但是我搞不清楚为什么调不进这个bmp图,
dc->StretchBlt(1,1,400,400,temp,1,1,726,886,SRCCOPY);这一句绘制的总是屏幕上显示的内容,不知道错在哪里了。
    大家帮帮忙,急啊!

#2


CDC* temp=GetDC();

    CDC* dc=GetDC();

    CDC mydc;
CBitmap bit;
bit.LoadBitmap("d:\\1.bmp");
mydc.CreateCompatibleDC(temp);
mydc.SelectObject(&bit);
dc->StretchBlt(1,1,400,400,temp,1,1,726,886,SRCCOPY);

上边是代码,但是我搞不清楚为什么调不进这个bmp图,
dc->StretchBlt(1,1,400,400,temp,1,1,726,886,SRCCOPY);这一句绘制的总是屏幕上显示的内容,不知道错在哪里了。
    大家帮帮忙,急啊!

#3


CDC* temp=GetDC();

    CDC* dc=GetDC();

    CDC mydc;
CBitmap bit;
bit.LoadBitmap("d:\\1.bmp");
mydc.CreateCompatibleDC(temp);
mydc.SelectObject(&bit);
dc->StretchBlt(1,1,400,400,temp,1,1,726,886,SRCCOPY);

上边是代码,但是我搞不清楚为什么调不进这个bmp图,
dc->StretchBlt(1,1,400,400,temp,1,1,726,886,SRCCOPY);这一句绘制的总是屏幕上显示的内容,不知道错在哪里了。
    大家帮帮忙,急啊!

#4


用gdiplus 很好用的。

HDC hdc=::GetDC(m_hWnd);
Graphics graphics(hdc);

LPCTSTR filename1=filename.GetBuffer(filename.GetLength());
WCHAR filename2[512];
MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, (LPCTSTR)filename1, -1,filename2 , 512);
Image tmpImage(filename2);

graphics.DrawImage(&tmpImage, destRect);//你可以任意設置destRect。


#5


你获取的设备上下文有问题
并且最好把图片作为资源来载入

#6


用GDIPlus:

HDC hdc=::GetDC(m_hWnd);
Graphics graphics(hdc);

Image tmpImage(L"filename");

graphics.DrawImage(&tmpImage, destRect);
很好用的。

#7


位图的调入没那么简单吧,除非你现在资源中加入位图,如果像读文件那样调入,我用了一个类(CDib),很多位图处理都用它,其中的读文件函数是

BOOL CDib::Read(CFile* pFile)
{
// 1. read file header to get size of info hdr + color table
// 2. read info hdr (to get image size) and color table
// 3. read image
// can't use bfSize in file header

// 清除DIB
Empty();

int nCount, nSize;
BITMAPFILEHEADER bmfh;

// 尝试读取BMP文件
try
{
// 读BMP文件头
nCount = pFile->Read((LPVOID) &bmfh, sizeof(BITMAPFILEHEADER));

// 判断读取文件头的大小是否
if(nCount != sizeof(BITMAPFILEHEADER))
{
// 读文件出错
throw new CException;
}

// 判断是否是"BM"
if(bmfh.bfType != 0x4d42)
{
// 不是BMP文件,抛出异常
throw new CException;
}
nSize = bmfh.bfOffBits - sizeof(BITMAPFILEHEADER);
m_lpBMIH = (LPBITMAPINFOHEADER) new char[nSize];
m_nBmihAlloc = m_nImageAlloc = crtAlloc;
nCount = pFile->Read(m_lpBMIH, nSize); // info hdr & color table
ComputeMetrics();
ComputePaletteSize(m_lpBMIH->biBitCount);
MakePalette();
m_lpImage = (LPBYTE) new char[m_dwSizeImage];//此处读出位图数据
nCount = pFile->Read(m_lpImage, m_dwSizeImage); // image only
}
catch(CException* pe)
{
AfxMessageBox("Read error");
pe->Delete();
return FALSE;
}
return TRUE;
}

然后在自己程序的view 中:
void CDemo_ViewDibView::OnFileOpen() 
{
// TODO: Add your command handler code here
CFileDialog dlg(TRUE,"bmp","*.bmp");
if(dlg.DoModal ()!=IDOK)
return ;

CFile file;
file.Open (dlg.GetPathName (),CFile::modeRead);
if (m_DibObject.Read (&file)==TRUE)//m_DibObject 是我在view 中定义的指向CDib的成员变量
{

Invalidate();
}


至于拉伸显示你的函数是对的!
我也是搞图像的,有空联系;frankcai2002@sina.com.cn

#8


'Graphics' : undeclared identifier

呵呵,如何声明?谢谢

#9


#include "gdiplus.h"
using namespace Gdiplus;

#10


你可能需要安裝 Gdiplus.
絕對是值得的,處理圖像非常方便。

#11


不用LoadBitMap,用LoadImage。就可以拉伸位图。

#12


感谢各位的帮忙,我已经解决,还是我原来的方法,
frankcai_2001(Frank) 说的很对,这样调入图象要求作为资源文件,但是可以在程序运行的过程中动态改变对应的文件,所以还是可以实现。

   再次感谢各位的帮忙。

#13


dc->SetStretchBltMode(COLORONCOLOR);
而且用上面的语句可以使拉伸后的图像显示效果比较好