├── .gitattributes ├── LICENSE ├── README.md ├── docs └── image.jpg └── imageProcessor ├── 1802.bmp ├── 71fNRdqEcGL._SL1440_.jpg ├── GUIcontrol.pde ├── GUIinit.pde ├── alexgyverlogo.jpg ├── bitmap.h ├── dither.pde ├── drawImage.pde ├── imageProcessor.pde ├── klenovyy-list.jpg ├── langEN ├── langRU ├── noImage.jpg ├── wrench pixel.jpg ├── wrench.jpg └── Чем открыть исходник.txt /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 AlexGyver 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # imageProcessor 2 | [![Foo](https://img.shields.io/badge/ПОДПИСАТЬСЯ-НА%20ОБНОВЛЕНИЯ-brightgreen.svg?style=social&logo=telegram&color=blue)](https://t.me/GyverLibs) 3 | 4 | |⚠️⚠️⚠️
**Появилось более мощное и удобное приложение [Bitmaper](https://github.com/GyverLibs/Bitmaper), используйте его**
⚠️⚠️⚠️| 5 | | --- | 6 | 7 | Программа для преобразования изображений в битмап код. Для работы нужна [Java](https://www.java.com/ru/download/) 8 | ![КАРТИНКА](https://github.com/AlexGyver/imageProcessor/blob/master/docs/image.jpg) 9 | 10 | ## Возможности 11 | - Поддержка популярных форматов изображений 12 | - Встроенный редактор: 13 | - Перемещение/масштаб/поворот 14 | - Яркость/контрастность 15 | - Оттенки серого 16 | - Инверсия 17 | - Дисеринг (для OLED) 18 | - Порог (преобразовать в ЧБ) 19 | - Постеризация 20 | - Кисть 21 | - Сохранение отредактированного изображения в файл 22 | - Несколько вариантов кодировки: 23 | - OLED (вертикальный байт), 8 пикселей в байте, чёрный и белый (0-1) 24 | - 8 пикселей в байте, чёрный и белый (0-1) 25 | - 1 пиксель в байте, чёрный и белый (0-1) 26 | - 1 пиксель в байте, оттенки серого 8 бит (0-255) 27 | - RGB232, 1 пиксель в uint8 28 | - RGB565, 1 пиксель в uint16 29 | - RGB888, 1 пиксель в uint32 30 | - Настройка ширины и высоты 31 | - Добавление слова PROGMEM 32 | - Инверсия битмапа 33 | - Отражение по горизонтали и вертикали 34 | - Сохранение в файл, копирование в буфер обмена 35 | 36 | ## Управление 37 | - Слайдеры можно перемещать колесом мыши (навести и вращать) 38 | - Изображение можно перемещать удерживанием колеса мыши 39 | - Изображение можно масштабировать вращением колеса мыши 40 | 41 | ## Скачать релиз v1.5.1 42 | - [Windows 32](https://github.com/AlexGyver/imageProcessor/releases/download/1.5.1/application.windows32.zip) 43 | - [Windows 64](https://github.com/AlexGyver/imageProcessor/releases/download/1.5.1/application.windows64.zip) 44 | - [Linux 32](https://github.com/AlexGyver/imageProcessor/releases/download/1.5.1/application.linux32.zip) 45 | - [Linux 64](https://github.com/AlexGyver/imageProcessor/releases/download/1.5.1/application.linux64.zip) 46 | - [Linux arm64](https://github.com/AlexGyver/imageProcessor/releases/download/1.5.1/application.linux-arm64.zip) 47 | - [Linux armv6hf](https://github.com/AlexGyver/imageProcessor/releases/download/1.5.1/application.linux-armv6hf.zip) 48 | 49 | ## Исходник 50 | Программа сделана в [Processing](https://processing.org/). Используется библиотека **controlP5**, установить можно через встроенный менеджер библиотек (*Набросок/Импортировать библиотеку/Добавить библиотеку.../Libraries/* Искать **controlP5**). Также для работы Processing нужна [Java](https://www.java.com/ru/download/). 51 | 52 | ## Версии 53 | - v1.0 - поехали 54 | - v1.1 - добавил другие варианты вывода, инверсию и флип по Х и У, расширенный help 55 | - v1.2 - изменена логика перемещения изображения, добавлено перемещение удерживанием колеса мыши и масштаба - вращением 56 | - v1.3 - добавлен выбор между одномерным и двумерным битмапом 57 | - v1.4 - исправлены ошибки, добавлено имя битмапа 58 | - v1.5 - добавлен формат RGB323, исправлены ошибки 59 | - v1.5.1 - исправлена ошибка при запуске в релизах 60 | -------------------------------------------------------------------------------- /docs/image.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexGyver/imageProcessor/02b034317be5954ce6bf3f63ab93773c69a14091/docs/image.jpg -------------------------------------------------------------------------------- /imageProcessor/1802.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexGyver/imageProcessor/02b034317be5954ce6bf3f63ab93773c69a14091/imageProcessor/1802.bmp -------------------------------------------------------------------------------- /imageProcessor/71fNRdqEcGL._SL1440_.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexGyver/imageProcessor/02b034317be5954ce6bf3f63ab93773c69a14091/imageProcessor/71fNRdqEcGL._SL1440_.jpg -------------------------------------------------------------------------------- /imageProcessor/GUIcontrol.pde: -------------------------------------------------------------------------------- 1 | // ================ MOVE ================== 2 | 3 | void load_image() { 4 | selectInput("Select a file to process:", "fileSelected"); 5 | changeFlag = true; 6 | } 7 | 8 | void fileSelected(File selection) { 9 | if (selection == null) { 10 | println("Not selected"); 11 | } else { 12 | imagePath = selection.getAbsolutePath(); 13 | println("Select: " + imagePath); 14 | image = loadImage(imagePath); 15 | imageWidth = 256; 16 | image.resize(imageWidth, 0); 17 | sizeSlider.setValue(128); 18 | cp5.getController("img_rotate").setValue(0); 19 | sliderXY.setValue(0, 0); 20 | sliderBC.setValue(0, 1); 21 | } 22 | changeFlag = true; 23 | } 24 | 25 | void save_image() { 26 | PImage image = loadImage(imagePath); 27 | image = filtered(image); 28 | image.save("outputImage.bmp"); 29 | } 30 | 31 | void img_width(int size) { 32 | imageWidth = size; 33 | changeFlag = true; 34 | } 35 | 36 | void img_rotate(int val) { 37 | rotAngle = radians(val); 38 | } 39 | 40 | void image_pos() { 41 | changeFlag = true; 42 | } 43 | 44 | // ============== EFFECTS ============== 45 | 46 | void br_contr() { 47 | changeFlag = true; 48 | } 49 | 50 | void grayscale(boolean state) { 51 | grayscaleState = !state; 52 | changeFlag = true; 53 | } 54 | 55 | void invert(boolean state) { 56 | invertState = !state; 57 | changeFlag = true; 58 | } 59 | 60 | void dither(boolean state) { 61 | ditherState = !state; 62 | changeFlag = true; 63 | } 64 | 65 | void frame(boolean state) { 66 | frameState = !state; 67 | changeFlag = true; 68 | } 69 | 70 | void threshold(boolean state) { 71 | thresholdState = !state; 72 | changeFlag = true; 73 | } 74 | 75 | void t_value(float val) { 76 | thresholdValue = val; 77 | changeFlag = true; 78 | } 79 | 80 | void posterize(boolean state) { 81 | posterizeState = !state; 82 | changeFlag = true; 83 | } 84 | 85 | void p_value(int val) { 86 | posterizeValue = val; 87 | changeFlag = true; 88 | } 89 | 90 | void brush(boolean state) { 91 | changeFlag = true; 92 | brushState = !state; 93 | brushLayer = createGraphics(width, height); 94 | } 95 | 96 | void brush_size(int val) { 97 | brushSize = val; 98 | changeFlag = true; 99 | } 100 | 101 | // ============== ENCODING ============== 102 | 103 | void result_width(int val) { 104 | resultWidth = val; 105 | } 106 | void result_height(int val) { 107 | resultHeight = val; 108 | } 109 | 110 | void dropdown(int val) { 111 | saveMode = val; 112 | cp5.getController("save_bitmap").setVisible(true); 113 | cp5.getController("copy_clipboard").setVisible(true); 114 | cp5.getController("progmem").setVisible(true); 115 | cp5.getController("invert_result").setVisible(true); 116 | cp5.getController("flip_x").setVisible(true); 117 | cp5.getController("flip_y").setVisible(true); 118 | } 119 | 120 | void b_dimension(boolean val) { 121 | dimension = !val; 122 | cp5.getController("b_dimension").setCaptionLabel(dimension ? "2D ARRAY" : "1D ARRAY"); 123 | } 124 | 125 | void progmem(boolean val) { 126 | progmem = !val; 127 | } 128 | void invert_result(boolean val) { 129 | invert = !val; 130 | } 131 | void flip_x(boolean val) { 132 | flipX = !val; 133 | } 134 | void flip_y(boolean val) { 135 | flipY = !val; 136 | } 137 | 138 | String generateName(int arrayH, int arrayW) { 139 | return ("_"+resultWidth+"x"+resultHeight+(dimension ? "["+ arrayH +"]["+ arrayW +"]" : "[]") + (progmem ? " PROGMEM" : "") + " = {\n"); 140 | } 141 | 142 | 143 | void generateBitmap() { 144 | String thisName = cp5.get(Textfield.class, "name").getText(); 145 | saveLines = "// " + thisName + ".h " + resultWidth + "x" + resultHeight; 146 | switch (saveMode) { 147 | case 0: 148 | // ==== битмап для оледов ==== 149 | int numRows = ceil(resultHeight / 8.0); 150 | saveLines += " 8 pix/byte OLED\n"; 151 | saveLines += "const uint8_t " + thisName + generateName(numRows, resultWidth); 152 | 153 | for (int r = 0; r < numRows; r++) { 154 | saveLines += "\t"; 155 | if (dimension) saveLines += "{"; 156 | for (int j = 0; j < resultWidth; j++) { 157 | byte thisByte = 0; 158 | for (byte b = 0; b < 8; b++) thisByte |= getPixBW(j, r*8+7-b) << (7-b); 159 | saveLines += "0x" + hex(thisByte, 2); 160 | saveLines += ", "; 161 | } 162 | if (dimension) saveLines += "},"; 163 | saveLines += "\n"; 164 | } 165 | saveLines += "};"; 166 | break; 167 | case 1: 168 | // линейный битмап 169 | saveLines += " 8 pix/byte\n"; 170 | saveLines += "const uint8_t " + thisName + generateName(resultHeight, resultWidth/8); 171 | for (int h = 0; h < resultHeight; h++) { 172 | saveLines += "\t"; 173 | if (dimension) saveLines += "{"; 174 | for (int i = 0; i < resultWidth; i+=8) { 175 | byte thisByte = 0; 176 | for (byte b = 0; b < 8; b++) thisByte |= getPixBW(b+i, h) << (7-b); 177 | saveLines += "0x" + hex(thisByte, 2); 178 | saveLines += ", "; 179 | } 180 | if (dimension) saveLines += "},"; 181 | saveLines += "\n"; 182 | } 183 | saveLines += "};"; 184 | break; 185 | case 2: 186 | // 1 pix/byte, BW 187 | saveLines += " 1 pix/byte, BW\n"; 188 | saveLines += "const uint8_t " + thisName + generateName(resultHeight, resultWidth); 189 | for (int y = 0; y < resultHeight; y++) { 190 | saveLines += "\t"; 191 | if (dimension) saveLines += "{"; 192 | for (int x = 0; x < resultWidth; x++) { 193 | saveLines += getPixBW(x, y) + ", "; 194 | } 195 | if (dimension) saveLines += "},"; 196 | saveLines += "\n"; 197 | } 198 | saveLines += "};"; 199 | break; 200 | case 3: 201 | // ==== 1 pix/byte, Gray ==== 202 | saveLines += " 1 pix/byte, Gray\n"; 203 | saveLines += "const uint8_t " + thisName + generateName(resultHeight, resultWidth); 204 | for (int y = 0; y < resultHeight; y++) { 205 | saveLines += "\t"; 206 | if (dimension) saveLines += "{"; 207 | for (int x = 0; x < resultWidth; x++) { 208 | saveLines += "0x" + hex(getPixGray(x, y), 2) + ", "; 209 | } 210 | if (dimension) saveLines += "},"; 211 | saveLines += "\n"; 212 | } 213 | saveLines += "};"; 214 | break; 215 | case 4: 216 | // ==== rgb8 ==== 217 | saveLines += " rgb8\n"; 218 | saveLines += "const uint8_t " + thisName + generateName(resultHeight, resultWidth); 219 | for (int y = 0; y < resultHeight; y++) { 220 | saveLines += "\t"; 221 | if (dimension) saveLines += "{"; 222 | for (int x = 0; x < resultWidth; x++) { 223 | saveLines += "0x" + hex(getPixRGB8(x, y), 2) + ", "; 224 | } 225 | if (dimension) saveLines += "},"; 226 | saveLines += "\n"; 227 | } 228 | saveLines += "};"; 229 | break; 230 | case 5: 231 | // ==== rgb16 ==== 232 | saveLines += " rgb16\n"; 233 | saveLines += "const uint16_t " + thisName + generateName(resultHeight, resultWidth); 234 | for (int y = 0; y < resultHeight; y++) { 235 | saveLines += "\t"; 236 | if (dimension) saveLines += "{"; 237 | for (int x = 0; x < resultWidth; x++) { 238 | saveLines += "0x" + hex(getPixRGB16(x, y), 4) + ", "; 239 | } 240 | if (dimension) saveLines += "},"; 241 | saveLines += "\n"; 242 | } 243 | saveLines += "};"; 244 | break; 245 | case 6: 246 | // ==== rgb32 ==== 247 | saveLines += " rgb32\n"; 248 | saveLines = "const uint32_t " + thisName + generateName(resultHeight, resultWidth); 249 | for (int y = 0; y < resultHeight; y++) { 250 | saveLines += "\t"; 251 | if (dimension) saveLines += "{"; 252 | for (int x = 0; x < resultWidth; x++) { 253 | saveLines += "0x" + hex(getPixRGB32(x, y), 6) + ", "; 254 | } 255 | if (dimension) saveLines += "},"; 256 | saveLines += "\n"; 257 | } 258 | saveLines += "};"; 259 | break; 260 | } 261 | } 262 | 263 | void save_bitmap() { 264 | generateBitmap(); 265 | String[] lines = new String[1]; 266 | lines[0] = saveLines; 267 | saveStrings("bitmap.h", lines); 268 | } 269 | 270 | void copy_clipboard() { 271 | generateBitmap(); 272 | StringSelection selection = new StringSelection(saveLines); 273 | Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); 274 | clipboard.setContents(selection, selection); 275 | } 276 | 277 | // ============== COLOR PICKERS ============== 278 | color getColor(int x, int y) { 279 | if (flipX) x = resultWidth-1 - x; 280 | if (flipY) y = resultHeight-1 - y; 281 | color c = get(int(rectX + x * rectSize - rectSize*resultWidth/2 + rectSize/2), int(rectY + y * rectSize - rectSize*resultHeight/2 + rectSize/2)); 282 | return (invert ? ~c : c); 283 | } 284 | 285 | int getPixBW(int x, int y) { 286 | if (x >= resultWidth || y >= resultHeight) return 0; 287 | if (brightness(getColor(x, y)) < 127) return 0; 288 | else return 1; 289 | } 290 | 291 | byte getPixGray(int x, int y) { 292 | if (x >= resultWidth || y >= resultHeight) return 0; 293 | return byte(brightness(getColor(x, y))); 294 | } 295 | 296 | int getPixRGB32(int x, int y) { 297 | if (x >= resultWidth || y >= resultHeight) return 0; 298 | return getColor(x, y); 299 | } 300 | 301 | int getPixRGB16(int x, int y) { 302 | if (x >= resultWidth || y >= resultHeight) return 0; 303 | int col = getColor(x, y); 304 | return ( (((col) & 0xF80000) >> 8) | (((col) & 0xFC00) >> 5) | (((col) & 0xF8) >> 3)); 305 | } 306 | 307 | int getPixRGB8(int x, int y) { 308 | if (x >= resultWidth || y >= resultHeight) return 0; 309 | int col = getColor(x, y); 310 | return ( (((col) & 0xE00000) >> 16) | (((col) & 0xC000) >> 11) | (((col) & 0xE0) >> 5)); 311 | } 312 | 313 | // ================ BOTTOM ================== 314 | 315 | void help_ru() { 316 | helpState = !helpState; 317 | langulage = false; 318 | if (!helpState) changeFlag = true; 319 | } 320 | void help_en() { 321 | helpState = !helpState; 322 | langulage = true; 323 | if (!helpState) changeFlag = true; 324 | } 325 | 326 | void about() { 327 | link("https://github.com/AlexGyver/imageProcessor"); 328 | } 329 | 330 | void showHelp() { 331 | background(255); 332 | int[] textPos = new int[15]; 333 | textPos[0] = 30; 334 | textPos[1] = 60; 335 | textPos[2] = 90; 336 | textPos[3] = 130; 337 | textPos[4] = 150; 338 | textPos[5] = 260; 339 | textPos[6] = 310; 340 | textPos[7] = 360; 341 | textPos[8] = 410; 342 | textPos[9] = 480; 343 | textPos[10] = 510; 344 | textPos[11] = 540; 345 | textPos[12] = 590; 346 | textPos[13] = 650; 347 | textPos[14] = height - 10; 348 | 349 | noFill(); 350 | stroke(0); 351 | strokeWeight(3); 352 | rect(840, 3, 300, 610); 353 | 354 | PFont myFont; 355 | myFont = createFont("Ubuntu", 15); 356 | textFont(myFont); 357 | fill(0); 358 | String[] helpText; 359 | 360 | if (!langulage) helpText = loadStrings("langRU"); 361 | else helpText = loadStrings("langEN"); 362 | for (byte i = 0; i < 15; i++) { 363 | text(helpText[i], 240, textPos[i]); 364 | } 365 | for (byte i = 0; i < 40; i++) { 366 | text(helpText[i+16], 850, 20+i*15); 367 | } 368 | } 369 | -------------------------------------------------------------------------------- /imageProcessor/GUIinit.pde: -------------------------------------------------------------------------------- 1 | ScrollableList mode_list; 2 | 3 | void GUIinit() { 4 | cp5 = new ControlP5(this); 5 | 6 | // ======== EDITOR ======== 7 | 8 | cp5.addButton("load_image").setCaptionLabel("OPEN IMAGE").setPosition(10, 10).setSize(100, 25); 9 | 10 | cp5.addButton("save_image").setCaptionLabel("SAVE IMAGE").setPosition(120, 10).setSize(100, 25); 11 | 12 | sizeSlider = cp5.addSlider("img_width").setCaptionLabel("IMG SIZE").setPosition(10, 40).setSize(210, 25).setRange(2, 1000).setValue(64).setNumberOfTickMarks(998-1).showTickMarks(false); 13 | cp5.getController("img_width").getCaptionLabel().setPaddingX(-40); 14 | 15 | cp5.addSlider("img_rotate").setCaptionLabel("ROTATE").setPosition(10, 70).setSize(210, 25).setRange(0, 360).setValue(0); 16 | cp5.getController("img_rotate").getCaptionLabel().setPaddingX(-35); 17 | 18 | sliderXY = cp5.addSlider2D("image_pos").setPosition(10, 100).setSize(100, 100).setMinMax(-20, -20, 20, 20).setValue(0, 0); 19 | cp5.getController("image_pos").onRelease(new CallbackListener() { 20 | public void controlEvent(CallbackEvent ev) { 21 | sliderXY.setValue(0, 0); 22 | imageXresult += imageXadd; 23 | imageYresult += imageYadd; 24 | imageXadd = 0; 25 | imageYadd = 0; 26 | } 27 | } 28 | ); 29 | cp5.getController("image_pos").onDoublePress(new CallbackListener() { 30 | public void controlEvent(CallbackEvent ev) { 31 | sliderXY.setValue(0, 0); 32 | imageXresult = 0; 33 | imageYresult = 0; 34 | imageXadd = 0; 35 | imageYadd = 0; 36 | } 37 | } 38 | ); 39 | 40 | 41 | sliderBC = cp5.addSlider2D("br_contr").setPosition(120, 100).setSize(100, 100).setMinMax(-128, 0.0, 128, 5.0).setValue(0, 1); 42 | 43 | cp5.addToggle("grayscale").setPosition(10, 240).setSize(45, 25).setMode(ControlP5.SWITCH).setValue(true); 44 | 45 | cp5.addToggle("invert").setPosition(65, 240).setSize(45, 25).setMode(ControlP5.SWITCH).setValue(true); 46 | 47 | cp5.addToggle("dither").setPosition(120, 240).setSize(45, 25).setMode(ControlP5.SWITCH).setValue(true); 48 | 49 | cp5.addToggle("frame").setPosition(175, 240).setSize(45, 25).setMode(ControlP5.SWITCH).setValue(false); 50 | 51 | cp5.addToggle("threshold").setPosition(10, 290).setSize(45, 25).setMode(ControlP5.SWITCH).setValue(true); 52 | 53 | cp5.addSlider("t_value").setCaptionLabel("VALUE").setPosition(65, 290).setSize(155, 25).setRange(0.0, 1.0).setValue(0.5); 54 | cp5.getController("t_value").getCaptionLabel().setPaddingX(-30); 55 | 56 | cp5.addToggle("posterize").setPosition(10, 340).setSize(45, 25).setMode(ControlP5.SWITCH).setValue(true); 57 | 58 | cp5.addSlider("p_value").setCaptionLabel("VALUE").setPosition(65, 340).setSize(155, 25).setRange(2, 10).setValue(10).setNumberOfTickMarks(9); 59 | cp5.getController("p_value").getCaptionLabel().setPaddingX(-30); 60 | 61 | cp5.addToggle("brush").setPosition(10, 390).setSize(45, 25).setMode(ControlP5.SWITCH).setValue(true); 62 | 63 | cp5.addSlider("brush_size").setCaptionLabel("BRUSH SIZE").setPosition(65, 390).setSize(155, 25).setRange(1, 10).setValue(1).setNumberOfTickMarks(9); 64 | cp5.getController("brush_size").getCaptionLabel().setPaddingX(-55); 65 | 66 | cp5.addSlider("result_width").setCaptionLabel("RESULT WIDTH").setPosition(10, 460).setSize(210, 25).setRange(1, maxWidth).setValue(128).setNumberOfTickMarks(maxWidth-1).showTickMarks(false); 67 | cp5.getController("result_width").getCaptionLabel().setPaddingX(-65); 68 | 69 | cp5.addSlider("result_height").setCaptionLabel("RESULT HEIGHT").setPosition(10, 490).setSize(210, 25).setRange(1, maxHeight).setValue(64).setNumberOfTickMarks(maxHeight-1).showTickMarks(false); 70 | cp5.getController("result_height").getCaptionLabel().setPaddingX(-65); 71 | 72 | cp5.addToggle("b_dimension").setPosition(175, 520).setSize(45, 25).setMode(ControlP5.SWITCH).setValue(true).setCaptionLabel("1D ARRAY"); 73 | 74 | cp5.addToggle("progmem").setPosition(10, 570).setSize(45, 25).setMode(ControlP5.SWITCH).setValue(false); 75 | cp5.addToggle("invert_result").setCaptionLabel("INVERT").setPosition(65, 570).setSize(45, 25).setMode(ControlP5.SWITCH).setValue(true); 76 | cp5.addToggle("flip_x").setPosition(120, 570).setSize(45, 25).setMode(ControlP5.SWITCH).setValue(true); 77 | cp5.addToggle("flip_y").setPosition(175, 570).setSize(45, 25).setMode(ControlP5.SWITCH).setValue(true); 78 | 79 | cp5.addTextfield("name") 80 | .setPosition(10, 620) 81 | .setSize(100, 25) 82 | .setFont(createFont("arial", 15)) 83 | .setAutoClear(false) 84 | .setCaptionLabel("") 85 | .setText("bitmap") 86 | ; 87 | 88 | cp5.addButton("save_bitmap").setCaptionLabel("SAVE").setPosition(120, 620).setSize(45, 25); 89 | cp5.addButton("copy_clipboard").setCaptionLabel("COPY").setPosition(175, 620).setSize(45, 25); 90 | 91 | mode_list = cp5.addScrollableList("dropdown") 92 | .setCaptionLabel("OLED, 8 pix/byte, BW") 93 | .setPosition(10, 520) 94 | .setSize(155, 150) 95 | .setBarHeight(25) 96 | .setItemHeight(20) 97 | .addItem("OLED, 8 pix/byte, BW", "drop0") 98 | .addItem("8 pix/byte, BW", "drop1") 99 | .addItem("1 pix/byte, BW", "drop2") 100 | .addItem("1 pix/byte, Gray", "drop3") 101 | .addItem("1 pix/int8 (RGB323)", "drop4") 102 | .addItem("1 pix/int16 (RGB565)", "drop5") 103 | .addItem("1 pix/int32 (RGB888)", "drop6") 104 | .close() 105 | ; 106 | cp5.getController("dropdown").onRelease(new CallbackListener() { 107 | public void controlEvent(CallbackEvent ev) { 108 | boolean val = mode_list.isOpen(); 109 | cp5.getController("save_bitmap").setVisible(!val); 110 | cp5.getController("copy_clipboard").setVisible(!val); 111 | cp5.getController("progmem").setVisible(!val); 112 | cp5.getController("invert_result").setVisible(!val); 113 | cp5.getController("flip_x").setVisible(!val); 114 | cp5.getController("flip_y").setVisible(!val); 115 | } 116 | } 117 | ); 118 | 119 | // ======== BOTTOM ======== 120 | cp5.addButton("help_ru").setPosition(10, height-30).setSize(45, 25); 121 | cp5.addButton("help_en").setPosition(65, height-30).setSize(45, 25); 122 | cp5.addButton("about").setPosition(120, height-30).setSize(100, 25); 123 | } 124 | // 10,65,120,175 125 | -------------------------------------------------------------------------------- /imageProcessor/alexgyverlogo.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexGyver/imageProcessor/02b034317be5954ce6bf3f63ab93773c69a14091/imageProcessor/alexgyverlogo.jpg -------------------------------------------------------------------------------- /imageProcessor/bitmap.h: -------------------------------------------------------------------------------- 1 | // bitmap.h 128x128 8 pix/byte OLED 2 | const uint8_t bitmap_128x128[] PROGMEM = { 3 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 4 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 5 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 6 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 7 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0xF7, 0xFF, 0xEF, 0xEF, 0xEF, 0xEF, 0xEF, 0xEF, 0xEF, 0xFF, 0xFF, 0xDF, 0xDF, 0xDF, 0xDF, 0xFF, 0xFF, 0xBF, 0xBF, 0xBF, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 8 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0xF7, 0xF7, 0xF7, 0xF7, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0xF7, 0xF7, 0xF7, 0xFF, 0xFF, 0xFF, 0x1E, 0x1E, 0x9E, 0xFF, 0xFD, 0x0D, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 9 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0xE0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xE0, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 10 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0xFE, 0xFE, 0xF6, 0xEE, 0x1E, 0xFE, 0xFE, 0xFE, 0xFE, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0x7F, 0xC3, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 11 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x37, 0x37, 0x37, 0x37, 0x37, 0x36, 0x35, 0x35, 0x35, 0x35, 0x36, 0x37, 0x37, 0x37, 0x37, 0x37, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 12 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0xF1, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 13 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0xFF, 0xFF, 0xFF, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 14 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xFB, 0xF7, 0xE1, 0xFF, 0xF1, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE1, 0xFD, 0xFB, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0xFF, 0xFB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 15 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 16 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 17 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 18 | 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 19 | }; 20 | -------------------------------------------------------------------------------- /imageProcessor/dither.pde: -------------------------------------------------------------------------------- 1 | // ================== ФИЛЬТР DITHERING ================== 2 | 3 | // https://gist.github.com/joshmurr/7998502 4 | color[] colorPalette = new color[] { 5 | color(0, 0, 0), 6 | color(0, 0, 255), 7 | color(0, 255, 0), 8 | color(0, 255, 255), 9 | color(255, 0, 0), 10 | color(255, 0, 255), 11 | color(255, 255, 0), 12 | color(255, 255, 255) 13 | }; 14 | 15 | color[] greyPalette = new color[] { 16 | color(0), 17 | color(51), 18 | color(102), 19 | color(153), 20 | color(204), 21 | color(255) 22 | }; 23 | 24 | color[] bwPalette = new color[] { 25 | color(0, 0, 0), 26 | color(255, 255, 255) 27 | }; 28 | 29 | color[] rbPalette = new color[] { 30 | color(255, 0, 0), 31 | color(0, 0, 255) 32 | }; 33 | 34 | color[] rPalette = new color[] { 35 | color(156, 7, 201), 36 | color(9, 245, 89) 37 | }; 38 | 39 | void ditherImage(PImage img) { 40 | img.loadPixels(); 41 | int w = img.width; 42 | int h = img.height; 43 | 44 | color[][] p = new color[h][w]; 45 | float s = 7.0/16; 46 | float t = 3.0/16; 47 | float f = 5.0/16; 48 | float o = 1.0/16; 49 | 50 | for (int y=0; y> 16 & 0xFF) + s * qr; 71 | float ng = (p[y][x+1] >> 8 & 0xFF) + s * qg; 72 | float nb = (p[y][x+1] & 0xFF) + s * qb; 73 | p[y][x+1] = color(nr, ng, nb); 74 | } 75 | 76 | if (x-1>=0 && y+1> 16 & 0xFF) + t * qr; 78 | float ng = (p[y+1][x-1] >> 8 & 0xFF) + t * qg; 79 | float nb = (p[y+1][x-1] & 0xFF) + t * qb; 80 | p[y+1][x-1] = color(nr, ng, nb); 81 | } 82 | if (y+1 < h) { 83 | float nr = (p[y+1][x] >> 16 & 0xFF) + f * qr; 84 | float ng = (p[y+1][x] >> 8 & 0xFF) + f * qg; 85 | float nb = (p[y+1][x] & 0xFF) + f * qb; 86 | p[y+1][x] = color(nr, ng, nb); 87 | } 88 | if (x+1> 16 & 0xFF) + o * qr; 90 | float ng = (p[y+1][x+1] >> 8 & 0xFF) + o * qg; 91 | float nb = (p[y+1][x+1] & 0xFF) + o * qb; 92 | p[y+1][x+1] = color(nr, ng, nb); 93 | } 94 | } 95 | } 96 | 97 | img.updatePixels(); 98 | image(img, 0, 0); 99 | } 100 | 101 | color find_new_color(color c, color[] palette) { 102 | int bestIndex = 0; 103 | 104 | PVector[] vpalette = new PVector[palette.length]; 105 | PVector vcolor = new PVector((c >> 16 & 0xFF), (c >> 8 & 0xFF), (c & 0xFF)); 106 | float distance = vcolor.dist(new PVector(0, 0, 0)); 107 | 108 | for (int i=0; i> 16 & 0xFF), (palette[i] >> 8 & 0xFF), (palette[i] & 0xFF)); 110 | float d = vcolor.dist(vpalette[i]); 111 | if (d < distance) { 112 | distance = d; 113 | bestIndex = i; 114 | } 115 | } 116 | return palette[bestIndex]; 117 | } 118 | -------------------------------------------------------------------------------- /imageProcessor/drawImage.pde: -------------------------------------------------------------------------------- 1 | // применение фильтров 2 | PImage filtered(PImage image) { 3 | image.resize(imageWidth, 0); 4 | ContrastAndBrightness(image, image, contrastValue, brightnessValue); 5 | if (thresholdState) image.filter(THRESHOLD, thresholdValue); 6 | if (grayscaleState) image.filter(GRAY); 7 | if (invertState) image.filter(INVERT); 8 | if (posterizeState) image.filter(POSTERIZE, posterizeValue); 9 | if (ditherState) ditherImage(image); 10 | return image; 11 | } 12 | 13 | void mouseWheel(MouseEvent event) { 14 | if (mouseX > offsetWidth) { 15 | imageWidth -= event.getCount(); 16 | imageWidth = constrain(imageWidth, 2, 1000); 17 | cp5.getController("img_width").setValue(imageWidth); 18 | changeFlag = true; 19 | } 20 | } 21 | 22 | // вывод изображения 23 | void drawImage() { 24 | if (mousePressed && mouseButton == CENTER) { 25 | if (mouseX > offsetWidth) { 26 | if (!mouseState) { 27 | mouseState = true; // фиксируем нажатие 28 | draggedX = mouseX; 29 | draggedY = mouseY; 30 | } else { 31 | draggedXadd = (mouseX - draggedX)/5; 32 | draggedYadd = (mouseY - draggedY)/5; 33 | } 34 | } 35 | changeFlag = true; 36 | } else { 37 | if (mouseState) { 38 | mouseState = false; // фиксируем отпускание 39 | imageXresult += draggedXadd; 40 | imageYresult += draggedYadd; 41 | draggedXadd = 0; 42 | draggedYadd = 0; 43 | } 44 | } 45 | 46 | if (changeFlag) { 47 | image = loadImage(imagePath); 48 | image = filtered(image); 49 | brightnessValue = sliderBC.getArrayValue()[0]; 50 | contrastValue = sliderBC.getArrayValue()[1]; 51 | 52 | imageXadd = int(sliderXY.getArrayValue()[0]); 53 | imageYadd = int(sliderXY.getArrayValue()[1]); 54 | 55 | imageXoffs = imageXresult+imageXadd+draggedXadd; 56 | imageYoffs = imageYresult+imageYadd+draggedYadd; 57 | 58 | imgX = centerX - image.width/2 + imageXoffs; 59 | imgY = centerY - image.height/2 + imageYoffs; 60 | changeFlag = false; 61 | } 62 | background(255); 63 | 64 | // рисуем картинку 65 | hiddenLayer.beginDraw(); 66 | hiddenLayer.background(255); 67 | hiddenLayer.imageMode(CENTER); 68 | hiddenLayer.pushMatrix(); 69 | hiddenLayer.translate(width/2, height/2); 70 | hiddenLayer.rotate(rotAngle); 71 | hiddenLayer.image(image, 0, 0); 72 | hiddenLayer.endDraw(); 73 | hiddenLayer.popMatrix(); 74 | 75 | // заливка от дисера 76 | if (ditherState) { 77 | noStroke(); 78 | fill(255); 79 | rect(0, 0, width, imgY); 80 | rect(0, 0, imgX, height); 81 | } 82 | 83 | int maxSide = max(resultHeight, resultWidth); 84 | rectSize = maxHeight / maxSide; 85 | noStroke(); 86 | for (int i = 0; i < resultWidth; i++) { 87 | for (int j = 0; j < resultHeight; j++) { 88 | fill(hiddenLayer.get(width/2 - resultWidth/2+i-imageXoffs, centerY - resultHeight/2+j-imageYoffs)); 89 | rect(int(rectX + i * rectSize - rectSize*resultWidth/2), int(rectY + j * rectSize - rectSize*resultHeight/2), rectSize, rectSize); 90 | } 91 | } 92 | 93 | int x, y; 94 | x = round((mouseX-brushSize*rectSize/2 - rectX + rectSize*resultWidth/2) / rectSize); 95 | y = round((mouseY-brushSize*rectSize/2 - rectY + rectSize*resultHeight/2) / rectSize); 96 | x = round(rectX + x * rectSize - rectSize*resultWidth/2); 97 | y = round(rectY + y * rectSize - rectSize*resultHeight/2); 98 | 99 | if (mouseY > (rectY-rectSize*resultHeight/2) && mouseY < (rectY+rectSize*resultHeight/2) && 100 | mouseX > (rectX-rectSize*resultWidth/2) && mouseX < (rectX+rectSize*resultWidth/2) && 101 | brushState && mousePressed) { 102 | if (mouseButton == LEFT) brushColor = 255; 103 | else if (mouseButton == RIGHT) brushColor = 0; 104 | brushLayer.beginDraw(); 105 | brushLayer.noStroke(); 106 | brushLayer.fill(brushColor); 107 | brushLayer.rect(x, y, rectSize*brushSize, rectSize*brushSize); 108 | brushLayer.endDraw(); 109 | } 110 | 111 | if (brushState) { 112 | image(brushLayer, 0, 0); 113 | stroke(255, 0, 0); 114 | strokeWeight(1); 115 | noFill(); 116 | rect(x, y, rectSize*brushSize, rectSize*brushSize); 117 | } 118 | 119 | if (frameState) { 120 | noFill(); 121 | stroke(255, 0, 0); 122 | strokeWeight(2); 123 | rect(rectX - rectSize*resultWidth/2, rectY - rectSize*resultHeight/2, rectSize*resultWidth, rectSize*resultHeight); 124 | } 125 | } 126 | 127 | // ================== ФИЛЬТР ЯРКОСТЬ/КОНТРАСТ ================== 128 | // https://forum.processing.org/one/topic/increase-contrast-of-an-image.html 129 | void ContrastAndBrightness(PImage input, PImage output, float cont, float bright) { 130 | int w = input.width; 131 | int h = input.height; 132 | 133 | //our assumption is the image sizes are the same 134 | //so test this here and if it's not true just return with a warning 135 | if (w != output.width || h != output.height) 136 | { 137 | println("error: image dimensions must agree"); 138 | return; 139 | } 140 | 141 | //this is required before manipulating the image pixels directly 142 | input.loadPixels(); 143 | output.loadPixels(); 144 | 145 | //loop through all pixels in the image 146 | for (int i = 0; i < w*h; i++) 147 | { 148 | //get color values from the current pixel (which are stored as a list of type 'color') 149 | color inColor = input.pixels[i]; 150 | 151 | //slow version for illustration purposes - calling a function inside this loop 152 | //is a big no no, it will be very slow, plust we need an extra cast 153 | //as this loop is being called w * h times, that can be a million times or more! 154 | //so comment this version and use the one below 155 | int r = (int) red(input.pixels[i]); 156 | int g = (int) green(input.pixels[i]); 157 | int b = (int) blue(input.pixels[i]); 158 | 159 | //here the much faster version (uses bit-shifting) - uncomment to try 160 | //int r = (inColor >> 16) & 0xFF; //like calling the function red(), but faster 161 | //int g = (inColor >> 8) & 0xFF; 162 | //int b = inColor & 0xFF; 163 | 164 | //apply contrast (multiplcation) and brightness (addition) 165 | r = (int)(r * cont + bright); //floating point aritmetic so convert back to int with a cast (i.e. '(int)'); 166 | g = (int)(g * cont + bright); 167 | b = (int)(b * cont + bright); 168 | 169 | //slow but absolutely essential - check that we don't overflow (i.e. r,g and b must be in the range of 0 to 255) 170 | //to explain: this nest two statements, sperately it would be r = r < 0 ? 0 : r; and r = r > 255 ? 255 : 0; 171 | //you can also do this with if statements and it would do the same just take up more space 172 | r = r < 0 ? 0 : r > 255 ? 255 : r; 173 | g = g < 0 ? 0 : g > 255 ? 255 : g; 174 | b = b < 0 ? 0 : b > 255 ? 255 : b; 175 | 176 | //and again in reverse for illustration - calling the color function is slow so use the bit-shifting version below 177 | output.pixels[i] = color(r, g, b); 178 | //output.pixels[i]= 0xff000000 | (r << 16) | (g << 8) | b; //this does the same but faster 179 | } 180 | 181 | //so that we can display the new image we must call this for each image 182 | input.updatePixels(); 183 | output.updatePixels(); 184 | } 185 | -------------------------------------------------------------------------------- /imageProcessor/imageProcessor.pde: -------------------------------------------------------------------------------- 1 | // *** imageProcessor *** 2 | // Software for converting images into bitmaps for OLEDs and other displays 3 | // AlexGyver, 2020, https://alexgyver.ru/, https://github.com/AlexGyver/imageProcessor 4 | // v1.0 - поехали 5 | // v1.1 - исправил ошибки, добавил другие варианты вывода, инверсию и флип по Х и У, расширенный help 6 | // v1.2 - изменена логика перемещения изображения, добавлено перемещение удерживанием колеса мыши и масштаба - вращением 7 | // v1.3 - добавлен выбор между одномерным и двумерным битмапом 8 | // v1.4 - исправлены ошибки, добавлено имя битмапа 9 | // v1.5 - добавлен формат RGB323 10 | // v1.6 - исправлено зависание при большом размере в 8 pix/byte 11 | 12 | // constants 13 | int offsetWidth = 230; // оффсет панели управления 14 | int maxWidth = 650; 15 | int maxHeight = 650; 16 | 17 | // ControlP5 18 | // http://www.sojamo.de/libraries/controlP5/reference/index.html 19 | import controlP5.*; 20 | ControlP5 cp5; 21 | Slider2D sliderXY, sliderBC; 22 | Slider sizeSlider; 23 | 24 | // clipboard 25 | import java.awt.Toolkit; 26 | import java.awt.datatransfer.StringSelection; 27 | import java.awt.datatransfer.Clipboard; 28 | 29 | // image 30 | PImage image; 31 | PGraphics brushLayer, hiddenLayer; 32 | int sizeX, sizeY; 33 | int imageWidth = 100; 34 | int imageXoffs = 0, imageYoffs = 0; 35 | int imageXadd = 0, imageYadd = 0; 36 | int imageXresult = 0, imageYresult = 0; 37 | String imagePath; 38 | int centerX; 39 | int centerY; 40 | 41 | // settings 42 | float rotAngle = 0; 43 | boolean thresholdState = false; 44 | float thresholdValue = 0.5; 45 | boolean grayscaleState = false; 46 | boolean invertState = false; 47 | int posterizeValue = 10; 48 | boolean posterizeState = false; 49 | float contrastValue = 1.0; 50 | float brightnessValue = 0; 51 | boolean ditherState = false; 52 | boolean frameState = false; 53 | boolean changeFlag = true; 54 | int overlapAmount; 55 | float subtractWidth; 56 | int subtractAlpha; 57 | boolean brushState = false; 58 | int brushSize = 10; 59 | boolean helpState = false; 60 | color brushColor = color(255); 61 | int brushX; 62 | int brushY; 63 | boolean drawBrush = false; 64 | int imgX, imgY; 65 | int resultWidth, resultHeight, rectX, rectY; 66 | float rectSize; 67 | boolean progmem = true, invert = false, flipX = false, flipY = false; 68 | int saveMode = 0; 69 | String saveLines; 70 | boolean langulage = false; // 0 рус, 1 англ 71 | boolean mouseState = false; 72 | int draggedX, draggedY; 73 | int draggedXadd, draggedYadd; 74 | boolean dimension = false; 75 | 76 | void setup() { 77 | surface.setTitle("imageProcessor v1.5"); 78 | size(1200, 700); 79 | frameRate(60); 80 | smooth(); 81 | noStroke(); 82 | 83 | imagePath = "noImage.jpg"; 84 | image = loadImage(imagePath); 85 | imageWidth = image.width; 86 | 87 | GUIinit(); 88 | centerX = offsetWidth+150; 89 | centerY = height/2; 90 | rectX = (offsetWidth + width) / 2; 91 | rectY = height/2; 92 | brushLayer = createGraphics(width, height); 93 | hiddenLayer = createGraphics(width, height); 94 | } 95 | 96 | void draw() { 97 | if (!helpState) drawImage(); // обработка и вывод картинки 98 | else showHelp(); // подсказки 99 | drawGUI(); // выводим интерфейс 100 | //println(mouseX + " " + mouseY); 101 | } 102 | 103 | // =============================================================== 104 | 105 | void drawGUI() { 106 | // панель управления 107 | fill(90); 108 | noStroke(); 109 | rect(0, 0, offsetWidth, height); 110 | fill(255); 111 | rect(0, 225, offsetWidth, 3); 112 | rect(0, 440, offsetWidth, 3); 113 | rect(0, height-45, offsetWidth, 3); 114 | } 115 | -------------------------------------------------------------------------------- /imageProcessor/klenovyy-list.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexGyver/imageProcessor/02b034317be5954ce6bf3f63ab93773c69a14091/imageProcessor/klenovyy-list.jpg -------------------------------------------------------------------------------- /imageProcessor/langEN: -------------------------------------------------------------------------------- 1 | Open image / Save edited image 2 | Size (width) of source image 3 | Rotate 4 | XY position 5 | Brightness & contrast 6 | Grayscale / Invert / Dithering (for OLED) / Show frame 7 | Threshold 8 | Posterisation 9 | Brush mode / Size (LMB - white, RMB - black) 10 | Bitmap width (use mouse wheel for fine tuning) 11 | Bitmap height (use mouse wheel for fine tuning) 12 | Encoding (see hint on the right) / 1D or 2D bitmap 13 | PROGMEM / Color inversion / Flip Х / Flip Y 14 | Bitmap name / Save into bitmap.h / Copy to clipboard 15 | Help (press again to close) / About 16 | 17 | ENCODING MODES 18 | 19 | OLED, 8 pix/byte, BW 20 | - Bitmap for OLED 21 | - Vertical byte 22 | - 8 pixels in 1 byte 23 | - Black & White 24 | 25 | 8 pix/byte, BW 26 | - Horizontal byte 27 | - 8 pixels in 1 byte 28 | - Black & White 29 | 30 | 1 pix/byte, BW 31 | - Horizontal byte 32 | - 1 pixel in 1 byte 33 | - Black & White 34 | 35 | 1 pix/byte, Gray 36 | - Horizontal byte 37 | - 1 pixel in 1 byte 38 | - Grayscale 8 bit (0-255) 39 | 40 | 1 pix/int8 (RGB323) 41 | - Horizontal int8 42 | - 1 pixel in int8 43 | - RGB colors RGB323 44 | - RRRGGBBB 45 | 46 | 1 pix/int16 (RGB565) 47 | - Horizontal int16 48 | - 1 pixel in int16 49 | - RGB colors RGB565 50 | - RRRRRGGGGGGBBBBB 51 | 52 | 1 pix/int32 (RGB888) 53 | - Horizontal int32 54 | - 1 pixel in int32 55 | - RGB colors RGB888 56 | - RRRRRRRRGGGGGGGGBBBBBBBB -------------------------------------------------------------------------------- /imageProcessor/langRU: -------------------------------------------------------------------------------- 1 | Открыть / Сохранить отредактированное изображение 2 | Размер (ширина) исходное изображение 3 | Вращение изображения 4 | Позиция изображения по XY (слева) 5 | Яркость и контраст (справа) 6 | Преобразовать в серые тона / Инверсия / Фильтр dithering для OLED / Рамка 7 | Включить и настроить “порог” (преобразует в чёткое чёрно-белое изображение) 8 | Включить и настроить постеризацию (уменьшение количества оттенков) 9 | Кисть и её размер (ЛКМ - белый, ПКМ - чёрный) 10 | Ширина битмапа. Можно колёсиком мыши более точно настроить! 11 | Высота битмапа. Можно колёсиком мыши более точно настроить! 12 | Кодировка (смотри подсказку справа) / Одномерный-двумерный битмап 13 | PROGMEM / Инверсия цвета / Отразить по Х / Отразить по Y 14 | Имя битмапа / Сохранить в bitmap.h / Копировать в буфер обмена 15 | Помощь (нажми, чтобы закрыть) / О программе 16 | 17 | РЕЖИМЫ КОДИРОВАНИЯ 18 | 19 | OLED, 8 pix/byte, BW 20 | - Режим для OLED 21 | - Вертикальный байт 22 | - 8 пикселей в 1 байте 23 | - Чёрный и белый (0-1) 24 | 25 | 8 pix/byte, BW 26 | - Горизонтальный байт 27 | - 8 пикселей в 1 байте 28 | - Чёрный и белый (0-1) 29 | 30 | 1 pix/byte, BW 31 | - Горизонтальный байт 32 | - 1 пиксель в 1 байте 33 | - Чёрный и белый (0-1) 34 | 35 | 1 pix/byte, Gray 36 | - Горизонтальный байт 37 | - 1 пиксель в 1 байте 38 | - Градации серого 8 бит (0-255) 39 | 40 | 1 pix/int8 (RGB323) 41 | - Горизонтальный int8 42 | - 1 пиксель в int8 43 | - Цвет пикселя в RGB323 44 | - RRRGGBBB 45 | 46 | 1 pix/int16 (RGB565) 47 | - Горизонтальный int16 48 | - 1 пиксель в int16 49 | - Цвет пикселя в RGB565 50 | - RRRRRGGG GGGBBBBB 51 | 52 | 1 pix/int32 (RGB888) 53 | - Горизонтальный int32 54 | - 1 пиксель в int32 55 | - Цвет пикселя в RGB888 56 | - RRRRRRRR GGGGGGGG BBBBBBBB -------------------------------------------------------------------------------- /imageProcessor/noImage.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexGyver/imageProcessor/02b034317be5954ce6bf3f63ab93773c69a14091/imageProcessor/noImage.jpg -------------------------------------------------------------------------------- /imageProcessor/wrench pixel.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexGyver/imageProcessor/02b034317be5954ce6bf3f63ab93773c69a14091/imageProcessor/wrench pixel.jpg -------------------------------------------------------------------------------- /imageProcessor/wrench.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexGyver/imageProcessor/02b034317be5954ce6bf3f63ab93773c69a14091/imageProcessor/wrench.jpg -------------------------------------------------------------------------------- /imageProcessor/Чем открыть исходник.txt: -------------------------------------------------------------------------------- 1 | Скачать Java https://www.java.com/ru/download/ 2 | Скачать Processing https://processing.org/download/ 3 | 4 | Открыть любой .pde файл 5 | В Processing зайти "Набросок / Импортировать библиотеку... / Добавить библиотеку..." 6 | В поиске найти и установить библиотеку ControlP5 --------------------------------------------------------------------------------