2012-05-17 41 views
6

Tôi cần tạo một hình ảnh lớn (aprox 24000 x 22000) bằng mã hóa PixelFormat.Format24bppRgb. Tôi biết nó sẽ hầu như không không thể mở nó ...Tạo hình ảnh lớn trong C#

Những gì tôi đang cố gắng để làm điều này là:

Bitmap final = new Bitmap(width, height, PixelFormat.Format24bppRgb); 

Đúng như dự đoán, một ngoại lệ được ném như tôi không thể xử lý một file 11GB trong bộ nhớ dễ dàng theo cách đó.

Nhưng tôi đã có một ý tưởng: tôi có thể viết tệp khi tôi tạo tệp không? Vì vậy, thay vì làm việc trên RAM, tôi sẽ làm việc trên HD.

Chỉ cần giải thích rõ hơn: Tôi có khoảng 13K ô và tôi dự định ghép nó lại với nhau trong tập tin ngu ngốc này. Khi tôi có thể lặp lại chúng theo thứ tự cung cấp, tôi có thể viết nó trực tiếp xuống bộ nhớ bằng cách sử dụng mã không an toàn.

Mọi đề xuất?

+0

Thay vì mã không được quản lý, vui lòng đọc mã không an toàn ... –

+4

Xem [Tệp ánh xạ bộ nhớ] (http://msdn.microsoft.com/en-us/library/dd997372.aspx). – GSerg

+1

@GSerg tệp bộ nhớ được ánh xạ _can_ được sử dụng để mở/chỉnh sửa các phần từ một tệp lớn .... nhưng nó ** KHÔNG ĐƯỢC ĐỀ XUẤT ** tạo các tệp lớn đó trong bộ nhớ mappedfile !!! –

Trả lời

2

Bạn có thể viết bằng định dạng không nén như BMP. BMP lưu các byte màu nguyên theo hàng. Vì vậy, bạn sẽ tải hàng đầu tiên của gạch, đọc hàng pixel riêng biệt của họ và viết nó như là hàng đơn hỗn hợp trong hình ảnh đầu ra. Bằng cách này, bạn chỉ có thể mở vài lát và ghi lại hình ảnh đầu ra.

Nhưng tôi không biết cách viết nó dưới dạng hình ảnh nén, như JPG hoặc PNG. Nhưng tôi chắc chắn một số phần mềm chuyên biệt tồn tại cho điều đó.

+0

Tôi có ý tưởng của bạn và đó là một cách tiếp cận tốt, nhưng có một vấn đề: Khi lớp Bitmap kiểm tra xem hệ thống có thể xử lý các tệp lớn như vậy không, nó sẽ không cho phép tôi chuyển từ Bitmap mới(). –

+1

Điểm mấu chốt ở đây là, bạn không nên sử dụng bất kỳ lớp trong xây dựng nào để thao tác hình ảnh. Bạn nên làm nó thô. Vì vậy, như tôi đã nói, hãy sử dụng BMP, định dạng hình ảnh thô cực kỳ đơn giản, bạn có thể viết mà không cần bất kỳ thuật toán nén phức tạp nào. – Euphoric

+0

Hmmm ... Bây giờ tôi hiểu rồi. Đó thực sự là một ý tưởng hay! Tôi sẽ thử! Cảm ơn! –

0

Tùy thuộc vào những gì bạn định làm với hình ảnh này sau khi hoàn thành, tôi khuyên bạn nên chia nó thành 4 và làm việc với nó theo cách đó. Tôi đã làm việc với 10.000 x 10.000 pixel mà không có ngoại lệ OOM bị ném.

+0

Ngay bây giờ nó là chính xác những gì tôi đang làm và nó là một workaround hợp lệ, nhưng như tôi không có vội vàng trong việc tạo ra các tập tin này, tôi đang nghiên cứu phương pháp tiếp cận cho vấn đề! –

+0

FWIW, tôi thấy an toàn hơn khi ở dưới 8192 x 8192 pixel. Đặc biệt là nếu giữ nhiều kết cấu trong bộ nhớ cùng một lúc (ví dụ, để sao chép từ một đến khác). – ToolmakerSteve

3

ImageMagick's Large Image Support (tera-pixel) có thể giúp bạn đặt hình ảnh lại với nhau khi bạn có các ô xếp thành hình. Bạn có thể sử dụng dòng lệnh và đưa ra các lệnh bằng cách sử dụng trình bao bọc this hoặc sử dụng ImageMagick.NET làm API này.

+0

Dường như có triển vọng! Tôi sẽ xem xét API này! Cảm ơn! –

+0

Phiên bản cập nhật của ImageMagik.NET http://magick.codeplex.com/ – Jonathan

+0

Cảm ơn bạn đã liên kết tới ImageMagick.NET - Tôi không nhận thấy điều đó trước đây. – ToolmakerSteve

Các vấn đề liên quan