├── .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 | [](https://t.me/GyverLibs)
3 |
4 | |⚠️⚠️⚠️
**Появилось более мощное и удобное приложение [Bitmaper](https://github.com/GyverLibs/Bitmaper), используйте его**
⚠️⚠️⚠️|
5 | | --- |
6 |
7 | Программа для преобразования изображений в битмап код. Для работы нужна [Java](https://www.java.com/ru/download/)
8 | 
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
--------------------------------------------------------------------------------