Обработка на сурови данни
Обработка на сурови данни
За подобряване на производителността на Aspose.PSD API въведохме метод за обработка на сурови данни с версия 2.4.0. Обработката на сурови данни в момента се използва вътрешно и има външно API, така че може да се използва отвън библиотеката за подобряване на цялостната производителност. Понякога обработката се усложнява и изисква някои обяснения. Обработката на сурови данни в момента е налична само за формата BMP.
За да помогнем на разработчиците да постигнат най-добра производителност, Aspose.PSD API предоставя система за обработка на сурови данни, която има външно API за персонализация. Разработчиците използват семейството от методи LoadRawData и SaveRawData, за да използват обработката на сурови данни. Тези методи изискват също така желания формат на суровите данни да бъде зададен чрез класа RawDataSettings. Класът RawDataSettings позволява на разработчиците да зададат който и да е формат на суровите данни. Въпреки това, за постигане на най-добра производителност трябва да използвате формата на суровите данни, в която данните се съхраняват. RawDataSettings, дефинирани в класа RasterImage, помагат за определяне на формата на суровите данни на изображението. Когато подадете инстанция на RawDataSettings в метода LoadRawData, данните се връщат както са, без прилагане на конверсия, което може да подобри производителността. В противен случай, трябва да се погрижите за всички възможни настройки на форматите на суровите данни, което понякога може да бъде малко сложно.
За да опростите процеса на обработка, на сметка на някои наказания за производителност, ще може да указвате желаните RawDataSettings, като създадете и инициализирате инстанция на класа с нужните настройки на суровите данни. Има случаи, когато не е възможно да се върне суровите данни в посочения формат (например конверсия от цветово пространство CMYK към RGB не е налична в версия 2.4.0). Освен това, могат да се появят сценарии, при които обработката на сурови данни изобщо не е налична за даден формат на изображение. За да определите дали може да използвате семействата от методи LoadRawData и SaveRawData, трябва да проверите свойството IsRawDataAvailable.
Прозрение
За RGB формат на пикселите има налични индексирани (основани на палитра) и RGB базирани формати на сурови данни. Индексираните формати на сурови данни съдържат индекси на записи в палитрата в обхвата 0..(2^брой на битовете - 1). Индексираните формати на сурови данни са с 1, 2, 4 и 8 бита на пиксел. Останалите са RGB базирани формати на сурови данни. При зареждането на сурови данни, обърнете внимание, че има достатъчно налични байтове, за да се заредят данните, в противен случай ще бъде хвърлено съответното изключение. Можете просто да оцените размера на масива от байтове, като умножите размера на линията по необходимите линии. Размерът на линията може да варира и зависи от формата на съхранение на суровите данни.
За постигане на най-добра производителност винаги използвайте големината на линията с универсални сурови данни равна на стойността на свойството RasterImage.RawLineSize. Въпреки това понякога може да е необходимо да добавите допълнително сбиване към редовете със сурови данни или да го намалите, и в този случай може да се използва различен размер на линията. Ако се изисква подмножество на оградния правоъгълник на изображението, вземете предвид сдвига на битовете, който може да се появи за индексирани RGB пикселни формати. Например, нека разгледаме изображение с размери 100x100 пиксела и суров формат на данните с 1 бит на пиксел. Желаете да заредите правоъгълник със сурови данни с размери (7,0) и (2,1) или с други думи, искате 2 пиксела, започващи от x=7 и y=0. В този случай трябва да получите следната организация на данните:
Това означава, че получавате 2 байта, където първият байт съдържа 7 нежелани пиксела, следван от 1 желан пиксел, а вторият байт съдържа 1 желан пиксел и след него 7 нежелани. Може би си задавате въпроса защо не сме извършили сдвиг на данните и не сме сложили тези 2 пиксела в един байт? Отговорът е прост: за да поддържаме висока производителност. Всички вътрешни обработки обикновено се извършват с данните, започващи от първия пиксел и свършващи с последния наличен пиксел. Има рядки ситуации, в които се изисква подмножество на пиксели. Освен това, не знаем как тези пиксели ще бъдат обработени по-натам, така че сдвигът би понижил производителността и би направил кода излишно сложен. Винаги оценявайте правилния бит (няма нужда да се определя правилният байт, тъй като данните винаги идват с първия байт попълнен) където започват изискваните пиксели. За изчисляване на правилния бит може да се използва опростена формула: (rect.Left * bitsCount) % 8.
Конверсия на индексирани RGB цветове
За постигане на възможно най-висока производителност винаги използвайте същите настройки за източните и целевите сурови данни, формати на пикселите и големините на линията. Все пак, понякога може да се наложи извършване на конверсия на данните. Например, може да заредите изображение с RGB формат от 1 бит на пиксел и да го запазите с 2 бита на пиксел или да заредите изображение с 4 бита RGB и да ограничите неговия цветови обхват на 2 бита на пиксел. В такива случаи трябва да се приложи цветова конверсия. Конвертирането на индексирани RGB изображения понякога може да бъде трудно и не може да бъде извършено без някои зададени настройки. Ние трябва да определим как цветовият обхват на източното изображение се мапира в целевото цветово пространство. За постигането на тази задача използваме различни режими:
- Съвпадение на палитрата (DitheringMethods.PaletteConversion)
- Съвпадение на суровите данни (DitheringMethods.PaletteIgnore)
- Персонализирана конверсия (DitheringMethods.CustomConverter)
При използването на съвпадение на палитрата, цветовото пространство на източника се опитва да съвпадне с целевото цветово пространство възможно най-точно. Например, нека предположим, че имаме изображение с 4 бита и следните цветове: [0] RGB=0, 0, 0 [1] RGB=17, 17, 17 [2] RGB=34, 34, 34 [3] RGB=51, 51, 51 [4] RGB=68, 68, 68 [5] RGB=85, 85, 85 [6] RGB=102, 102, 102 [7] RGB=119, 119, 119 [8] RGB=136, 136, 136 [9] RGB=153, 153, 153 [10] RGB=170, 170, 170 [11] RGB=187, 187, 187 [12] RGB=204, 204, 204 [13] RGB=221, 221, 221 [14] RGB=238, 238, 238 [15] RGB=255, 255, 255
Изображението на източника изглежда по следния начин:
И преобразуваме 4-битовото изображение в 1-битово изображение със следните дефинирани цветове в палитрата:
[0] RGB = 0, 0, 0 [1] RGB = 255, 255, 255
При използване на режима за съвпадение на палитрата, конверторът прочита цвета на източния източник и определя целевия индекс, като използва метода GetNearestColorIndex на целевата палитра. Стойността на свойството RasterImage.RawFallbackIndex се използва в случай, че методът GetNearestColorIndex на палитрата даде индекс извън обхвата. Това преобразува цветовете на източното изображение до най-близките цветове на целевото изображение във вътрешност на стойностите за интензивност. Целевото изображение съответства възможно най-точно на източното изображение. Можете да видите следния резултат:
При използване на режима за съвпадение на суровите данни се използва различен сценарий. Палитрите за цветовете на източника и целта се пренебрегват и индексите на източника се съпоставят с индекси на целта. Когато се намери стойност, която не може да бъде съпоставена с целевия обхват (при намаляване на броя на битовете), тогава се използва стойността на свойството RasterImage.RawFallbackIndex. Стойността по подразбиране е 0 и ще бъде съпоставена с първия цвят в целевата палитра. Ако стойността на това свойство е извън обхвата на целевата палитра, ще бъде хвърлено подходящо изключение. Това води до по-малко предсказуеми резултати, които могат да бъдат показани на следващото изображение:
Режимът за съвпадение на палитрата е по-правилно решение за проблема с картографирането на цветовете, но с