Gdiplus的坑:通过DrawImage进行放大不是很靠谱

由于DrawImage指定destRect和srcRect绘制后,会自动把原图放大到destRect的大小,实现了放大效果,这是很通常的做法;

但如果要求放大得很精确的时候,比如需要将原图放大到destRect后再平铺到整个窗口,这里面其实有个很严重的问题;

比如运行一下如下代码:

            if (g_pSrcImage != NULL)
            {
                Graphics graphics(hDC);
                Rect zoomRect(0, 0, g_pSrcImage->GetWidth() * 7, g_pSrcImage->GetHeight() * 7);
                Bitmap* pImageScale = new Bitmap(zoomRect.Width, zoomRect.Height);
                if (pImageScale != NULL)
                {
                    Graphics graphicsScale(pImageScale);
                    graphicsScale.Clear(Color(0, 255, 0)); //填充绿色
                    graphicsScale.DrawImage(g_pSrcImage, zoomRect, 0, 0, g_pSrcImage->GetWidth(), g_pSrcImage->GetHeight(), UnitPixel);

                    graphics.DrawImage(pImageScale, 0, 0, zoomRect.X, zoomRect.Y, zoomRect.Width, zoomRect.Height, UnitPixel);
                    delete pImageScale;
                    pImageScale = NULL;
                }
            }
这是一个典型的通过DrawImage等比放大的代码,但实际结果是zoomRect并没有被充满,右边和下边都多出了几个像素预填充的绿色;

再拿这张放大后的图去平铺那就大悲剧了,好多绿色分割线……


解决办法是先使用ScaleTransform设置放大比例,再用FillRectangle把原图填充到zoomRect,代码如下:

            if (g_pSrcImage != NULL)
            {
                Graphics graphics(hDC);
                Rect zoomRect(0, 0, g_pSrcImage->GetWidth() * 7, g_pSrcImage->GetHeight() * 7);
                Bitmap* pImageScale = new Bitmap(zoomRect.Width, zoomRect.Height);
                if (pImageScale != NULL)
                {
                    Graphics graphicsScale(pImageScale);
                    graphicsScale.Clear(Color(0, 255, 0)); //填充绿色
                    // 方法一:正确方法
                    TextureBrush brush(g_pSrcImage);
                    graphicsScale.ScaleTransform((REAL)((REAL)zoomRect.Width / (REAL)g_pSrcImage->GetWidth()),
                        (REAL)((REAL)zoomRect.Height / (REAL)g_pSrcImage->GetHeight()));
                    graphicsScale.FillRectangle(&brush, zoomRect);

                    // 方法二:右边和下边会有几个像素预填充的绿色
                    //graphicsScale.DrawImage(g_pSrcImage, zoomRect, 0, 0, g_pSrcImage->GetWidth(), g_pSrcImage->GetHeight(), UnitPixel);

                    graphics.DrawImage(pImageScale, 0, 0, zoomRect.X, zoomRect.Y, zoomRect.Width, zoomRect.Height, UnitPixel);
                    delete pImageScale;
                    pImageScale = NULL;
                }
            }



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值