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 - ввести пороговую интен- сивность и начать постро- ение заново. Любая другая клавиша приведет к изменению всех параметров прог- раммы.
Другие статьи номера:
Похожие статьи:
В этот день... 21 ноября