在.NET中“平铺”图像的最佳方法是什么?

时间:2008-10-17 16:00:44

标签: vb.net image-processing thumbnails

我需要为一堆jpegs(200,000+)生成thumbnails,但我想确保我的所有拇指都有相同的高度和宽度。但是,我不想更改图像的比例,因此我需要在较短的维度上添加空白区域以“将其平方”。空白区域的背景颜色是可变的。

这是我用来生成大拇指的代码片段。什么是做平方的最好方法?

     Dim imgDest As System.Drawing.Bitmap = New Bitmap(ScaleWidth, ScaleHeight)
     imgDest.SetResolution(TARGET_RESOLUTION, TARGET_RESOLUTION)  
     Dim grDest As Graphics = Graphics.FromImage(imgDest)

     grDest.DrawImage(SourceImage, 0, 0, imgDest.Width, imgDest.Height)

2 个答案:

答案 0 :(得分:4)

这个怎么样?也许你应该首先在Bitmap上绘制一个黑色(或任何颜色)矩形。

然后当您放置已调整大小的图像时,只需根据较短的尺寸计算图像的位置,然后将该尺寸移动差异的一半(并将另一个保持为0)。

那不行吗?

答案 1 :(得分:2)

Vaibhav 所说,首先用黑色绘制整个缩略图区域。这比首先将图像拟合到缩略图中然后确定要绘制黑色的矩形以实现pillarboxingletterboxing更简单。

用于将imageWidth x imageHeight图像拟合到thumbWidth x thumbHeight(不一定是正方形)区域的通用解法的伪代码:

imageRatio = imageWidth / imageHeight;
thumbRatio = thumbWidth / thumbHeight;

zoomFactor = imageRatio >= thumbRatio
    ? thumbWidth / imageWidth 
    : thumbHeight / imageHeight;

destWidth = imageWidth * zoomFactor;
destHeight = imageHeight * zoomFactor;

drawImage(
    (thumbWidth - destWidth) >> 1,
    (thumbHeight - destHeight) >> 1,
    destWidth,
    destHeight);