Tôi hiện đang xử lý các ảnh rất lớn, được tạo cơ bản bằng cách ghép nhiều hình ảnh nhỏ hơn (ví dụ: ảnh toàn cảnh hoặc phần mềm mosaic ảnh). Để tránh các ngoại lệ ngoài bộ nhớ (trong bộ nhớ chỉ là "bản đồ" về cách sắp xếp các hình ảnh nhỏ hơn), tôi đã viết một số mã lưu các hình ảnh này theo từng dòng dưới dạng bitmap sử dụng BinaryWriter và LockBits. Càng xa càng tốt.C# lưu các bitmap rất lớn dưới dạng jpegs (hoặc bất kỳ định dạng nén nào khác)
Vấn đề là bây giờ tôi cũng muốn lưu những hình ảnh này dưới dạng Jpegs (hoặc PNG). Vì tôi khá mới với C# Tôi chỉ có thể nghĩ đến hai cách cho bây giờ:
1) Tương tự như quy trình lưu bitmap. Tạo ra một số tiêu đề jpeg và lưu các dòng hình ảnh lớn theo dòng, nén chúng bằng cách nào đó trước đây. Tôi không có ý tưởng làm thế nào để thực hiện nén mặc dù.
2) Truyền trực tuyến bitmap đã lưu vào bộ nhớ và lưu nó dưới dạng jpeg được mã hóa.
Kể từ khi tiếp cận thứ hai có vẻ dễ dàng hơn, tôi đã cố gắng một cái gì đó như thế này:
FileStream fsr =
new FileStream("input.bmp", FileMode.Open, FileAccess.Read);
FileStream fsw =
new FileStream("output.jpg", FileMode.CreateNew, FileAccess.Write);
EncoderParameters encoderParameters = new EncoderParameters(1);
encoderParameters.Param[0] =
new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 80L);
Bitmap bmp = new Bitmap(fsr);
bmp.Save(fsw, GetEncoder(ImageFormat.Jpeg), encoderParameters);
bmp.Dispose();
Vấn đề bây giờ là tiết kiệm-phương pháp cố gắng hoàn toàn tải bitmap vào bộ nhớ đầu tiên, gây ra một out-of-bộ nhớ ngoại lệ.
Tôi sẽ rất vui vì bất kỳ đề xuất nào về cách giải quyết hoặc phá vỡ vấn đề này!
OutOfMemoryException trong ngày và tuổi này? Làm thế nào lớn là bitmap của bạn? – zmbq
có, bạn có thể gặp vấn đề về bộ nhớ một cách dễ dàng, tôi đã thay đổi kích thước khoảng 10 nghìn hình ảnh và thường xuyên chạy vào 'OutOfMemoryException', mặc dù tôi đã xử lý đúng cách. – DarthVader
OOM từ một Bitmap là rất đáng ngờ. Lớp này sẽ ném ngoại lệ bộ nhớ cho bất kỳ thứ gì sai, bao gồm các tham số xấu, v.v. –