Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для мобильных телефонов > MidletPascal > Библиотеки

Ответ
 
Опции темы
Старый 04.11.2011, 17:03   #1
barsunduk
ПроЭктировщик
 
Аватар для barsunduk
 
Регистрация: 09.05.2010
Адрес: рф ро шахты
Сообщений: 177
Написано 66 полезных сообщений
(для 271 пользователей)
Lib_bitmap работа с пикселами изображения

я понимаю, что это баян, но...

если нужно произвести несколько действий над изображением, то при выводе его на экран в цикле картинка помаргивает. если загнать картинку в массив, вдоволь над ней поиздеваться, применив несколько эффектов, а потом создать для вывода на экран новое изображение, то мерцание пропадает.

в библиотеку включены стандартные функции (изменение размера, поворот на любой угол, замена цвета на другой, получение цвета пиксела и т.д.), плюс несколько дополнительных (обрезка по заданному региону, увеличение/уменьшение канвы с выравниванием по углам/сторонам/центру, изменение общей прозрачности, замена цвета, независимо от альфа-канала, создание тени, сдвиг содержимого картинки в стороны и пр.)

вполне достаточно, чтобы создать графический редактор для любого телефона, поддерживающего прозрачность.

сам я в MP писать перестал, но вдруг кому понадобится.

в архиве - библиотека, описание и исходники.
Вложения
Тип файла: zip Lib_bitmap.zip (14.3 Кб, 812 просмотров)
__________________
to be or not to be - it's not a question!
2b or not 2b = ff

Последний раз редактировалось barsunduk, 07.11.2011 в 00:02.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Rock2roll (31.03.2012)
Старый 07.11.2011, 00:07   #2
barsunduk
ПроЭктировщик
 
Аватар для barsunduk
 
Регистрация: 09.05.2010
Адрес: рф ро шахты
Сообщений: 177
Написано 66 полезных сообщений
(для 271 пользователей)
Ответ: Lib_bitmap работа с пикселами изображения

исправил косячок в pixmix. не спится, если знаю, что что-то не работает. даже если это никому не нужно...

описание функционала:
// ©barsunduk© 11/2011

// пример использования библиотеки Lib_bitmap
// при использовании графических библиотек часто возникает мерцание
// если же картинку загнать в битмап, поиздеваться над ней,
// а потом вывести на экран - мерцания нет
// описание функций см. ниже

program Lib_bitmap_test;

uses
  bitmap
;
  
var
  
imgimage;
  
ainteger;

begin
  
// устанавливаем зеленый цвет
  
setcol(h2i('ff008800'));
  
// помещаем в битмап иконку
  
createimg(loadimage('/icon.png'));
  
// растягиваем битмап
  
resize(6464);
  
// размазываем
  
blur;
  
// запоминаем то, что вышло
  
img := getimage;
  
// растягиваем битмап
  
resize(150100);
  
// общая прозрачность = 75%
  
alphablend(224);
  
// делаем полупрозрачную маску (функция для шрифтов)
  // превращает оттенки серого в полупрозрачный черный
  
mono;
  
// перекрашиваем черный в синий, не меняя прозрачность
  
floodrgb(h2i('88'));
  
// увеличиваем канву с выравниванием по центру
  // освобождая место для контура
  
canvassize(bitmap.width 4bitmap.height 40);
  
// обводим контур белым
  
outline(h2i('ffffffff'));
  
:= 0;
  while 
KeyToAction(getKeyClicked) = GA_NONE do
  
begin
    
// закрашиваем экран
    
FillRect(00GetWidthGetHeight);
    
// рисуем то, что вышло
    
drawImage(img00);
    
drawImage(imgrotate(a), 00);
    
repaint;
    
delay(20);
    
:= 1;
    
:= a mod 360;
  
end;
end.

//===========================================\\
//                  функции                  \\
//===========================================\\

// получить цвет экрана
getcolinteger;

// установить цвет
setcol(col);

// переменная, содержащая цвет, которым будет закрашиваться точки
// при повороте или изменении размеров канвы
getbackinteger;
setback(col);

// извлечение каналов ARGB цвета
getalpha(colinteger): integer;
getred(colinteger): integer;
getgreen(colinteger): integer;
getblue(colinteger): integer;

// объединение каналов
argb2int(alphaintegerredintegergreenintegerblueinteger): integer;

// из 16-ричной в 10-тичную
h2i(String s): integer;

// из 10-чной в 16-ричную
i2h(iinteger): string;

// ширина битмапа
widthinteger;

// высота битмапа
heightinteger;

// наложение цветов с учетом альфа-каналов
pixmix(forecolorintegerbackcolorinteger): integer;

// попадает ли точка в пределы битмапа (0 - не попадает)
inrect(xintegeryinteger): integer;

// получить цвет пиксела битмапа
// если точка вне пределов, то возвращается цвет фона
point(xintegeryinteger): integer;

// установить цвет пиксела
setpixel(xintegeryintegercinteger);

// получить цвет пиксела картинки
getpixel(imgImagexintegeryinteger): Image;

// установить цвет пиксела, если прозрачности цвета выше пороговой
plotpixel(xintegeryintegercinteger);

// нарисовать точку (можно полупрозрачную)
plot(xintegeryintegercinteger);

// убить битмап
free();

// создать пустой битмап
createwh(wintegerhinteger);

// создать битмап из картинки
createimg(imgImage);

// создать битмап из части картинки
createimgwh(imgImagexintegeryintegerwintegerhinteger);

// возвращает картинку из битмапа
getimage(): image;

// нарисовать битмап на экране MP
imgdraw(xintegeryinteger);

// заполнить битмап одним цветом
flood(colinteger);

// заменить цвет на новый
newcolor(colintegernewcolinteger);

// заменить все цвета на новый
// альфа канал не учитывается и не изменяется
floodrgb(newrgbinteger);

// заменить цвет rgb на новый
// альфа канал не учитывается и не изменяется
newrgb(rgbintegernewrgbinteger);

// заменить цвет rgb на новый argb
// альфа канал не учитывается при поиске цвета rgb, но заменяется
newargb(rgbintegernewargbinteger);

// заменить альфа канал на новый
// (цвет rgb не учитывается)
newalpha(alphaintegernewalphainteger);

// обнулить альфа канал, если его значение мешьше alpha
cutalpha(alphainteger);

// изменить значение альфа канала
// альфа = [0..255]
// учитывая прежнее значение
alphablend(ninteger);

// заменить цвета на оттенки серого
// с учетом оптических особенностей восприятия
gray();

// окружить силуэт линией
// если прозрачность одного из пикселов сверху/снизу/слева/справа > 0
// то текущий пиксел перекрашивается в цвет бордюра linecolor
outline(linecolor);

// заливка всех пикселов с альфа-каналом > alphamin
// цвет может быть полупрозрачным - заливка идет смешением каналов
// т.е. можно выделить объект на картинке полупрозрачным цветом
flooda(overcolorintegeralphamininteger);

// размыть битмап
blur();

// косинус, помноженный на 65535
cos(ainteger): integer;

// синус, помноженный на 65535
sin(ainteger): integer;


// возвращает большее из 2 чисел
max(aintegerbinteger): integer;

// возвращает меньшее из 2 чисел
min(aintegerbinteger): integer;

// возвращает большее из 4 чисел
max4(aintegerbintegercintegerdinteger): integer;

// возвращает меньшее из 4 чисел
min4(aintegerbintegercintegerdinteger): integer;

// поворот битмапа на любой угол
rotate(angleinteger);

// возвращает повернутую картинку,
// при этом текущий битмап не меняется
imgrotate(angleinteger): Image;

// изменить размер картинки
// битмап растягивается без сглаживания
resize(newwintegernewhinteger);

// обрубить битмап, оставив только заданную область
// (можно и увеличить канву)
cut(xintegeryintegerwintegerhinteger);

// нарисовать изображение на текущем битмапе по заданным координатам
// если alphaDraw = _mix (0), то пикселы смешиваются
// иначе пикселы замещаются новыми
drawimage(imgImagexintegeryintegeralphadrawinteger);

// изменить размер канвы
// если a45 = 0, то выравнивание по центру
// если a45 = 1, то выравнивание по правому краю
// если a45 = 2, то выравнивание по правому верхнему углу
// если a45 = 3, то выравнивание по верхнему краю
// если a45 = 4, то выравнивание по левому верхнему углу
// и т.д.
// (a45 - 1) * 45 = угол, по которому ведется выравнивание
canvassize(wintegerhintegera45integerbackcolorinteger);

// сдвиг битмапа на dx точек по горизонтали и dy - по вертикали
scroll(dxintegerdyinteger);

// перекрашиваем rgb битмапа в цвет c, оставляя только прежний альфа-канал
mask(cinteger);

// добавление тени
// тень цвета c создается с учетом альфа канала
shadow(dxintegerdyintegercinteger);

// наклон картинки на 1/8 высоты
// для создания эффекта курсива в шрифтах
italic();

// наложение копии битмапа, сдвинутой на пиксел вправо
// (создает эффет полужирного шрифта)
bold();

// заменить все цвета на 0x00, но с альфа каналом,
// равным среднему арифметическому от каналов RGB
// для создания монохромного шрифта, но со сглаживанием по альфа каналу
// из картинки без прозрачности (черный шрифт на белом фоне,
// но по идее должно работать с любыми картинками)
mono
__________________
to be or not to be - it's not a question!
2b or not 2b = ff
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Rock2roll (31.03.2012)
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +4, время: 12:19.


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com