将光标像素绘画从1张图片复制到另一张图片

时间:2016-06-19 08:32:06

标签: assembly

我有一个项目要在学校的小组中进行,我需要将我在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

1 个答案:

答案 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

我没有深入研究您的计划的互动部分,因为这个问题并没有暗示问题是什么。