检查图像文件大小(以字节为单位)

4

图片大小约为2.5MB。

该代码提供了正确的大小:

var fileLength = new FileInfo(path).Length;

这段代码会占用大约600KB的空间。
Image image= Image.FromFile(path);
byte[] imageByte = imageToByteArray(image);
long legnth= imageByte.Length;

public static byte[] imageToByteArray(System.Drawing.Image imageIn)
{
    MemoryStream ms = new MemoryStream();
    imageIn.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
    return ms.ToArray();
}

我错过了什么?

问题是我收到的图像是以byte[]形式接收的,所以...


3
imageToByteArray 是什么作用? - dkozl
1
我认为问题出在你的igameToByteArray实现上。 - Sergey Berezovskiy
2
文件通常包含压缩格式的图像(无论是RLE还是JPEG),而在内存中的图像则是未经压缩的位图(即像素数组)。 - Kuba Wyrostek
是的,你们说得对,格式错了,谢谢。 - omriman12
2
这里有一个问题,你强制将目标图像的格式设置为 png,这可能与图像最初保存的格式不同。 - DrCopyPaste
为什么会需要从磁盘加载文件,将其解析为某种位图图片格式,然后再次保存它,可能会使用与首次创建时不同的算法,保存到内存中,并检查该保存所需的内存量? - Anders Marzi Tornblad
3个回答

5
var fileLength = new FileInfo(path).Length;

类似于这样:

byte[] buffer = System.IO.File.ReadAllBytes(@"yourimage.ext");
int size = buffer.Length;

System.Drawing.Image对象保存了未压缩的位图。当您调用imageIn.Save(ms, System.Drawing.Imaging.ImageFormat.Png)时,位图将使用不同的图像/压缩算法或相同的算法但不同的选项进行压缩,这就是为什么图像大小不同的原因。


1
这段代码运行正常...
//your filePath  ex: /document/mypersonal/ram.png
var fileLength = new FileInfo (FilePath).Length;
public static string GetFileSize(fileLength)
{
    string[] sizes = { "B", "KB", "MB", "GB" };
    int order = 0;
    while (fileLength >= 1024 && order + 1 < sizes.Length) {
        order++;
        fileLength = fileLength/1024;
    }
    string result = String.Format("{0:0.##} {1}", fileLength, sizes[order]);
    return result;
}

0
检查您的字节数组的长度是否正确,问题在于,正如@Kuba Wyrostek所提到的那样,您很可能正在将文件格式从松散未压缩的位图更改为PNG,然后再检查大小,这将返回不同的值。
您可以依赖的最可靠的值是:
var fileLength = new FileInfo(path).Length;

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