2009-06-19 40 views
6

Tôi cần xử lý ảnh lớn (20.000x20.000 pixel) trong C#. Mở những hình ảnh này trực tiếp không phải là cách để đi vì giới hạn bộ nhớ, nhưng những gì tôi muốn làm là chia hình ảnh thành các phần nhỏ hơn (cắt xén). Tôi đang tìm kiếm một thư viện của bên thứ 3 mà có thể lừa, nhưng cho đến nay không có kết quả. Tôi đã thử FreeImage và ImageMagick, nhưng họ không thể mở hình ảnh 20.000x20x000 pixel. Làm thế nào tôi có thể đạt được điều này?Cách cắt ảnh lớn

+1

Định dạng hình ảnh là gì? Trong các định dạng như bitmap, bạn chỉ có thể sử dụng tệp io trực tiếp. Nếu bạn muốn sử dụng GDI hoặc bất cứ điều gì, sau đó bạn sẽ chuyển đổi các khối riêng lẻ thành một luồng và sau đó tải nó vào một hình ảnh). Các định dạng như PNG sẽ yêu cầu bạn tìm hiểu sâu hơn, kiểm tra xem các tệp PNG được chia thành các khối và làm việc trực tiếp với chúng như thế nào. – Brian

Trả lời

3

Dự án hiện tại của tôi tại nơi làm việc bao gồm chương trình xem/phân tích hình ảnh có khả năng tải hình ảnh vượt quá 16 gb. Bạn phải sử dụng tệp thủ công IO, kéo thông tin tiêu đề ra và tạo các hình phụ của bạn theo yêu cầu (hoặc nếu bạn đang xử lý hình ảnh, bạn có thể tạo một ô và xử lý nó tại chỗ). Rất ít thư viện sẽ cung cấp cho bạn khả năng tải/sửa đổi hình ảnh 20k 20k (1.2gb ở 24bpp) và những thư viện hiếm khi làm như vậy với bất kỳ thứ gì giống như hiệu suất (nếu đó là mối quan tâm).

+0

16gb + hình ảnh? Thats tuyệt vời, họ đến từ đâu? –

+0

Chúng tôi làm việc với hình ảnh radar khẩu độ tổng hợp có thể tạo ra những hình ảnh rất lớn: P –

+0

hah, đó là badass (google có một số hình ảnh tuyệt vời về điều đó), bạn sử dụng ngôn ngữ nào.Tôi tò mò nếu C# có thể xử lý loại khối lượng công việc đó –

0

Tôi không biết bất kỳ thư viện hiện có nào để thực hiện việc này.

Bạn có thể sẽ phải mở dòng tệp hình ảnh, tìm vị trí nơi dữ liệu màu và pixel tồn tại và đọc phần dữ liệu pixel vào mảng và tạo hình ảnh của bạn từ đó. Ví dụ, đối với BMP file format, bạn sẽ muốn tìm kiếm trong bảng màu, tải bảng màu, sau đó tìm kiếm phần mảng pixel, tải tuy nhiên nhiều pixel bạn muốn vào một mảng, sau đó tạo một bitmap mới chỉ với những pixel đó.

0

Tôi sẽ làm điều đó với ImageMagick. Có một .NET API khá vững chắc, và nó thường là cách tốt nhất để xử lý hình ảnh như thế này.

Xem bên dưới .NET, một phần của cách xuống trang.

http://www.imagemagick.org/script/api.php

Dưới đây là thông tin về cách những thứ cây trồng trong ImageMagick hoạt động, cho các phiên bản dòng lệnh.

http://www.imagemagick.org/Usage/crop/#crop

0

Bạn có thể sử dụng được xây dựng trong thư viện Net.

Sử dụng

sourceBitmap = (Bitmap)Image.FromStream(sourceFileStream, false, false);

Điều đó sẽ ngăn chặn các dữ liệu hình ảnh từ được lưu trữ trong bộ nhớ. Bạn có thể tạo bitmap đích mới để vẽ một phần phụ của hình ảnh lớn đó đến:

var output = new Bitmap(outputWidth, outputHeight); 
var outputGraphics = Graphics.FromImage(output); 

outputGraphics.DrawImage(sourceBitmap, destRect, srcRect, GraphicsUnit.Pixel); 

using (var fs = File.OpenWrite(outputFilePath)) 
{ 
    output.Save(fs, System.Drawing.Imaging.ImageFormat.Png); 
} 

Nơi destRect có thể là toàn bộ kích thước của đầu raImage hoặc một khu vực nhỏ hơn.

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