0

背景:

我正在使用一个外部(非托管)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,但是能够直接传递该位置会很好。

4

0 回答 0