【问题标题】:Pixel RGB values are all 255 after converting from byte[]从 byte[] 转换后的像素 RGB 值都是 255
【发布时间】:2014-09-19 12:59:37
【问题描述】:

我有一个图像的byte[],它是直接从图像本身读取的,我正在尝试将此字节[] 转换为Bitmap 对象。

我正在使用代码:

var provider = new MultipartMemoryStreamProvider();
var multipart = Request.Content.ReadAsMultipartAsync(provider).ContinueWith(t => {
    foreach (var item in provider.Contents) {

        var filename = item.Headers.ContentDisposition.FileName.Trim('\"');
        var buffer = item.ReadAsByteArrayAsync();

        MemoryStream mss = new MemoryStream(buffer.Result);
        Bitmap bmpImage = (Bitmap)Image.FromStream(mss);

        //bmpImage.GetPixel(10,10) returns ARGB values of 255,255,255,255

    }
});

但是,当我调用bmpImage.GetPixel(10,10) 时,ARGB 值是255,255,255,255。这对我来说毫无意义。有谁知道为什么这种转换会导致我的像素信息丢失?

以上代码封装在ApiControllerPost()方法中:

public async Task<IHttpActionResult> Post()

【问题讨论】:

  • 来源是什么格式?
  • 你的缓冲区,是原始像素值吗? Image.FromStream 需要像 PNG 或 JPEG 等格式。
  • 我添加了代码的其余部分来显示它的来源。数据直接从 POSTed 图像中读取。我检查了十六进制编辑器中的值,byte[] 确实具有正确的图像字节值。但由于某种原因,它仍然无法正确转换。
  • 你不应该检查t.Result吗?我对这些类型没有经验,所以我可能错了,但这是我所期望的。
  • @Brett 我的意思不是provider.Contents。看起来依赖于类的可变性。至少,使用t.Result.Contents 不是更好的做法吗?同样,我不熟悉这些课程。但它确实看起来不像是常规的设计模式。

标签: c# bitmap


【解决方案1】:

替换:

var buffer = item.ReadAsByteArrayAsync();
MemoryStream mss = new MemoryStream(buffer.Result);
Bitmap bmpImage = (Bitmap)Image.FromStream(mss);

与:

Stream stream = item.ReadAsStreamAsync().Result;
Bitmap bmpImage = (Bitmap)Image.FromStream(stream);

成功了。我最初不明白为什么第二个有效而第一个无效,但ReadAsStreamAsync() 调用有效而ReadAsByteArrayAsync() 无效。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-04
    • 1970-01-01
    • 1970-01-01
    • 2015-07-11
    • 1970-01-01
    相关资源
    最近更新 更多