我正在使用来自http://kaioa.com/node/103的 renderToCanvas 函数:
var renderToCanvas = function (width, height, renderFunction) {
var buffer = document.createElement('canvas');
buffer.width = width;
buffer.height = height;
renderFunction(buffer.getContext('2d'));
return buffer;
};
它在标准 dpi 设备上运行良好,但是当我尝试在 hiDpi 显示器上使用我的 renderToCanvas 缓冲区时,它们显得模糊。
例如:
m_cachedGraphics = renderToCanvas( width, height, function (ctx)
{
ctx.fillStyle="rgba("+0+","+0+","+0+","+(1.0)+")";
ctx.font="14px Arial";
ctx.textAlign = 'center';
ctx.textBaseline = 'middle';
ctx.fillText( “Test1”, 100, 100 );
}
);
下面是我的 draw() 函数,我还设置了 hiDpi 显示:
var canvas = document.getElementById("canvas");
var ctx = canvas.getContext("2d");
if(window.devicePixelRatio == 2)
{
canvas.setAttribute('width', m_canvasWidth * 2);
canvas.setAttribute('height', m_canvasHeight * 2);
ctx.scale(2, 2);
}
ctx.drawImage( m_cachedGraphics, 0, 0 );
ctx.fillStyle="rgba("+0+","+0+","+0+","+(1.0)+")";
ctx.font="14px Arial";
ctx.textAlign = 'center';
ctx.textBaseline = 'middle';
ctx.fillText( “Test2”, 100, 200 );
在 hiDpi 显示器上,Test1 显得模糊,而 Test2 显得清晰。
我试图修改 renderToCanvas 以以 hiDpi 分辨率绘制缓存缓冲区(Test1),但无济于事。
任何人都可以帮忙吗?
谢谢。
解决方案:
下面的 GameAlchemist 有正确的答案。通过在调用 ctx.drawImage 之前调用 ctx.scale(0.5,0.5) 来缩放图像会使“Test1”看起来像“Test2”一样清晰。不过,这似乎只在绘制图像时才需要。我添加了以下帮助功能:
function DrawCachedImage( ctx, cachedImage, pixelRatio, x, y )
{
ctx.save();
{
ctx.scale( pixelRatio, pixelRatio );
ctx.drawImage( cachedImage, x, y );
}
ctx.restore();
}
现在我没有调用 ctx.drawImage 而是调用:
//ctx.drawImage( m_cachedBuildUI, 0, 0 );
DrawCachedImage( ctx, m_cachedBuildUI, 1/window.devicePixelRatio, 0, 0 );