Вот мой класс Picture.cs:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Drawing;
namespace SharpLibrary_MediaManager
{
public class Picture:BaseFile
{
public int Height { get; set; }
public int Width { get; set; }
public Image Thumbnail { get; set; }
/// <summary>
/// Sets file information of an image from a given image in the file path.
/// </summary>
/// <param name="filePath">File path of the image.</param>
public override void getFileInformation(string filePath)
{
FileInfo fileInformation = new FileInfo(filePath);
if (fileInformation.Exists)
{
Name = fileInformation.Name;
FileType = fileInformation.Extension;
Size = fileInformation.Length;
CreationDate = fileInformation.CreationTime;
ModificationDate = fileInformation.LastWriteTime;
Height = calculatePictureHeight(filePath);
Width = calculatePictureWidth(filePath);
}
}
public override void getThumbnail(string filePath)
{
Image image = Image.FromFile(filePath);
Thumbnail = image.GetThumbnailImage(40, 40, null, new IntPtr());
}
private int calculatePictureHeight(string filePath)
{
var image = Image.FromFile(filePath);
return image.Height;
}
private int calculatePictureWidth(string filePath)
{
var image = Image.FromFile(filePath);
return image.Width;
}
}
}
И здесь я использую этот класс для извлечения информации из каждого файла в данной папке:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
namespace SharpLibrary_MediaManager
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
string folderPath = @"D:\Images\PictureFolder";
private void button1_Click(object sender, EventArgs e)
{
DirectoryInfo folder = new DirectoryInfo(folderPath);
List<Picture> lol = new List<Picture>();
foreach (FileInfo x in folder.GetFiles())
{
Picture picture = new Picture();
picture.getFileInformation(x.FullName);
lol.Add(picture);
}
MessageBox.Show(lol[0].Name);
}
}
}
Я получаю исключение "Недостаточно памяти" и не знаю почему. Это первый раз, когда я делаю что-то подобное, поэтому я довольно плохо знаком с пакетной обработкой файлов и т. Д.
Любая помощь, ребята? :)
Edit:
Я открыл диспетчер задач, чтобы увидеть использование памяти, и когда я нажимаю кнопку, чтобы запустить метод, я замечаю, что мое использование памяти увеличивается на 100 МБ ~ каждую секунду.
Редактировать 2:
В моей папке около 103 изображений, каждое из которых составляет ~ 100 КБ.
Мне нужно решение, где не имеет значения, сколько изображений в папке. Кто-то порекомендовал открыть изображение, сделать мою магию, а затем закрыть его. Я не очень понимаю, что он имел в виду под «близким».
Может кто-нибудь порекомендовать другой подход? :)
Редактировать 3:
Все еще получая исключение нехватки памяти, я изменил код в Picture.cs на основе рекомендаций, но у меня нет идей. Любая помощь?
public override void getFileInformation(string filePath)
{
FileInfo fileInformation = new FileInfo(filePath);
using (var image = Image.FromFile(filePath))
{
if (fileInformation.Exists)
{
Name = fileInformation.Name;
FileType = fileInformation.Extension;
Size = fileInformation.Length;
CreationDate = fileInformation.CreationTime;
ModificationDate = fileInformation.LastWriteTime;
Height = image.Height;
Width = image.Width;
}
}
}
Кроме того, я должен открыть новый вопрос теперь, когда он немного вырос?