Как получить размер файла "System.Drawing.Image"
В настоящее время я пишу систему, в которой хранятся метаданные примерно для 140 000 изображений ish, хранящихся в библиотеке устаревших изображений, которые перемещаются в облачное хранилище. Я использую следующее, чтобы получить данные jpg...
System.Drawing.Image image = System.Drawing.Image.FromFile("filePath");
Im совершенно новый для манипуляции с изображениями, но это нормально для получения простых значений, таких как ширина, высота, соотношение сторон и т.д., но то, что я не могу решить, - это как получить физический размер файла jpg, выраженный в байтах. Любая помощь будет высоко оценена.
Спасибо
Окончательное решение, включающее хеш MD5 изображения для последующего сравнения
System.Drawing.Image image = System.Drawing.Image.FromFile(filePath);
if (image != null)
{
int width = image.Width;
int height = image.Height;
decimal aspectRatio = width > height ? decimal.divide(width, height) : decimal.divide(height, width);
int fileSize = (int)new System.IO.FileInfo(filePath).Length;
using (System.IO.MemoryStream stream = new System.IO.MemoryStream(fileSize))
{
image.Save(stream, System.Drawing.Imaging.ImageFormat.Jpeg);
Byte[] imageBytes = stream.GetBuffer();
System.Security.Cryptography.MD5CryptoServiceProvider provider = new System.Security.Cryptography.MD5CryptoServiceProvider();
Byte[] hash = provider.ComputeHash(imageBytes);
System.Text.StringBuilder hashBuilder = new System.Text.StringBuilder();
for (int i = 0; i < hash.Length; i++)
{
hashBuilder.Append(hash[i].ToString("X2"));
}
string md5 = hashBuilder.ToString();
}
image.Dispose();
}
Ответы
Ответ 1
Если вы получаете изображение прямо из файла, вы можете использовать следующий код, чтобы получить размер исходного файла в байтах.
var fileLength = new FileInfo(filePath).Length;
Если вы получаете изображение из другого источника, например, получение одного растрового изображения и составление его с другим изображением, например добавление водяного знака, вам нужно будет рассчитать размер во время выполнения. Вы не можете просто использовать оригинальный размер файла, потому что сжатие может привести к разному размеру выходных данных после модификации. В этом случае вы можете использовать MemoryStream для сохранения изображения:
long jpegByteSize;
using (var ms = new MemoryStream(estimatedLength)) // estimatedLength can be original fileLength
{
image.Save(ms, ImageFormat.Jpeg); // save image to stream in Jpeg format
jpegByteSize = ms.Length;
}
Ответ 2
Если у вас нет исходного файла, размер файла неясен, так как он зависит от формата и качества изображения. Так что вам нужно будет записать изображение в поток (например, MemoryStream), а затем использовать размер потока.
Ответ 3
System.Drawing.Image
не даст вам размер файла. Для этого вам нужно использовать другую библиотеку.
int len = (new System.IO.FileInfo(sFullPath)).Length;