gpt4 book ai didi

c# - Lockbits 跨越 1bpp 索引图像字节边界

转载 作者:可可西里 更新时间:2023-11-01 11:21:08 31 4
gpt4 key购买 nike

我正在从一张 1bpp 索引图像剪切并粘贴到一张新图像。

一切正常,直到起始像素是 8 的除数。在下面的代码中,步幅等于相对于矩形宽度的值,直到我达到字节边界。那么步幅等于整个页面的宽度。

var croppedRect = new Rectangle((int)left, (int)top, (int)width, (int)height);
BitmapData croppedSource = _bitmapImage.LockBits(croppedRect, ImageLockMode.ReadWrite, BitmapImage.PixelFormat);
int stride = croppedSource.Stride;

这是一个问题,因为 Marshal 没有将我选择的区域粘贴到新图像中,而是复制了整个页面宽度的横截面,即所选区域的高度。

int numBytes = stride * (int)height;
var srcData = new byte[numBytes];

Marshal.Copy(croppedSource.Scan0, srcData, 0, numBytes);
Marshal.Copy(srcData, 0, croppedDest.Scan0, numBytes);
destBmp.UnlockBits(croppedDest);

最佳答案

这是我的代码,供有兴趣的人使用。可能有更优化的解决方案,但这可行。我正在创建一个白色的整个页面,并在我经过它时复制新页面中的选定区域。感谢 Bob Powell 的 SetIndexedPixel 例程。

protected int GetIndexedPixel(int x, int y, BitmapData bmd)
{
var index = y * bmd.Stride + (x >> 3);
var p = Marshal.ReadByte(bmd.Scan0, index);
var mask = (byte)(0x80 >> (x & 0x7));
return p &= mask;
}

protected void SetIndexedPixel(int x, int y, BitmapData bmd, bool pixel)
{
int index = y * bmd.Stride + (x >> 3);
byte p = Marshal.ReadByte(bmd.Scan0, index);
byte mask = (byte)(0x80 >> (x & 0x7));
if (pixel)
p &= (byte)(mask ^ 0xff);
else
p |= mask;
Marshal.WriteByte(bmd.Scan0, index, p);
}

public DocAppImage CutToNew(int left, int top, int width, int height, int pageWidth, int pageHeight)
{
var destBmp = new Bitmap(pageWidth, pageHeight, BitmapImage.PixelFormat);
var pageRect = new Rectangle(0, 0, pageWidth, pageHeight);

var pageData = destBmp.LockBits(pageRect, ImageLockMode.WriteOnly, BitmapImage.PixelFormat);
var croppedRect = new Rectangle(left, top, width, height);
var croppedSource = BitmapImage.LockBits(croppedRect, ImageLockMode.ReadWrite, BitmapImage.PixelFormat);

for (var y = 0; y < pageHeight; y++)
for (var x = 0; x < pageWidth; x++)
{
if (y >= top && y <= top + height && x >= left && x <= width + left)
{
SetIndexedPixel(x, y, pageData,
GetIndexedPixel(x - left, y - top, croppedSource) == 0 ? true : false);
SetIndexedPixel(x - left, y - top, croppedSource, false); //Blank area in original
}
else
SetIndexedPixel(x, y, pageData, false); //Fill the remainder of the page with white.
}

destBmp.UnlockBits(pageData);

var retVal = new DocAppImage { BitmapImage = destBmp };
destBmp.Dispose();

BitmapImage.UnlockBits(croppedSource);
SaveBitmapToFileImage(BitmapImage);

return retVal;
}

关于c# - Lockbits 跨越 1bpp 索引图像字节边界,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10045238/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com