如何将图像文件读取为byte[]?

5
这是我保存图片的方法。
[HttpPost]
public ActionResult Create(HttpPostedFileBase file)
{
    if (file != null)
    {
        var extension = Path.GetExtension(file.FileName);
        var fileName = Guid.NewGuid().ToString() + extension;
        var path = Path.Combine(Server.MapPath("~/Content/Photos"), fileName);
        file.SaveAs(path);

        //...
    }
}

我不想从那个位置显示图片。相反,我想先读取它以进行进一步处理。

在这种情况下,我该如何读取图像文件?


1
你能更具体地说明你期望的格式是什么吗?例如流式传输还是其他什么格式? - Chris Shain
这里没有问题。问题以问号(?)结尾。 - abelenky
@abelenky:我添加了一个问题。 - Richard77
仍然不太清楚,因为“read”有多种解释。读取它的目的是什么?我发表了一篇关于如何通过将其作为BitMap实例加载来“读取”它的答案,这可以用于像素处理。如果您更愿意通过处理原始二进制文件来“读取”它,则可以使用Stream。 - havardhu
@harvadu:你说得对,我没有表述清楚。这是我想做的事情。由于文件上传HTML元素不会保留已上传的文件,我需要一个临时存储来保存已上传的图像。这就是为什么我将这些文件保存到“Conte/Photos”位置,以便它们可以显示给用户。一旦用户决定保存,我需要将它们保存到数据库并清除临时存储。 - Richard77
显示剩余2条评论
1个回答

25

更新:将图像读取为byte[]

// Load file meta data with FileInfo
FileInfo fileInfo = new FileInfo(path);

// The byte[] to save the data in
byte[] data = new byte[fileInfo.Length];

// Load a filestream and put its content into the byte[]
using (FileStream fs = fileInfo.OpenRead())
{
    fs.Read(data, 0, data.Length);
}

// Delete the temporary file
fileInfo.Delete();

// Post byte[] to database

为了历史记录,这是在问题澄清之前的答案。

你的意思是将它作为BitMap实例加载吗?

 BitMap image = new BitMap(path);

 // Do some processing
 for(int x = 0; x < image.Width; x++)
 {
     for(int y = 0; y < image.Height; y++)
     {
         Color pixelColor = image.GetPixel(x, y);
         Color newColor = Color.FromArgb(pixelColor.R, 0, 0);
         image.SetPixel(x, y, newColor);
     }
 }

// Save it again with a different name
image.Save(newPath);

让我问你另一个问题,只是为了更多地了解。由于您处理FileInfo的方式,我是否应该说FileInfo与HttpPostedFileBase具有相同的性质? - Richard77
2
不,它们有不同的用途。FileInfo“提供属性和实例方法,用于创建、复制、删除、移动和打开文件,并帮助创建FileStream对象。”而HttpPostedFileBase是一个包装器,用于上传自网络的二进制数据 - “封装了提供对客户端已上传的单个文件访问的HTTP内在对象。”不过它们有一些共同点。 - havardhu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接