Đây là câu hỏi gồm hai phần.Câu hỏi đầu tiên là làm thế nào bạn có thể tải hình ảnh lớn mà không cần hết bộ nhớ (1), thứ hai là cải thiện hiệu năng tải (2).
(1) Concider một ứng dụng như Photoshop, nơi bạn có khả năng làm việc với hình ảnh khổng lồ tiêu thụ gigabites trên hệ thống tập tin. Giữ toàn bộ hình ảnh trong bộ nhớ và vẫn còn đủ bộ nhớ trống để thực hiện các thao tác (bộ lọc, xử lý hình ảnh và vân vân, hoặc thậm chí chỉ thêm lớp) sẽ không thể thực hiện trên hầu hết các hệ thống (thậm chí hệ thống 8gb x64).
Đó là lý do tại sao các ứng dụng như thế này sử dụng khái niệm về tệp hoán đổi. Trong nội bộ, tôi giả định rằng photoshop sử dụng định dạng tệp độc quyền, phù hợp với thiết kế ứng dụng của họ và được xây dựng để hỗ trợ tải một phần từ trao đổi, cho phép họ tải các phần của tệp vào bộ nhớ để xử lý nó.
(2) Performande có thể được cải thiện (khá nhiều) bằng cách viết trình tải tùy chỉnh cho từng định dạng tệp. Điều này đòi hỏi bạn phải đọc lên các tiêu đề tập tin và cấu trúc của các định dạng tệp mà bạn muốn làm việc. Một khi bạn đã nhận được bàn tay của nó nó không **** mà **** cứng, nhưng nó không phải là tầm thường như làm một cuộc gọi phương thức.
Ví dụ bạn có thể google cho FastBitmap để xem các ví dụ về cách bạn có thể tải một tệp bitmap (BMP) rất nhanh, nó bao gồm giải mã tiêu đề bitmap. Đây tham gia pinvoke và cung cấp cho bạn một số ý tưởng về những gì bạn đang lên chống lại bạn sẽ cần phải xác định structues bitmap như
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct BITMAPFILEHEADER
{
public Int16 bfType;
public Int32 bfSize;
public Int16 bfReserved1;
public Int16 bfReserved2;
public Int32 bfOffBits;
}
[StructLayout(LayoutKind.Sequential)]
public struct BITMAPINFO
{
public BITMAPINFOHEADER bmiHeader;
public RGBQUAD bmiColors;
}
[StructLayout(LayoutKind.Sequential)]
public struct BITMAPINFOHEADER
{
public uint biSize;
public int biWidth;
public int biHeight;
public ushort biPlanes;
public ushort biBitCount;
public BitmapCompression biCompression;
public uint biSizeImage;
public int biXPelsPerMeter;
public int biYPelsPerMeter;
public uint biClrUsed;
public uint biClrImportant;
}
Có thể làm việc với việc tạo ra một DIB (http://www.herdsoft.com/ti/davincie/imex3j8i.htm) và oddities như các dữ liệu được lưu trữ "lộn ngược "trong một bitmap mà bạn cần phải đưa vào tài khoản hoặc bạn sẽ thấy một hình ảnh phản chiếu khi bạn mở nó :-)
Bây giờ, đó là chỉ cho bitmap. Giả sử bạn muốn làm PNG thì bạn cần phải làm những thứ tương tự nhưng giải mã tiêu đề PNG, mà ở dạng đơn giản nhất của nó không khó, nhưng nếu bạn muốn nhận hỗ trợ đặc tả PNG đầy đủ thì bạn đang ở trong một chuyến đi thú vị:)
PNG là khác nhau để nói một bitmap vì nó sử dụng một định dạng dựa trên đoạn mà nó có "tiêu đề" bạn có thể loacate để tìm các dữ liệu khác nhau. Ví dụ về một số khối tôi đã sử dụng trong khi chơi với định dạng là
string[] chunks =
new string[] {"?PNG", "IHDR","PLTE","IDAT","IEND","tRNS",
"cHRM","gAMA","iCCP","sBIT","sRGB","tEXt","zTXt","iTXt",
"bKGD","hIST","pHYs","sPLT","tIME"};
Bạn cũng sẽ phải tìm hiểu về checksums Adler32 cho các tập tin PNG. Vì vậy, mỗi định dạng tệp bạn muốn làm sẽ thêm một tập hợp các thách thức khác. Tôi thực sự muốn tôi có thể cung cấp đầy đủ các ví dụ mã nguồn đầy đủ hơn trong câu trả lời của tôi nhưng đó là một chủ đề phức tạp, và thành thật mà nói tôi đã không thực hiện hoán đổi để tôi không thể đưa ra quá nhiều lời khuyên chắc chắn về cái đó.
Câu trả lời ngắn gọn là khả năng xử lý hình ảnh trong BCL không phải là nóng. Câu trả lời trung bình sẽ là thử và tìm xem liệu ai đó đã viết một thư viện hình ảnh có thể giúp bạn và câu trả lời dài sẽ là kéo tay áo của bạn lên và viết cốt lõi của ứng dụng của bạn cho mình.
Vì bạn biết tôi trong cuộc sống thực, bạn biết nơi để tìm tôi;)
tôi không nghĩ rằng điều này sẽ làm việc trên một hệ thống 32 bit dựa trên các hạn chế – WiiMaxx