 |
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, время: 22:58.
|