8086 MASM图形编程:如何放大字母'D'且避免变形
8086 MASM图形编程:字母'D'放大变形问题解决思路
问题根源
你的代码核心问题在于:
- 当前
Hert数组是6行×9列的点阵数据,仅对应6×9像素的小字符,直接调整坐标范围但未匹配点阵尺寸,会导致数组读取越界或绘制错位,引发变形。 - 原
draw过程是逐像素1:1映射,无缩放逻辑,单纯扩大坐标区间会出现大量无数据填充的空白像素,破坏字符形状。
解决方案1:直接定义高分辨率点阵
重新构建放大后的字符点阵(比如将原6×9放大为12×18),每个原像素重复2次,确保点阵尺寸与绘制坐标范围完全匹配:
.model small .stack 0100h .data ; 12行×18列的放大版'D'点阵(原尺寸2倍) Hert db 04,04,04,04,04,04,04,04,00,00,00,00,00,00,00,00,00,00 db 04,04,00,00,00,00,00,04,04,00,00,00,00,00,00,00,00,00 db 04,04,00,00,00,00,00,04,04,00,00,00,00,00,00,00,00,00 db 04,04,00,00,00,00,00,04,04,00,00,00,00,00,00,00,00,00 db 04,04,00,00,00,00,00,04,04,00,00,00,00,00,00,00,00,00 db 04,04,00,00,00,00,00,04,04,00,00,00,00,00,00,00,00,00 db 04,04,00,00,00,00,00,04,04,00,00,00,00,00,00,00,00,00 db 04,04,00,00,00,00,00,04,04,00,00,00,00,00,00,00,00,00 db 04,04,00,00,00,00,00,04,04,00,00,00,00,00,00,00,00,00 db 04,04,00,00,00,00,00,04,04,00,00,00,00,00,00,00,00,00 db 04,04,04,04,04,04,04,04,00,00,00,00,00,00,00,00,00,00 db 04,04,04,04,04,04,04,04,00,00,00,00,00,00,00,00,00,00 xi dw 0 xf dw 0 yi dw 0 yf dw 0 .code main proc mov ax, @data mov ds, ax ; 设置320x200 256色模式 mov al, 13h mov ah, 00h int 10H ; 坐标对应12行×18列的点阵 mov si, offset Hert mov yi, 30 mov yf, 42 ; 30+12=42 mov xi, 30 mov xf, 48 ; 30+18=48 call draw mov ah, 04ch int 21h main endp draw proc mov ah, 0ch ; 像素绘制功能 mov dx, yi ; 起始Y坐标 y_loop: mov cx, xi ; 起始X坐标 x_loop: mov al, [si] ; 取颜色值 int 10h ; 画像素 inc si inc cx cmp cx, xf jb x_loop inc dx cmp dx, yf jb y_loop ret draw endp end
解决方案2:实现像素块缩放(复用原点阵)
不需要修改原Hert数组,修改draw过程,让每个原点阵像素对应屏幕上N×N的像素块(比如N=2,放大2倍),这样可以灵活调整缩放比例:
.model small .stack 0100h .data Hert db 04,04,04,04,00,00,00,00,00 ; 原6行×9列点阵 db 04,00,00,00,04,00,00,00,00 db 04,00,00,00,04,00,00,00,00 db 04,00,00,00,04,00,00,00,00 db 04,00,00,00,04,00,00,00,00 db 04,04,04,04,00,00,00,00,00 xi dw 0 xf dw 0 yi dw 0 yf dw 0 scale equ 2 ; 缩放因子,设为2表示放大2倍 .code main proc mov ax, @data mov ds, ax mov al, 13h mov ah, 00h int 10H ; 计算缩放后的坐标范围:原6行×scale=12行,原9列×scale=18列 mov si, offset Hert mov yi, 30 mov yf, 30 + 6*scale mov xi, 30 mov xf, 30 + 9*scale call draw_scaled mov ah, 04ch int 21h main endp ; 带缩放的绘制过程 draw_scaled proc mov ah, 0ch mov dx, yi ; 起始Y坐标 y_row: mov cx, xi ; 起始X坐标 mov di, si ; 保存当前点阵行的起始地址 x_col: mov al, [di] ; 取当前点阵像素颜色 ; 绘制scale×scale的像素块 mov bx, scale block_y: mov cx, xi + (di - si)*scale ; 计算块的起始X push dx block_x: int 10h inc cx dec bx jnz block_x pop dx inc dx mov bx, scale dec bx jnz block_y ; 移动到下一个点阵像素 inc di cmp di, si + 9 ; 检查是否到当前行末尾(原行9列) jb x_col ; 移动到下一个点阵行 add si, 9 add dx, scale - 1 ; 跳过已绘制的scale行 cmp dx, yf jb y_row ret draw_scaled endp end
内容的提问来源于stack exchange,提问作者vintage12
相关产品推荐
相关产品推荐

