НАЧИНАЮЩИМ.
Тема этой и нескольких следу-
ющих статей - масштабирование
изображений. Мы рассмотрим ос-
новные методы масштабирования
изображения. Все это будет
рассмотрено на примере уменьше-
ния изображения в два раза.
С появлением на рынке файлов
картинок 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 - ввести пороговую интен-
сивность и начать постро-
ение заново.
Любая другая клавиша приведет к
изменению всех параметров прог-
раммы.