Это вопрос из двух частей. Первый вопрос заключается в том, как можно загружать большие изображения без нехватки памяти (1), а второй - об улучшении производительности загрузки (2).
(1) Создайте приложение, такое как Photoshop, где у вас есть возможность работать с огромными изображениями, потребляющими гигабайты в файловой системе. Сохранение всего изображения в памяти и все еще достаточно свободной памяти для выполнения операций (фильтры, обработка изображений и т. Д. Или даже просто добавление слоев) было бы невозможным в большинстве систем (даже в системах 8 ГБ x64).
Вот почему такие приложения используют концепцию файлов подкачки. Внутренне я предполагаю, что Photoshop использует собственный формат файлов, подходящий для их приложений и созданный для поддержки частичной загрузки из подкачки, что позволяет им загружать части файла в память для его обработки.
(2) Performande можно улучшить (довольно много), написав пользовательские загрузчики для каждого формата файла. Это требует от вас чтения заголовков файлов и структуры форматов файлов, с которыми вы хотите работать. Как только вы получили его, это не **** что сложно, но это не так тривиально, как выполнение вызова метода.
Например, вы можете зайти в Google для FastBitmap, чтобы увидеть примеры того, как вы можете очень быстро загрузить файл растрового изображения (BMP), включая декодирование заголовка растрового изображения. Это включило pInvoke, и чтобы дать вам представление о том, с чем вы столкнулись, вам нужно будет определить растровые структуры, такие как
[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;
}
Возможно, работа с созданием DIB (http://www.herdsoft.com/ti/davincie/imex3j8i.htm) и странностей, таких как данные, которые хранятся "вверх ногами" в растровом изображении, которые вы должны принять во внимание, или вы увидите зеркальное отображение при открытии: - )
Теперь это только для растровых изображений. Скажем, вы хотите сделать PNG, тогда вам нужно будет делать аналогичные вещи, но декодировать заголовок PNG, что в простейшей форме не так сложно, но если вы хотите получить полную поддержку спецификации PNG, то вас ждет увлекательная поездка: - )
PNG отличается от растрового изображения тем, что использует формат на основе чанка, где у него есть «заголовки», которые можно найти, чтобы найти разные данные. Пример некоторых фрагментов, которые я использовал во время игры с форматом, был
string[] chunks =
new string[] {"?PNG", "IHDR","PLTE","IDAT","IEND","tRNS",
"cHRM","gAMA","iCCP","sBIT","sRGB","tEXt","zTXt","iTXt",
"bKGD","hIST","pHYs","sPLT","tIME"};
Вам также нужно будет узнать о контрольных суммах Adler32 для файлов PNG. Таким образом, каждый формат файла, который вы захотите сделать, будет добавлять свой набор проблем.
Я действительно хотел бы привести более полные примеры исходного кода в своем ответе, но это сложная тема, и, честно говоря, я сам не реализовал обмен, поэтому я не смог бы дать слишком много твердых советов по этому вопросу. ,
Короткий ответ: возможности обработки изображений в BCL не так уж и высоки. Средний ответ - попытаться выяснить, не написал ли кто-нибудь библиотеку изображений, которая могла бы вам помочь, а длинный ответ - поднять рукава и самостоятельно написать суть вашего приложения.
Раз ты знаешь меня в реальной жизни, то знаешь, где меня найти;)