F#从抛出异常的内存流中创建位图

时间:2017-04-26 16:30:22

标签: bitmap f#

我正在

System.ArgumentException: 'Parameter is not valid.' 

出于某种原因。

我得到它的一行:

let image = Bitmap.FromStream stream

这就是我所拥有的

let ChangeBitmapColors (bitmap : Bitmap) =
Console.WriteLine bitmap.Size

let width = bitmap.Width
let height = bitmap.Height

let rectangle = new Rectangle(0, 0, width, height)

let bitmapData = bitmap.LockBits(rectangle, Imaging.ImageLockMode.ReadOnly, bitmap.PixelFormat)
let length = bitmapData.Stride * height
let bitmapArray : byte[] = Array.zeroCreate length

Marshal.Copy(bitmapData.Scan0, bitmapArray, 0, length)

bitmap.UnlockBits bitmapData

//todo something with bitmapArray

use stream = new MemoryStream(bitmapArray)                                           

let image = Bitmap.FromStream stream

stream.Dispose |> ignore

image

任何想法我在这里做错了什么?提前谢谢。

1 个答案:

答案 0 :(得分:3)

我不知道为什么你的代码不能正常工作(我测试了它并得到了相同的结果)。

另一个选项(对我有用)它使用Marshal.UnsafeAddrOfPinnedArrayElement

let image = new Bitmap(width, height, bitmapData.Stride, bitmap.PixelFormat,Marshal.UnsafeAddrOfPinnedArrayElement(bi‌​tmapArray, 0))

修改

感谢@ildjarn的解释:

  

该流无法正常工作,因为它只是没有任何原始像素数据   图像标题,所以没有办法知道像图像这样的简单事物   尺寸和调色板类型。流方法是可能的,但你   需要将图像标题保存到流中,而不仅仅是   扫描线