|
04.11.2011, 17:03
|
#1
|
ПроЭктировщик
Регистрация: 09.05.2010
Адрес: рф ро шахты
Сообщений: 177
Написано 66 полезных сообщений (для 271 пользователей)
|
Lib_bitmap работа с пикселами изображения
я понимаю, что это баян, но...
если нужно произвести несколько действий над изображением, то при выводе его на экран в цикле картинка помаргивает. если загнать картинку в массив, вдоволь над ней поиздеваться, применив несколько эффектов, а потом создать для вывода на экран новое изображение, то мерцание пропадает.
в библиотеку включены стандартные функции (изменение размера, поворот на любой угол, замена цвета на другой, получение цвета пиксела и т.д.), плюс несколько дополнительных (обрезка по заданному региону, увеличение/уменьшение канвы с выравниванием по углам/сторонам/центру, изменение общей прозрачности, замена цвета, независимо от альфа-канала, создание тени, сдвиг содержимого картинки в стороны и пр.)
вполне достаточно, чтобы создать графический редактор для любого телефона, поддерживающего прозрачность.
сам я в MP писать перестал, но вдруг кому понадобится.
в архиве - библиотека, описание и исходники.
__________________
to be or not to be - it's not a question!
2b or not 2b = ff
Последний раз редактировалось barsunduk, 07.11.2011 в 00:02.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
07.11.2011, 00:07
|
#2
|
ПроЭктировщик
Регистрация: 09.05.2010
Адрес: рф ро шахты
Сообщений: 177
Написано 66 полезных сообщений (для 271 пользователей)
|
Ответ: Lib_bitmap работа с пикселами изображения
исправил косячок в pixmix. не спится, если знаю, что что-то не работает. даже если это никому не нужно...
описание функционала:
// ©barsunduk© 11/2011 // пример использования библиотеки Lib_bitmap // при использовании графических библиотек часто возникает мерцание // если же картинку загнать в битмап, поиздеваться над ней, // а потом вывести на экран - мерцания нет // описание функций см. ниже program Lib_bitmap_test; uses bitmap; var img: image; a: integer; begin // устанавливаем зеленый цвет setcol(h2i('ff008800')); // помещаем в битмап иконку createimg(loadimage('/icon.png')); // растягиваем битмап resize(64, 64); // размазываем blur; // запоминаем то, что вышло img := getimage; // растягиваем битмап resize(150, 100); // общая прозрачность = 75% alphablend(224); // делаем полупрозрачную маску (функция для шрифтов) // превращает оттенки серого в полупрозрачный черный mono; // перекрашиваем черный в синий, не меняя прозрачность floodrgb(h2i('88')); // увеличиваем канву с выравниванием по центру // освобождая место для контура canvassize(bitmap.width + 4, bitmap.height + 4, 0); // обводим контур белым outline(h2i('ffffffff')); a := 0; while KeyToAction(getKeyClicked) = GA_NONE do begin // закрашиваем экран FillRect(0, 0, GetWidth, GetHeight); // рисуем то, что вышло drawImage(img, 0, 0); drawImage(imgrotate(a), 0, 0); repaint; delay(20); a := a + 1; a := a mod 360; end; end. //===========================================\\ // функции \\ //===========================================\\ // получить цвет экрана getcol: integer; // установить цвет setcol(col); // переменная, содержащая цвет, которым будет закрашиваться точки // при повороте или изменении размеров канвы getback: integer; setback(col); // извлечение каналов ARGB цвета getalpha(col: integer): integer; getred(col: integer): integer; getgreen(col: integer): integer; getblue(col: integer): integer; // объединение каналов argb2int(alpha: integer, red: integer, green: integer, blue: integer): integer; // из 16-ричной в 10-тичную h2i(String s): integer; // из 10-чной в 16-ричную i2h(i: integer): string; // ширина битмапа width: integer; // высота битмапа height: integer; // наложение цветов с учетом альфа-каналов pixmix(forecolor: integer, backcolor: integer): integer; // попадает ли точка в пределы битмапа (0 - не попадает) inrect(x: integer, y: integer): integer; // получить цвет пиксела битмапа // если точка вне пределов, то возвращается цвет фона point(x: integer, y: integer): integer; // установить цвет пиксела setpixel(x: integer, y: integer, c: integer); // получить цвет пиксела картинки getpixel(img: Image, x: integer, y: integer): Image; // установить цвет пиксела, если прозрачности цвета выше пороговой plotpixel(x: integer, y: integer, c: integer); // нарисовать точку (можно полупрозрачную) plot(x: integer, y: integer, c: integer); // убить битмап free(); // создать пустой битмап createwh(w: integer, h: integer); // создать битмап из картинки createimg(img: Image); // создать битмап из части картинки createimgwh(img: Image, x: integer, y: integer, w: integer, h: integer); // возвращает картинку из битмапа getimage(): image; // нарисовать битмап на экране MP imgdraw(x: integer, y: integer); // заполнить битмап одним цветом flood(col: integer); // заменить цвет на новый newcolor(col: integer, newcol: integer); // заменить все цвета на новый // альфа канал не учитывается и не изменяется floodrgb(newrgb: integer); // заменить цвет rgb на новый // альфа канал не учитывается и не изменяется newrgb(rgb: integer, newrgb: integer); // заменить цвет rgb на новый argb // альфа канал не учитывается при поиске цвета rgb, но заменяется newargb(rgb: integer, newargb: integer); // заменить альфа канал на новый // (цвет rgb не учитывается) newalpha(alpha: integer, newalpha: integer); // обнулить альфа канал, если его значение мешьше alpha cutalpha(alpha: integer); // изменить значение альфа канала // альфа = [0..255] // учитывая прежнее значение alphablend(n: integer); // заменить цвета на оттенки серого // с учетом оптических особенностей восприятия gray(); // окружить силуэт линией // если прозрачность одного из пикселов сверху/снизу/слева/справа > 0 // то текущий пиксел перекрашивается в цвет бордюра linecolor outline(linecolor); // заливка всех пикселов с альфа-каналом > alphamin // цвет может быть полупрозрачным - заливка идет смешением каналов // т.е. можно выделить объект на картинке полупрозрачным цветом flooda(overcolor: integer, alphamin: integer); // размыть битмап blur(); // косинус, помноженный на 65535 cos(a: integer): integer; // синус, помноженный на 65535 sin(a: integer): integer; // возвращает большее из 2 чисел max(a: integer, b: integer): integer; // возвращает меньшее из 2 чисел min(a: integer, b: integer): integer; // возвращает большее из 4 чисел max4(a: integer, b: integer, c: integer, d: integer): integer; // возвращает меньшее из 4 чисел min4(a: integer, b: integer, c: integer, d: integer): integer; // поворот битмапа на любой угол rotate(angle: integer); // возвращает повернутую картинку, // при этом текущий битмап не меняется imgrotate(angle: integer): Image; // изменить размер картинки // битмап растягивается без сглаживания resize(neww: integer, newh: integer); // обрубить битмап, оставив только заданную область // (можно и увеличить канву) cut(x: integer, y: integer, w: integer, h: integer); // нарисовать изображение на текущем битмапе по заданным координатам // если alphaDraw = _mix (0), то пикселы смешиваются // иначе пикселы замещаются новыми drawimage(img: Image, x: integer, y: integer, alphadraw: integer); // изменить размер канвы // если a45 = 0, то выравнивание по центру // если a45 = 1, то выравнивание по правому краю // если a45 = 2, то выравнивание по правому верхнему углу // если a45 = 3, то выравнивание по верхнему краю // если a45 = 4, то выравнивание по левому верхнему углу // и т.д. // (a45 - 1) * 45 = угол, по которому ведется выравнивание canvassize(w: integer, h: integer, a45: integer, backcolor: integer); // сдвиг битмапа на dx точек по горизонтали и dy - по вертикали scroll(dx: integer, dy: integer); // перекрашиваем rgb битмапа в цвет c, оставляя только прежний альфа-канал mask(c: integer); // добавление тени // тень цвета c создается с учетом альфа канала shadow(dx: integer, dy: integer, c: integer); // наклон картинки на 1/8 высоты // для создания эффекта курсива в шрифтах italic(); // наложение копии битмапа, сдвинутой на пиксел вправо // (создает эффет полужирного шрифта) bold(); // заменить все цвета на 0x00, но с альфа каналом, // равным среднему арифметическому от каналов RGB // для создания монохромного шрифта, но со сглаживанием по альфа каналу // из картинки без прозрачности (черный шрифт на белом фоне, // но по идее должно работать с любыми картинками) mono;
__________________
to be or not to be - it's not a question!
2b or not 2b = ff
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 13:44.
|