关于Graphics::DrawImage()函数使用的问题

yyfzy 2007-04-14 10:45:52
我使用Graphics::DrawImage(Image*, int desLeft, int desTop, int srcLeft, int srcTop, int srcWidth, int srcHeight, UnitPixel)的函数形式在一个1024*768的窗体上绘制一个1024*768的图片,可是图片只有一部分绘制出来了,还有一部分在窗体之外,并不是想象中的刚好把整个图片贴在窗体上,感觉Graphics认为我的窗体要比Image小很多。

如果是使用Graphics::DrawImage(Image*, int x, int y,int Width, int Height)
的函数形式效果是正确的,但是我现在需要使用前面的方式来将图片的某个区域绘制在制定的位置上。

请问使用第一种调用方式的时候要注意什么?怎么样才能得到正确的结果?
谢谢!
...全文
1851 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
beyonld 2009-10-30
  • 打赏
  • 举报
回复
学习
jyh_baoding 2009-10-30
  • 打赏
  • 举报
回复
帮顶
only_youch 2009-10-29
  • 打赏
  • 举报
回复
我今天正好用了这个函数的一种形式:
Graphics::DrawImage(Image*, int desLeft, int desTop, int srcLeft, int srcTop, int srcWidth, int srcHeight, UnitPixel)
这种形式与Status DrawImage( Image *image, const RectF &rect);一样,只是可以指定UNITPIXEL这个参数。类似的有好几个相似的接口。
Graphics::DrawImage(Image*, int x, int y,int Width, int Height)
这个是可以进行缩放的接口。我就就说了。

另外我认为更好用的一个是
Status DrawImage( Image *image,
const RectF &destRect,
REAL srcx,
REAL srcy,
REAL srcwidth,
REAL srcheight,
Unit srcUnit,
ImageAttributes *imageAttributes,
DrawImageAbort callback,
VOID *callbackData
);
这个也可以缩放,其它的各个参数也可以设置,我的用途是用来把一张图片用在scrollbar的滑块上进行拉伸,由于滑动是变长的,所以我把图片两端保持不变,中间进行拉伸,正好用这个接口解决问题!
yyfzy 2007-04-14
  • 打赏
  • 举报
回复
我是想实现把图片的某个区域画在指定的地方,但是我说的例子刚好是整个图片画到整个窗体上,但是并不是这样的效果。
mynamelj 2007-04-14
  • 打赏
  • 举报
回复
把你窗体的尺寸用TRACE输出看看是多少,然后输出image.GetWidth(), image.GetHeight()
的值,对比一下你就知道了原因
robin_yao 2007-04-14
  • 打赏
  • 举报
回复
你到底是想绘制整个图片到窗体上还是图片的一部分啊?
The following example draws a portion of an image. The portion of the source image to be drawn is scaled to fit the rectangle.

VOID Example_DrawImage15(HDC hdc)
{
Graphics graphics(hdc);

// Create an Image object.
Image image(L"climber.jpg");

// Draw the original source image.
graphics.DrawImage(&image, 10, 10);

// Set up the location for the image and the portion of the source to draw.
REAL x = 200.0f;
REAL y = 30.0f;
REAL srcx = 70.0f;
REAL srcy = 20.0f;
REAL srcwidth = 100.0f;
REAL srcheight = 200.0f;
Unit srcunit = UnitPixel;

// Draw the image.
graphics.DrawImage(&image, x, y, srcx, srcy, srcwidth, srcheight, srcunit);
}
yyfzy 2007-04-14
  • 打赏
  • 举报
回复
mynamelj(风之羽翼):
代码如下:因为我是测试,所以直接使用了具体数字。
CPaintDC dc(this); // device context for painting
Graphics graphics(dc.m_hDC);
graphics.DrawImage(&image, 0.0f, 0.0f, 0.0f, 0.0f, 1024.0f, 768.0f, UnitPixel);

我刚才发现一个问题,如果不知道目标区域的宽度和高度,就有问题,如果是制定了目标区域的宽度和高度以后,就是想要的效果,例如我用下面的调用方式,就能把图片中的某个区域画到指定的区域上:
RectF desRc(0, 0, 1024, 768);
graphics.DrawImage(&image, desRc, 0.0f, 0.0f, 1024.0f, 768.0f, UnitPixel, NULL, NULL, NULL);

感觉GDI+在没有指定目标区域大小的情况下,会自动放缩,但是并不是根据目标窗体DC大小来放缩的。
yyfzy 2007-04-14
  • 打赏
  • 举报
回复
可是我的图片大小和窗体大小是一样的,不需要放缩刚好能贴满窗体。
为什么不使这个效果呢?
mynamelj 2007-04-14
  • 打赏
  • 举报
回复
代码帖出来看看
菜牛 2007-04-14
  • 打赏
  • 举报
回复
看参数就明白,第一个调用不进行缩放。你可以先把图形缩放到另外一个图形上再绘制。
mynamelj 2007-04-14
  • 打赏
  • 举报
回复
srcLeft
srcTop
这两个参数就是指的相对图片,的起始位置,也就是从哪个位置开始画
srcWidth
srcHeight
这两个数就是指的,那一块的大小

你只需要设置好这几个参数就行了

16,472

社区成员

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

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

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