我有一个项目要在学校的小组中进行,我需要将我在char表中绘制的像素(我打开的图片)复制到同一浏览器中的另一张图片(我打开图片时的代码)创建相同的新图片,然后我需要在单词表图片中圈出一个单词,将绘制的像素复制到复制图片中) 有人知道怎么做吗? 这是我打开图片的代码,让玩家1在桌面照片即游戏地图中圈出单词,如果单词legal和玩家2接受单词,那么转向玩家2,如果没有,我希望代码将游戏地图复制到我保存和创建的其他图片
IDEAL
MODEL small
STACK 100h
DATASEG
color db 2
color2 db 14
message db 'IS The Word Legal?$'
filename db 'open.bmp',0
filehandle dw ?
Header db 54 dup (0)
Palette db 256*4 dup (0)
ScrLine db 320 dup (0)
ErrorMsg db 'Error', 13, 10,'$'
cxval dw ?
dxval dw ?
colorval db ?
filename2 db 'yoav.bmp',0 ;The new file
filehandle2 dw ?
CODESEG
proc OpenFile
; Open file
mov ah, 3Dh
xor al, al
mov dx, offset filename
int 21h
jc openerror
mov [filehandle], ax
ret
openerror:
mov dx, offset ErrorMsg
mov ah, 9h
int 21h
ret
endp OpenFile
proc ReadHeader
; Read BMP file header, 54 bytes
mov ah,3fh
mov bx, [filehandle]
mov cx,54
mov dx,offset Header
int 21h
ret
endp ReadHeader
proc ReadPalette
; Read BMP file color palette, 256 colors * 4 bytes (400h)
mov ah,3fh
mov cx,400h
mov dx,offset Palette
int 21h
ret
endp ReadPalette
proc CopyPal
; Copy the colors palette to the video memory
; The number of the first color should be sent to port 3C8h
; The palette is sent to port 3C9h
mov si,offset Palette
mov cx,256
mov dx,3C8h
mov al,0
; Copy starting color to port 3C8h
out dx,al
; Copy palette itself to port 3C9h
inc dx
PalLoop:
; Note: Colors in a BMP file are saved as BGR values rather than RGB.
mov al,[si+2] ; Get red value.
shr al,2 ; Max. is 255, but video palette maximal
; value is 63. Therefore dividing by 4.
out dx,al ; Send it.
mov al,[si+1] ; Get green value.
shr al,2
out dx,al ; Send it.
mov al,[si] ; Get blue value.
shr al,2
out dx,al ; Send it.
add si,4 ; Point to next color.
; (There is a null chr. after every color.)
loop PalLoop
ret
endp CopyPal
proc OpenOutputFile
; Open the output file
mov ah, 3Dh
mov al, 2h
mov dx, offset filename2
int 21h
jc openerror3
mov [filehandle2], ax
ret
openerror3:
mov dx, offset ErrorMsg
mov ah, 9h
int 21h
jmp exit
ret
endp OpenOutputFile
proc CreateAndOpenOutputFile
; Create file
mov ah, 3Ch
mov cx, 0
mov dx, offset filename2
int 21h
jc openerror2
call OpenOutputFile
ret
openerror2:
mov dx, offset ErrorMsg
mov ah, 9h
int 21h
jmp exit
ret
endp CreateAndOpenOutputFile
proc WriteOutputFileHeader
; Write BMP file header, 54 bytes into the output file
mov ah,40h
mov bx, [filehandle2]
mov cx, 54
mov dx,offset Header
int 21h
ret
endp WriteOutputFileHeader
proc WriteOutputFilePalette
; Write BMP file color palette, 256 colors * 4 bytes (400h) into the output file
mov ah,40h
mov bx, [filehandle2]
mov cx, 400h
mov dx,offset Palette
int 21h
ret
endp WriteOutputFilePalette
proc CopyInputFileBitmap
; BMP graphics are saved upside-down.
; Read the graphic line by line (200 lines in VGA format),
; displaying the lines from bottom to top.
mov ax, 0A000h
mov es, ax
mov cx,200
PrintBMPLoop:
push cx
; di = cx*320, point to the correct screen line
mov di,cx
shl cx,6
shl di,8
add di,cx
; Read one line
mov ah,3fh
mov bx, [filehandle]
mov cx,320
mov dx,offset ScrLine
int 21h
Change:
;copy the data into the output file
mov ah, 40h
mov bx, [filehandle2]
mov cx, 320
mov dx, offset ScrLine
int 21h
loadImage:
; Copy one line into video memory
cld ; Clear direction flag, for movsb
mov cx,320
mov si,offset ScrLine
rep movsb ; Copy line to the screen
;rep movsb is same as the following code:
;mov es:di, ds:si
;inc si
;inc di
;dec cx
;loop until cx=0
pop cx
loop PrintBMPLoop
ret
endp CopyInputFileBitmap
proc CloseInputFile
; Close the input file
mov ah,3Eh
mov bx, [filehandle]
int 21h
ret
endp CloseInputFile
proc CloseOutputFile
; Close the output file
mov ah,3Eh
mov bx, [filehandle2]
int 21h
ret
endp CloseOutputFile
start:
mov ax, @data
mov ds, ax
; Graphic mode
mov ax, 13h
int 10h
; Process BMP file
call OpenFile
call ReadHeader
call ReadPalette
call CopyPal
call CreateAndOpenOutputFile
call WriteOutputFileHeader
call WriteOutputFilePalette
call CopyInputFileBitmap
call CloseInputFile
call CloseOutputFile
jmp Mouse
MessagePrint2:
mov dx, offset message
mov ah, 9
int 21h
mov dl,10
mov ah, 2
int 21h
mov ah, 1
int 21h
xor cx, cx
mov cl, 79h
cmp cl,al
je MouseLp
mov cl, 6Eh
cmp cl, al
je NextTurn
Mouse:
mov ax, 0h
int 33h
mov ax, 1h
int 33h
MouseLp:
mov ax, 3h
int 33h
cmp bx, 01h
jne MouseLp
Draw:
shr cx, 1
sub dx, 1
mov bh, 0h
mov al,[color]
mov ah, 0Ch
int 10h
mov ax, 3h
int 33h
cmp bx, 01h
je Draw
jmp MessagePrint
MessagePrint:
mov dx, offset message
mov ah, 9
int 21h
mov dl,10
mov ah, 2
int 21h
mov ah, 1
int 21h
xor cx, cx
mov cl, 79h
cmp cl,al
je NextTurn
mov cl, 6Eh
cmp cl, al
jne go
go:
jmp MouseLp
NextTurn:
mov ax, 0h
int 33h
mov ax, 1h
int 33h
MouseLpA:
mov ax, 3h
int 33h
cmp bx, 01h
jne MouseLpA
DrawA:
shr cx, 1
sub dx, 1
mov bh, 0h
mov al,[color2]
mov ah, 0Ch
int 10h
mov ax, 3h
int 33h
cmp bx, 01h
je DrawA
jmp MessagePrint2
exit:
mov ax, 4c00h
int 21h
END start
答案 0 :(得分:1)
您的问题不明确(最好重新说出来),但查看您的代码会发现以下问题:
proc CreateAndOpenOutputFile ; Create file mov ah, 3Ch mov cx, 0 mov dx, offset filename2 int 21h jc openerror2 call OpenOutputFile ret
创建文件时,它也会打开,这意味着您将获得一个句柄。您的代码中不需要call OpenOutputFile
。 DOS自动打开具有正常读写权限的文件。保存句柄:mov [filehandle2], ax
mov cx,200 PrintBMPLoop: push cx ; di = cx*320, point to the correct screen line mov di,cx shl cx,6 shl di,8 add di,cx
这将在 PrintBMPLoop 的第一次迭代中将指向 320x200屏幕下方!在使用之前,您需要从DI
中减去320。或者,在计算开始时使用dec cx
:
push cx
dec cx
mov di, cx
shl cx, 6
shl di, 8
add di, cx
我没有深入研究您的计划的互动部分,因为这个问题并没有暗示问题是什么。