背景:
我正在使用一个外部(非托管)API,它将为我渲染图像并将图像的内存位置(以及步幅等)传回。此 API 尚未完全开发,因此我暂时尝试模拟该行为。
任务:
我正在尝试从在非托管代码中创建的图像的一部分创建图像。例如,我想创建一个仅包含图像右半部分的 BitmapSource。
为了模拟这一点,我在内存中创建了一个图像:
Bitmap logo = Properties.Resources.test2;
BitmapData bmpData =
logo.LockBits(new System.Drawing.Rectangle(0, 0, 970, 844), System.Drawing.Imaging.ImageLockMode.ReadWrite, logo.PixelFormat);
现在我可以得到内存中图像的起点
IntPtr startOfImage = bmpData.Scan0;
为了获得图像的右侧,我没有成功尝试(假设图像尺寸为 970*844 且 Pixelformat 为 24bit RGB):
IntPtr locationOfImage = bmpData.Scan0 += bmpData.Stride / 2 ;
BitmapSource source = BitmapImage.Create(485, 844, 96, 96, System.Windows.Media.PixelFormats.Rgb24, null, locationOfImage, 844 * bmpData.Stride / 2, bmpData.Stride / 2);
但是,这不可能是给我图像的右手边,我错过了什么?
最好的祝福
丹尼尔
编辑:
很明显,这并没有返回图像的右侧,因为仅在第一行我跳过了一半的步幅。是否有可能在总是跳过部分字节的同时创建图像(例如,每行都有一个跳过值,跳过部分行)?
显然,我也可以首先将所有必要的字节读入一个数组并传递它而不是 IntPtr,但是能够直接传递该位置会很好。