1

我正在尝试使用 1Bpp PixelIndex 旋转位图,但我发现它有问题。当您尝试进行一些旋转时,图像左侧会出现一条黑线。做了一些研究,我发现这是一个错误,但可能不会被修复。

我尝试了另一种旋转位图的方法(我包含了代码):

Bitmap returnBitmap = new Bitmap(lBitmap.Width, lBitmap.Height);
                Graphics g = Graphics.FromImage(returnBitmap);
g.TranslateTransform((float)lBitmap.Width / 2, (float)lBitmap.Height / 2);
                        g.RotateTransform(180);
                        g.TranslateTransform(-(float)lBitmap.Width / 2, -(float)lBitmap.Height / 2);
                        g.DrawImage(lBitmap, new Point(0, 0));
                        mIsRotated = true;

但我的问题是图像在旋转 180º 时会失去清晰度。

有没有其他的旋转方式?

如果我不够清楚,我很抱歉。

4

2 回答 2

1

如果有人在这里遇到同样的问题,我找到了解决方案。我无法使用 Bitmap.RotateFlip,因为它生成了一条黑线,所以我尝试使用上面的代码。使用 180º 我的图像失去了一些清晰度,但使用 -180º 解决了这个问题。

于 2012-11-22T12:52:25.333 回答
0

我在从图标和光标中提取单色位图时遇到了这个问题。

翻转不是旋转。这会更好:

Bitmap returnBitmap = new Bitmap(lBitmap.Width, lBitmap.Height);
Graphics g = Graphics.FromImage(returnBitmap);
g.TranslateTransform((float)lBitmap.Width / 2, (float)lBitmap.Height / 2);
// Mirror instead of rotate
g.ScaleTransform(1,-1);
g.TranslateTransform(-(float)lBitmap.Width / 2, -(float)lBitmap.Height / 2);
g.DrawImage(lBitmap, new Point(0, 0));
mIsRotated = true;

但是生成的位图不会是 1bpp

此函数利用行是 32 位对齐的事实来就地翻转单色位图:

/// <summary>
/// Vertically flips a monochrome bitmap in-place
/// </summary>
/// <param name="bmp">Monochrome bitmap to flip</param>
public static void RotateNoneFlipYMono(Bitmap bmp)
{
    if (bmp == null || bmp.PixelFormat != PixelFormat.Format1bppIndexed)
        throw new InvalidValueException();

    var height = bmp.Height;
    var width = bmp.Width;
    // width in dwords
    var stride = (width + 31) >> 5;
    // total image size
    var size = stride * height;
    // alloc storage for pixels
    var bytes = new int[size];

    // get image pixels
    var rect = new Rectangle(Point.Empty, bmp.Size);            
    var bd = bmp.LockBits(rect, ImageLockMode.WriteOnly, PixelFormat.Format1bppIndexed);            
    Marshal.Copy(bd.Scan0, bytes, 0, size);

    // flip by swapping dwords
    int halfSize = size >> 1;
    for (int y1 = 0, y2 = size - stride; y1 < halfSize; y1 += stride, y2 -= stride)
    {
        int end = y1 + stride;
        for (int x1 = y1, x2 = y2; x1 < end; x1++, x2++)
        {
            bytes[x1] ^= bytes[x2];
            bytes[x2] ^= bytes[x1];
            bytes[x1] ^= bytes[x2];
        }
    }

    // copy pixels back
    Marshal.Copy(bytes, 0, bd.Scan0, size);
    bmp.UnlockBits(bd);
}
于 2018-07-10T22:52:22.247 回答