“ System.Drawing.Image”のファイルサイズを取得する方法
-
03-07-2019 - |
質問
現在、クラウドストレージに移動されるレガシーイメージライブラリ内に格納されている約140,000のようなイメージのメタデータを格納するシステムを作成しています。以下を使用してjpgデータを取得しています...
System.Drawing.Image image = System.Drawing.Image.FromFile("filePath");
画像操作はまったく新しいですが、幅、高さ、縦横比などの単純な値を取得するのにはこれで問題ありませんが、バイト単位で表された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();
}
解決
画像をファイルから直接取得する場合、次のコードを使用して元のファイルのサイズをバイト単位で取得できます。
var fileLength = new FileInfo(filePath).Length;
1つのビットマップを取得して他の画像と合成するなど、他のソースから画像を取得する場合、透かしを追加するなど、実行時にサイズを計算する必要があります。圧縮すると、変更後に出力データのサイズが異なる場合があるため、元のファイルサイズだけを使用することはできません。この場合、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;
}
他のヒント
元のファイルがない場合、ファイルサイズは画像の形式と品質に依存するため明確ではありません。だから、あなたがしなければならないことは、ストリーム(例えば、MemoryStream)に画像を書き込んでから、ストリームのサイズを使用することです。
System.Drawing.Image
では、ファイルサイズのサイズは提供されません。そのためには別のライブラリを使用する必要があります。
int len = (new System.IO.FileInfo(sFullPath)).Length;
所属していません StackOverflow