- Непроверено
- 0 успешни тест(а)
- 6 неуспешни тест(а)
Картинки 2.0
- Краен срок
- 19.11.2013 17:00
Срокът за предаване на решения е отминал
За това предизвикателство ще поработим върху нашия код за обработка на изображения. За целта, в структурата (header) ще се наложи да добавим допълнително поле "Encoding". Вашата задача ще бъде да прочетете данните въз основа на encoding-а, да ги нормализирате и да предоставяте достъп до тях както правехте до сега.
Byte array
В списъка с байтове ще се съхраняват данните за всеки пиксел от изображението.
Encoding
За нашите изображения encoding алгоритъмът ще бъде RLE (Run-length encoding).
RLE е най-простият енкодинг за изображения. Неговата идея произлиза от това, че много изображения съдържат голям брой съседни пиксели с еднакви стойности. За да оптимизира този случай RLE решава да напише брой повторения и стойността (но стойността се записва само веднъж)
Червено, Червено, Червено, Червено, Червено, Зелено, Червено Ще бъде превърнато в: 5 Червено, Зелено, Червено
За повече информация погледнете тук.
Относно нашите данни представянето се променя така: Три сини пиксела RGB:
blue := []byte{3, 0, 0, 255}
Три червени пиксела RGBA: red := []byte{3, 255, 0, 0, 255}
Header
Структурата Header, която ще носи данните за подаденото изображение, ще има данни като:
-
Format
пази формата: всички премутации на RGB и на RGBA -
LineWidth
съдържа броя колони от пиксели -
Encoding
string, който пази енкодинг типа. Валидни стойности: "RLE", "None".
Colors
Относно стуктурата на цветовете: В byte масива цветовете ще ви бъдат подадени като число от 0 - 255. За да подобрим поведението на нашето решение към цветовете ще закръгляме всяка стойност, която получим към най-близкия цвят. За останалите, които не искат да ползват междинно представяне, знайте (((color * alpha) + 128)/255), но за тази цел трябва да си дефинирате операции върху цветовете.
Precomputing
Независимо дали изображението е енкоднато, крайният резултат трябва да е с precomputed alpha.
Грешки
След като сме решили да направим решението си по "приемливо", се налага да се погирижим и за "неадекватните" хора, които ползват нашия код.
За тази цел ще се наложи InspectPixel
и ParseImage
да ни връщат грешки. Това налага да добавим в нашата дефиниция на двете функции error към return аргументите.
Относно как работят грешките в Go, може да видите тук.
За нашата задача няма да ни интересува каква е върнатата грешка. От вас се иска да се погрижите при "странни" случай да бъде върната грешка и данната да е nil.
>>> data := []byte{}
[]
>>> header := Header{"RGB", 3, "None"}
>>> if image, err := ParseImage(data, header); err != nil {
>>> do stuff
>>> }
>>> if pixel, err := image.InspectPixel(5, 0); err != nil {
>>> do stuff
>>> }
>>> fmt.Println(pixel.Color())
Red: 31, Green: 33, Blue: 41
Описание
Задачата е да разширим обхвата от данни, които може вашата функция да приема, и да добавим Image Encoding към уравнението. Стуктура Image продължава да има метод InspectPixel
.
При извикване на InspectPixel
, той трябва да връща тип *Pixel, който да има Color, съдържащ Red, Green и Blue като стойности от 0 - 255.
Пример
Пример за извикване без енкодинг.
>>> data := []byte{0, 12, 244, 13, 26, 52, 31, 33, 41}
[0 12 244 13 26 52 31 33 41]
>>> header := Header{"RGB", 3, "None"}
>>> pixel, _ := ParseImage(data, header).InspectPixel(0, 0)
>>> fmt.Println(pixel.Color())
Red: 0, Green: 12, Blue: 244
Пример за извикване с енкодинг.
>>> data := []byte{1, 0, 12, 244, 3, 13, 26, 52, 3, 31, 33, 41}
[2 0 12 244 3 13 26 52 3 31 33 41]
>>> header := Header{"RGB", 3, "RLE"}
>>> pixel, _ := ParseImage(data, header).InspectPixel(0, 0)
>>> fmt.Println(pixel.Color())
Red: 0, Green: 12, Blue: 244
>>> pixel = ParseImage(data, header).InspectPixel(5, 0)
>>> fmt.Println(pixel.Color())
Red: 31, Green: 33, Blue: 41
Решения
- Непроверено
- 0 успешни тест(а)
- 6 неуспешни тест(а)
- Непроверено
- 0 успешни тест(а)
- 6 неуспешни тест(а)
- Непроверено
- 0 успешни тест(а)
- 6 неуспешни тест(а)
- Непроверено
- 6 успешни тест(а)
- 0 неуспешни тест(а)
- Непроверено
- 6 успешни тест(а)
- 0 неуспешни тест(а)