Адрес: ул. Б. Очаковская 32 Москва Россия
Наши официальные канал и чат в telegram, группа в ВКонтакте

Эффект размытия (Box Blur) на yabasic: работа с пикселями и обход багов Linux

Реализация эффекта размытия на yabasic. Работа с массивами пикселей, оптимизация и обход проблем со шрифтами в Linux

Скачать бесплатные программы для Yabasic на Windows, Linux, MacOS, PlayStation 2
Аватара пользователя
Anton
Site Admin
Сообщения: 261
Зарегистрирован: Чт фев 08, 2024 7:03 pm
Откуда: Москва

Тема касается GNU\Linux Эффект размытия (Box Blur) на yabasic: работа с пикселями и обход багов Linux

Сообщение Anton »

Эффект размытия (Box Blur) на yabasic: работа с пикселями и обход багов Linux
Нашёл старый пример эффекта размытия. При адаптации под Linux всплыли две проблемы: yabasic не умеет масштабировать шрифты (вместо огромной буквы рисует 10-пиксельную), а чтение экрана через getbit$ занимает минуты.

Решение:
  • Рисуем букву «B» вручную через fill rectangle и сразу заносим пиксели в массив (без чтения экрана).
  • Используем двойной буфер (p и p_new), чтобы размытие шло ровно во все стороны.
  • Добавили clear screen для работы inkey$ (выход по Esc).
Листинг кода:

Код: Выделить всё

width = 250 : height = 250
open window width, height
clear screen
backcolor 255,255,255
clear window
color 0,0,0

dim p(width, height), p_new(width, height)

for x = 0 to width-1
    for y = 0 to height-1
        p(x,y) = 255
    next y
next x

sub draw_block(x1, y1, x2, y2)
    fill rectangle x1, y1, x2, y2
    for x = x1 to x2
        for y = y1 to y2
            p(x,y) = 0
        next y
    next x
end sub

// Рисуем букву "B"
draw_block(40, 30, 70, 220)
draw_block(70, 30, 140, 60)
draw_block(140, 30, 170, 90)
draw_block(140, 90, 170, 120)
draw_block(70, 120, 140, 150)
draw_block(70, 150, 160, 180)
draw_block(160, 150, 190, 200)
draw_block(160, 200, 190, 220)
draw_block(70, 220, 160, 240)

do
    for x = 1 to width-2
        for y = 1 to height-2
            c = 0
            c = c + p(x-1,y-1) + p(x,y-1) + p(x+1,y-1)
            c = c + p(x-1,y)   + p(x,y)   + p(x+1,y)
            c = c + p(x-1,y+1) + p(x,y+1) + p(x+1,y+1)
            c = c / 9
            p_new(x,y) = c
            
            color c, c, c
            dot x, y
        next y
    next x

    for x = 1 to width-2
        for y = 1 to height-2
            p(x,y) = p_new(x,y)
        next y
    next x

    pause 0.01 
    
    k$ = inkey$(0.001)
    if k$ = "esc" or k$ = chr$(27) then
        break
    end if
loop

close window
end
У вас нет необходимых прав для просмотра вложений в этом сообщении.