Sinclair Town #01
31 марта 1995

Начинающим - основные методы масштабирования изображения.


           НАЧИНАЮЩИМ.
 
   Тема этой и нескольких следу-
ющих  статей  -  масштабирование
изображений.  Мы  рассмотрим ос-
новные   методы  масштабирования
изображения.   Все   это   будет
рассмотрено  на примере уменьше-
ния изображения в два раза.


   С  появлением на рынке файлов
картинок IBM стандартов, а также
оцифровок   изображений   передо
мной  встала проблема в уменьше-
нии этих картинок до размера эк-
рана.  Она  наиболее  актуальна,
для  владельцев  48  килобайтных
компьютеров,   которым   хочется
посмотреть  на  не  идущие у них
картинки,  а  также художников и
людей  желающих  хорошо оформить
свою программу.
   На дискете вам будет предло-
жен  пример программы, позволяю-
щей  уменьшать файлы с изображе-
нием  имеющие любое расширение в
два раза.
   Программа wesy.asm разрабаты-
валась   с  целью  дать  универ-
сальную  базу для ваших дальней-
ших  собственных  исследований в
этой области.

       ОСНОВНЫЕ  МЕТОДЫ
       МАСШТАБИРОВАНИЯ.

   1) Удаление/добавление лишних
   пикселов;
   2) Усреднение и пороговый ме-
   тод:
    а) Равномерное;
    б) Взвешенное;
   3) Апроксимация полутонами;


    Удаление лишних пикселов.

   Метод  основан  на том факте,
что  некоторое количество пиксе-
лов  в  исходном изображении при
уменьшении  масштаба (далее сжа-
тии изображения) просто не вклю-
чаются  в результирующее изобра-
жение.   Либо,  если  происходит
увеличение  изображения,то какие
то пиксели исходного экрана дуб-
лируются.
   Этот  алгоритм более эффекти-
вен  для  уменьшения изображения
до  1,5 раз,но иногда и уменьше-
ние  в  два  раза имеет неплохой
результат.
   Алгоритм уменьшения в два ра-
за  прост: Берем начальную точку
( к примеру (0,0)) и копируем ее
на  экран по (1,1) , переходим к
следующей точке(2,0),копируем на
(1,0) и т.д. до заполнения экра-
на.
   В программе данный метод реа-
лизован по метке BEIN2.
   Недостатки метода: при удале-
нии половина информации теряется
и попросту игнорируется.


         УСРЕДНЕНИЕ.

   Итак  у  нас  есть  сжимаемое
изображение:  512*384.  Мы хотим
уменьшить его в два раза и полу-
чить дисплейный файл 256*192.
   Мы    видим,    что   каждому
дисплейному пикселю соответству-
ет  4  точки исходного изображе-
ния(2*2).  На  этом  и  основаны
приведенные ниже методы.
   Усреднение бывает двух типов.
   При равномерном усреднении мы
считаем  количество  пикселей  с
цветом   INK.   Сумма  не  будет
больше  4.  Эта сумма называется
интенсивностью  дисплейного пик-
села  I. Если сумма больше 2, то
дисплейный  пиксель  имеет  цвет
INK,  иначе PAPER. Таким образом
определяется цвет в каждой точке
экрана.

Расположение  Отображается
  пиксела     на экране
    A B     I=int((A+B+C+D)/2.5)
    C D
Здесь A,B,C,D-цвет пикселя в со-
ответствующей  точке  сжимаемого
изображения.(INK-1,PAPER-0);

   Можно   получить  лучшие  ре-
зультаты,  если  воспользоваться
методом  взвешенного усреднения.
Этот метод учитывает большее ко-
личество точек(не 4), присваивая
каждой    точке   свой   вес.(см
рис.2). Тогда результирующая ин-
тенсивность будет:
 I_R=1*A+2*B+1*C+2*D+4*E+2*F+
     +1*G+2*H+1*K,где
A,B,C,D,E,F,G,H,K-цвет пикселя в
соответствующей точке сжимаемого
изображения.(INK-1,PAPER-0);

E  - центральный пиксел при ана-
лизе.

   РАСПОЛОЖЕНИЕ     ВЕСА
     пиксела       пиксела
      A B C         1 2 1
      D E F         2 4 2
      G H K         1 2 1
Рис.2. Взвешенное усреднение.

   Вычисленную    результирующую
интенсивность  мы  сравниваем  с
числом 8. Рисуем цветом INK точ-
ку  на экране,если I_R больше 8.
Затем  переходим к следующей ко-
ординате  (  увеличиваем текущие
координаты на 2 по одной из осей
и если нужно по второй). То есть
мы   делаем  центральными  точки
сжимаемого изображения через од-
ну.
   Подпрограмма  взвешенного ус-
реднения   находится   по  метке
BEGIN.

   Чем  отличаются для "Спектру-
ма"  пороговые методы от методов
усреднения  ?  Фактически ничем.
Мы  просто сравниваем полученную
интенсивность дисплейного пиксе-
ла  не с фиксированным числом (2
или  8), a с некоторым пороговым
значением  интенсивности I, вве-
денным с клавиатуры.

       ПРОДОЛЖЕНИЕ СЛЕДУЕТ


;работает CLS(без RESET POINT)
;т.е. нужен CLS перед запуском
;МЕТОД ВЗВЕШИВАНИЯ
START   JR BEGIN
        NOP
;МЕТОД УДАЛЕНИЯ
START2  JP BEIN2
        DEFS 27
;ПОДПРОГРАММА ЗАГРУЗКИ ФАЙЛА С
;ДИСКА
LOADER  JP LOAD
;ИНТЕНСИВНОСТЬ ИЗОБРАЖЕНИЯ
INTENSIVE
        DEFB 5
;ДО КАКОЙ КООРД. ПО X ПЕЧАТАЕМ
;В ПИКСЕЛЯХ СЖИМАЕМОГО ФАЙЛА.
RAZM_X  DEFW 376
;ДО КАКОЙ КООРД. ПО Y ПЕЧАТАЕМ
RAZM_Y  DEFW 270
;КОЛИЧЕСТВО   БАЙТОВ   В  СТРОКЕ
;ИЗОБРАЖЕНИЯ
RAZ_B DEFW 82
;АДРЕС НАЧАЛА СЖИМАЕМОГО ФАЙЛА
NACALO  DEFW 30018
;В КАКОЙ ТОЧКЕ СЖИМАЕМОГО ФАЙЛА
;НАЧИНАЕТ РАБОТАТЬ АЛГОРИТМ
NAC_X   DEFW 0001
NAC_Y   DEFW 0001
;КУДА ЗАГРУЖАЕТСЯ СЖИМАЕМЫЙ ФАЙЛ
LOA_BE  DEFW 30000
;КОНЕЦ ОПИСАНИЯ ДАННЫХ.



;АЛГОРИТМ УРАВНОВЕШИВАНИЯ
BEGIN
        LD DE,(NAC_X)
; X- 0..255
CIKL_I   LD BC,(NAC_Y)
; Y- 0..176
;       обнуляем H.
;В нем образуется результирующая
;интенсивность     анализируемых
;пикселей сжимаемого изображения
CIKL_J  LD H,0
;Сохраняем координаты:
;                  X(DE) и Y(BC)
        PUSH DE
        PUSH BC
;Далее мы анализируем точки сжи-
;маемого изображения в следующем
;порядке:      имеют веса:
;       A B C      1 2 1
;       D E F      2 4 2
;       G H K      1 2 1
;
;***Анализ точки A:
;смещаемся на A
        DEC DE
        DEC BC
;Анализируем  значение  точки по
;данным координатам X(DE)И Y(BC)
;На выходе 0 или 1.
        CALL POINT
;Прибавляем  значение  пикселя к
;результирующей эффективности.
        ADD A,H
        LD H,A
;***Анализ точки B
;смещаемся на B
        INC DE
        CALL POINT
;Значение полученой интенсивнос-
;ти в этой точке изображения ум-
;ножается на 2. См. матрицу.
        SLA A
        ADD A,H
        LD H,A
;***Анализ точки C
        INC DE
        CALL POINT
        ADD A,H
        LD H,A
;***Анализ точки F
        INC BC
        CALL POINT
        SLA A
        ADD A,H
        LD H,A
;***Анализ точки E
        DEC DE
        CALL POINT
        SLA A
        SLA A
        ADD A,H
        LD H,A
;***Анализ точки D
        DEC DE
        CALL POINT
        SLA A
        ADD A,H
        LD H,A
;***Анализ точки G
        INC BC
        CALL POINT
        ADD A,H
        LD H,A
;***Анализ точки H
        INC DE
        CALL POINT
        SLA A
        ADD A,H
        LD H,A
;***Анализ точки K
        INC DE
        CALL POINT
        ADD A,H
        LD H,A
;H=A+C+G+K+2*(D+B+F+H)+4*E
;Определяем координаты вывода
;точки на экран
        DEC DE
        DEC BC
        SRA D
        RR  E
        SRA B
        RR  C
;Сравниваем интенсивность зада-
;ваемую пользователем с расчет-
;ной.
        LD A,(INTENSIVE)
        CP H
        JR NC,NEXT
;Если   INTENSIVE-H<0,то  рисуем
;точку  на  экране. Если нет, то
;обходим подпрограмму рисования.
        CALL SETING
;Вспоминаем старые X и Y
NEXT    POP BC
        POP DE
;Переход к следущему Y и провер-
;ка  на  конец построения верти-
;кальной линии.
        INC BC
        INC BC
        LD HL,(RAZM_Y)
        SBC HL,BC
        JP NC,CIKL_J
;Если нажата какая-нибудь клави-
;ша, то выход из подпрограммы
        BIT 5,(IY+1)
        RET NZ
;Переход к следущему X и провер-
;ка на конец построения экрана.
        INC DE
        INC DE
        LD HL,(RAZM_X)
        SBC HL,DE
        JP NC,CIKL_I
        RET
;***КОНЕЦ ВЕСОВОГО МЕТОДА



;***АЛГОРИТМ УДАЛЕНИЯ
BEIN2
;Загрузка  в  DE  и BC начальных
;значений X и Y.
        LD DE,(NAC_X)
; X- 0..255
C2KL_I   LD BC,(NAC_Y)
; Y- 0..176
C2KL_J
;Запоминание координат X,Y.
        PUSH DE
        PUSH BC
;Обработка точки по координатам.
        CALL POINT
;Отображаем  считаную  точку  на
;экране.
        SRA D
        RR  E
        SRA B
        RR  C
        AND A
        JR Z,NEXT2
        CALL SETING
;Вспоминаем X и Y.
NEXT2   POP BC
        POP DE
        INC BC
        INC BC
;Переход к следующим координатам
        LD HL,(RAZM_Y)
        SBC HL,BC
        JP NC,C2KL_J
        INC DE
        INC DE
        LD HL,(RAZM_X)
        SBC HL,DE
        JP NC,C2KL_I
        RET
;***Конец Удаления.


;***Процедура установки точки
;на экран по координатам:
;BC -Y (верхний левый угол)
;DE -X
SETING  PUSH BC
        PUSH DE
;Рассчитываем адрес пиксела
;и номер бита.
        CALL RASCHET
;Преобразовываем байт маски
        LD B,#0FF
        XOR B
        OR (HL)
        LD (HL),A
        POP DE
        POP BC
        RET
;***Конец   процедуры  установки
;***точки.


;***Процедура  анализа  точки  в
;сжимаемом изображении.
POINT   PUSH BC
        PUSH DE
        PUSH HL
;Получаем  адрес в файле сжимае-
;мого изображения и выделяем
;нужный бит.
        CALL RASHET
        LD B,#0FF
        XOR B
        LD B,A
        LD A,(HL)
        AND B
;Проверяем равен ли нужный бит 0
;Если нет, то засылаем в A=1,
;Иначе в нем остается 0
        JR Z,NEXT_POINT
        LD A,1
NEXT_POINT                  *
;Вспоминаем все регистры.
        POP HL
        POP DE
        POP BC
        RET
;***Конец процедуры анализа.


;***Процедура   расчета   адреса
;знакоместа в сжимаемом файле.
RASHET
;Запоминаем X
        PUSH DE
;В HL адрес первого баита
;изображения.
;Считаем HL=HL+DE/8
        LD HL,(NACALO)
        SRA D
        RR  E
        SRA D
        RR  E
        SRA D
        RR  E
        ADD HL,DE
;Считываем размер одной строки
;изображения.
        LD DE,(RAZ_B)
;HL=HL+DE*BC
SRAD    SRA D
        RR E
        JR NC,NOL
        ADD HL,BC
NOL     SLA C
        RL B
        LD A,D
        OR E
        JR NZ,SRAD
;В HL-АДРЕС. Осталось найти бит.
END1    POP DE
        LD A,E
        AND #7
        INC A
        LD B,A
        LD A,#FE
LOOPA   RRCA
        DJNZ LOOPA
;ТЕПЕРЬ  В  A  будет  0 в нужном
;разряде.
        RET
;***Конец   расчета  адреса  для
;POINT


;*** Рассчет адреса для SETTING
;НА ВЫХОДЕ В (HL)-БАЙТ ПО АДРЕСУ
;В  B 11101111 В СООТВЕТСТВУЮЩЕМ
;РАЗРЯДЕ. Более подробно см.
;"Прикладная графика",Инфорком

RASCHET
        LD A,E
        LD D,A
        LD A,C
        LD E,A
        AND A
        RRA
        SCF
        RRA
        AND A
        RRA
        XOR E
        AND #0F8
        XOR E
        LD H,A
        LD A,D
        RLCA
        RLCA
        RLCA
        XOR E
        AND #C7
        XOR E
        RLCA
        RLCA
        LD L,A
        LD A,D
        AND 7
        LD B,A
        INC B
        LD A,#FE
LOOP    RRCA
        DJNZ LOOP
        RET
;***Конец подпрограммы SETTING


;***Подпрограмма загрузки.
LOAD
;Настраиваем  на  поиск файла по
;имени ( 8 символам).
        LD A,8
        LD (23814),A
;Ищем файл с именем хранимым по
;адресу 23773.
        LD BC,10
        CALL #3D13
;Проверяем наличие файла в ката-
;логе.
        LD A,C
        BIT 7,A
        RET NZ
;Читаем имя файла.
        LD C,8
        CALL #3D13
;Считываем найденный файл
        LD HL,(LOA_BEG)
        LD A,(23786)
        LD DE,(23787)
        LD B,A
        LD C,5
        CALL #3D13
        RET
;***Конец подпрограммы загрузки.


        БЕЙСИК-ПРОГРАММЫ.

   На  диске  находятся  две де-
монстрационные Бейсик программы:
   WesyScr  - для  уменьшения  в
              два раза  экранных
              файлов.
   Scma.02  - для файлов формата
              IMAGE.
   Кодовые блоки данных программ
немного отличаются.
   Чтобы  уменьшить  в  два раза
картинку  в  Scma.02  вам  нужно
знать ее формат. Для этого нужно
посмотреть в "IBM SCREENER" дан-
ный  экран, настроить его клави-
шами  9  и  0, и нажать 1. Далее
вам  выдастся подсказка. Запоми-
наем  из  нее  количество байт в
строке.   Далее  считываем  файл
Scma.02,  картинку  и  на вопрос
"LINE  SIZE?"  вводим это число.
Если  вы  нажмете  "ENTER" будет
взято предыдущее число ( в самом
начале 82).
   Далее  вас спросят о виде ал-
горитма: 0 - весовой метод
         1 - метод удаления
   Введите  интенсивность  и на-
чальный   пиксел  для  обработки
(0-ой или 1-ый по X и Y).
   Если вы хотите вырезать некий
другой   кусок  изображения,  то
исправте  начальный  адрес в 100
строчке.
   После построения ( либо в са-
мом  процессе построения для ве-
сового  метода ) нажатие следую-
щих клавиш приведет к какому-ли-
бо эффекту:
   S - записать текущий экран на
       диск
   E - выйти в БЕЙСИК.
   L - перейти к вводу следущего
       файла.
   I - ввести  пороговую  интен-
       сивность и начать постро-
       ение заново.
 Любая другая клавиша приведет к
изменению  всех параметров прог-
раммы.



Другие статьи номера:

Обращение к читателям - Почему же начали создание этого журнала ?

Музыкалка - Обзор музыкальных демонстраций: Absent, Shock.

Автора ! - Об авторах этого журнала и адвентюрной игры "LENIN".

Старые , добрые... - Разбор игры "GREMLINS".

Миры 128 - О лучших программах для 128-го компьютера. Игра "ROD*LAND 128".

Сериал - Сериал игровых программ.

Сериал - Новелла по адвентюрной 3D игре "TOTAL ECLIPSE part 1".

Ха-хакер - Раздел предназначен для людей имеющих чувство юмора и злоупотребляющим им. "100 анекдотов о Чукче".

Черный ящик - Рубрика , которая будет отвечать на ваши вопросы , а также задавать свои. Разбор писем читателей журнала.

Черный ящик - разбор RPG игры "DRAGON'S OF THE FLAMES".

Черный ящик - разбор игр "BARD'S TALE", "ELITE" и "STRANGER".

Начинающим - основные методы масштабирования изображения.

Экзамен - Tри "простеньких" вопроса.

Реклама - Реклама и обявления.

Архив - О программах существующих для ПК "ZX-SPECTRUM": AMAUROTE, ATIC ATAC, ALIEN HIGHWAY, ACE 2088, RESCATE ATLANTIDA part 1 & 2.


Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
Рек-тайм - Реклама и объявления ...
Министроки - стих "Ты".
CC'000 - Рассказ Random'а (!) о CC'000.

В этот день...   23 января