Как я использую большие битовые массивы в.NET?

Разделить его регулярным выражением:

a.split(/_(?=[^_]+$)/)

Объяснение:

сопоставляет символ _ с положительным прогнозом (? = [^ _] + $)

[114 ] Соответствует одному символу, отсутствующему в списке ниже [^ _] +, и $ устанавливает позицию в конце строки или перед разделителем строки прямо в конце строки (если есть)

12
задан Reyhn 20 February 2009 в 15:09
поделиться

7 ответов

Это - два вопроса о части. Первый вопрос состоит в том, как можно загрузить большие изображения, не заканчиваясь память (1), второй находится на улучшении загружающейся производительности (2).

(1) Concider приложение как Photoshop, где у Вас есть способность работать с огромными изображениями, использующими гигабиты в файловой системе. Хранение всего изображения в памяти и все еще имеет достаточно свободной памяти для выполнения операций (фильтры, обработка изображений и так далее или даже просто добавляющие слои) было бы невозможно в большинстве систем (даже 8 ГБ x64 системы).

Именно поэтому приложения, такие как это используют понятие файлов подкачки. Внутренне я предполагаю, что фотошоп использует собственный формат файла, подходящий для их проектирования приложений и созданный для поддержки частичных нагрузок от подкачки, позволяя им загрузить части файла в память для обработки его.

(2) Performande может быть улучшен (довольно много) путем записи пользовательских загрузчиков для каждого формата файла. Это требует, чтобы Вы читали на заголовках файлов и структуре форматов файлов, с которыми Вы хотите работать. После того как Вы получили руку его не ****, что **** трудно, но это не столь тривиально как выполнение вызова метода.

Например, Вы могли погуглить, чтобы 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) и причуды как данные, хранившие "вверх тормашками" в битовом массиве, который необходимо принять во внимание или Вы будете видеть зеркальное отображение, когда u откроют его :-)

Теперь это только для битовых массивов. Скажите, что Вы хотели сделать PNG затем, необходимо будет сделать подобный материал, но декодирование заголовка PNG, который в его самой простой форме не является, что трудно, но если Вы хотите получить полную поддержку спецификации PNG затем, Вы находитесь в для забавной поездки :-)

PNG отличается для высказывания битового массива, так как он использует основанный на блоке формат, где он имеет "заголовки", Вы можете loacate для нахождения различных данных. Пример некоторых блоков, которые я использовал, в то время как проигрывание с форматом было

    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 не являются настолько горячими. Средний ответ должен был бы попытаться найти, записал ли кто-то библиотеку изображений, которая могла бы помочь Вам, и длинный ответ должен будет потянуть Ваши рукава и записать ядро Вашего приложения самим.

Так как Вы знаете меня в реальной жизни, Вы знаете, где найти меня ;)

8
ответ дан 2 December 2019 в 22:06
поделиться

Для действительно всестороннего ответа я использовал бы Отражатель для рассмотрения исходного кода Paint.NET (http://www.getpaint.net/); усовершенствованная программа редактирования графики записана в C#.

(как указано в комментарии, Paint.NET раньше был открытым исходным кодом, но является теперь закрытым исходным кодом).

3
ответ дан 2 December 2019 в 22:06
поделиться

Что относительно:

Image image = new Bitmap(filename);
using (Graphics gfx = Graphics.FromImage(image))
{    
// Stuff
}
0
ответ дан 2 December 2019 в 22:06
поделиться

просто быстрое исправление, у меня была та же проблема, я создал второй растровый экземпляр и передал битовый массив в конструкторе.

0
ответ дан 2 December 2019 в 22:06
поделиться

Можно ли создать новое, пробел, битовый массив тех же размеров и глубины цвета? Если это так, Вы, по крайней мере, знаете, что Ваша среда может обработать изображение. Затем проблема находится в изображении, загружающем подсистему с курса, Ваша обозначенная ссылка могла бы иметь место.

Я предполагаю, что Вы могли записать свои собственные растровые загрузчики, но это - большая работа для нетривиальных форматов, таким образом, я не предложил бы это.

Возможно, существуют заменяющие библиотеки, доступные, которые работают вокруг этих проблем со стандартными загрузчиками?

0
ответ дан 2 December 2019 в 22:06
поделиться

Таким образом, Вы говорите, что это не загрузка битового массива, но рендеринг, который вызывает из памяти?

Если так, можете Вы использовать Битовый массив. LockBits, чтобы схватить пикселей и записать основное изображение resizer самостоятельно?

0
ответ дан 2 December 2019 в 22:06
поделиться

Одна вещь просто ударила меня. Вы рисуете все изображение и не только видимую часть? Вы не должны тянуть большую часть изображения, чем Вы показываете в своем приложении, используйте x, y, ширину и параметры высоты для ограничения оттянутой области.

0
ответ дан 2 December 2019 в 22:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: