以编程方式将填充添加到位图

时间:2016-05-19 08:34:45

标签: c# image bitmap

看来,如果用于Windows快捷方式图标的图像没有1:1的宽高比,它看起来会很拉伸。

enter image description here

左边一个是实际看起来的样子,右边一个是看起来的样子。

我正在从图像中以编程方式创建快捷方式和图标,因此我想修复图像,因此它将具有正确的宽高比,但图像看起来不会拉伸。这可以通过向图像添加一些填充来实现。

就目前而言,我只是将图像复制到具有正确宽高比的新位图,但用透明像素填充新区域

public static Bitmap FixBitmapAspectRatio(Bitmap sourceBitmap)
{
    if (sourceBitmap.Width.Equals(sourceBitmap.Height))
        return sourceBitmap;

    int size;
    bool horizontallyOriented;
    if (sourceBitmap.Width > sourceBitmap.Height)
    {
        horizontallyOriented = true;
        size = sourceBitmap.Width;
    }
    else
    {
        horizontallyOriented = false;
        size = sourceBitmap.Height;
    }

    var sizeDifference = Math.Abs(sourceBitmap.Width - sourceBitmap.Height);

    var newBitmap = new Bitmap(size, size);

    var transparentColor = Color.FromArgb(0, 0, 0, 0);

    for (int i = 0; i < size; i++)
    {
        for (int j = 0; j < size; j++)
        {
            if (horizontallyOriented)
            {
                if (i < sizeDifference / 2 || i >= sizeDifference / 2 + sourceBitmap.Height)
                {
                    newBitmap.SetPixel(j, i, transparentColor);
                }
                else
                {
                    var originalPixel = sourceBitmap.GetPixel(j, i - sizeDifference / 2);
                    newBitmap.SetPixel(j, i, originalPixel);
                }
            }
            else
            {
                if (i < sizeDifference / 2 || i >= sizeDifference / 2 + sourceBitmap.Width)
                {
                    newBitmap.SetPixel(i, j, transparentColor);
                }
                else
                {
                    var originalPixel = sourceBitmap.GetPixel(i - sizeDifference / 2, j);
                    newBitmap.SetPixel(i, j, originalPixel);
                }
            }
        }
    }

    return newBitmap;
}

但我不知道,如果我发明了一个轮子。有没有办法通过标准库来实现这一目标,或者更简单的方法来实现我的需求?

1 个答案:

答案 0 :(得分:1)

你真的不想设置单个像素:)

相反,请查看Graphics课程,特别是Graphics.FromImage(您在哪里绘画)和Graphics.DrawImage(这是您的绘画方式)缩放图像)。