验证码
建立font.asp 文件
<%
Dim Font
Dim Letter(30)
Set Font = Server.CreateObject("Scripting.Dictionary")
Letter(0) = "00000000000000"
Letter(1) = "00000000000000"
Letter(2) = "00000000000000"
Letter(3) = "00000000000000"
Letter(4) = "00000000000000"
Letter(5) = "00000000000000"
Letter(6) = "00000000000000"
Letter(7) = "00000000000000"
Letter(8) = "00011000000000"
Letter(9) = "00011110000000"
Letter(10) = "00001111000000"
Letter(11) = "00011111000000"
Letter(12) = "00011011100000"
Letter(13) = "00111001100000"
Letter(14) = "00110001111111"
Letter(15) = "00111111111110"
Letter(16) = "11111111110000"
Letter(17) = "11100000110000"
Letter(18) = "01100000110000"
Letter(19) = "01100000110000"
Letter(20) = "01100000110000"
Letter(21) = "01100000010000"
Letter(22) = "00000000000000"
Letter(23) = "00000000000000"
Letter(24) = "00000000000000"
Letter(25) = "00000000000000"
Letter(26) = "00000000000000"
Letter(27) = "00000000000000"
Letter(28) = "00000000000000"
Letter(29) = "00000000000000"
Font.Add "A", Letter
Letter(0) = "0000000000000"
Letter(1) = "0000000000000"
Letter(2) = "0000000000000"
Letter(3) = "0000000000000"
Letter(4) = "0000000000000"
Letter(5) = "0000000000000"
Letter(6) = "0000000000000"
Letter(7) = "0000000000000"
Letter(8) = "0000000000000"
Letter(9) = "1100000000000"
Letter(10) = "1100111100000"
Letter(11) = "0111111111000"
Letter(12) = "1111000011000"
Letter(13) = "1110000011000"
Letter(14) = "0011000111000"
Letter(15) = "0011111110000"
Letter(16) = "0111111111100"
Letter(17) = "0111111111111"
Letter(18) = "0111000000011"
Letter(19) = "0111000000011"
Letter(20) = "0111100000111"
Letter(21) = "0111111111110"
Letter(22) = "0110011111000"
Letter(23) = "0000000000000"
Letter(24) = "0000000000000"
Letter(25) = "0000000000000"
Letter(26) = "0000000000000"
Letter(27) = "0000000000000"
Letter(28) = "0000000000000"
Letter(29) = "0000000000000"
Font.Add "B", Letter
Letter(0) = "00000000000"
Letter(1) = "00000000000"
Letter(2) = "00000000000"
Letter(3) = "00000000000"
Letter(4) = "00000000000"
Letter(5) = "00000000000"
Letter(6) = "00000000000"
Letter(7) = "00000000000"
Letter(8) = "00000000000"
Letter(9) = "00001111100"
Letter(10) = "00111111100"
Letter(11) = "01110000000"
Letter(12) = "11100000000"
Letter(13) = "11000000000"
Letter(14) = "11000000000"
Letter(15) = "11000000000"
Letter(16) = "11000000000"
Letter(17) = "11000000000"
Letter(18) = "11000000000"
Letter(19) = "01100000011"
Letter(20) = "01110000110"
Letter(21) = "00111111110"
Letter(22) = "00011111000"
Letter(23) = "00000000000"
Letter(24) = "00000000000"
Letter(25) = "00000000000"
Letter(26) = "00000000000"
Letter(27) = "00000000000"
Letter(28) = "00000000000"
Letter(29) = "00000000000"
Font.Add "C", Letter
Letter(0) = "0000000000000"
Letter(1) = "0000000000000"
Letter(2) = "0000000000000"
Letter(3) = "0000000000000"
Letter(4) = "0000000000000"
Letter(5) = "0000000000000"
Letter(6) = "0000000000000"
Letter(7) = "0000000000000"
Letter(8) = "0110000000000"
Letter(9) = "0110000000000"
Letter(10) = "0111111100000"
Letter(11) = "1111111111000"
Letter(12) = "1111000011100"
Letter(13) = "0011000001100"
Letter(14) = "0011000000110"
Letter(15) = "0011000000110"
Letter(16) = "0011000000110"
Letter(17) = "0011000000110"
Letter(18) = "0011000000110"
Letter(19) = "0111000011100"
Letter(20) = "0111111111000"
Letter(21) = "0111111110000"
Letter(22) = "0110000000000"
Letter(23) = "0000000000000"
Letter(24) = "0000000000000"
Letter(25) = "0000000000000"
Letter(26) = "0000000000000"
Letter(27) = "0000000000000"
Letter(28) = "0000000000000"
Letter(29) = "0000000000000"
Font.Add "D", Letter
Letter(0) = "00000000000"
Letter(1) = "00000000000"
Letter(2) = "00000000000"
Letter(3) = "00000000000"
Letter(4) = "00000000000"
Letter(5) = "00000000000"
Letter(6) = "00000000000"
Letter(7) = "00000000000"
Letter(8) = "00000000000"
Letter(9) = "11000000000"
Letter(10) = "11100000000"
Letter(11) = "01111111110"
Letter(12) = "11111111100"
Letter(13) = "11110000000"
Letter(14) = "00110000000"
Letter(15) = "00110000000"
Letter(16) = "00111111100"
Letter(17) = "00111111100"
Letter(18) = "00110000000"
Letter(19) = "11110000000"
Letter(20) = "11111111110"
Letter(21) = "01111111110"
Letter(22) = "01100000000"
Letter(23) = "00000000000"
Letter(24) = "00000000000"
Letter(25) = "00000000000"
Letter(26) = "00000000000"
Letter(27) = "00000000000"
Letter(28) = "00000000000"
Letter(29) = "00000000000"
Font.Add "E", Letter
Letter(0) = "00000000000"
Letter(1) = "00000000000"
Letter(2) = "00000000000"
Letter(3) = "00000000000"
Letter(4) = "00000000000"
Letter(5) = "00000000000"
Letter(6) = "00000000000"
Letter(7) = "00000000000"
Letter(8) = "00000000000"
Letter(9) = "01100111110"
Letter(10) = "01111111111"
Letter(11) = "01111000011"
Letter(12) = "11100000000"
Letter(13) = "11100000000"
Letter(14) = "00100000000"
Letter(15) = "00100000000"
Letter(16) = "00111111000"
Letter(17) = "00111111000"
Letter(18) = "00111000000"
Letter(19) = "00110000000"
Letter(20) = "00110000000"
Letter(21) = "00110000000"
Letter(22) = "00110000000"
Letter(23) = "00000000000"
Letter(24) = "00000000000"
Letter(25) = "00000000000"
Letter(26) = "00000000000"
Letter(27) = "00000000000"
Letter(28) = "00000000000"
Letter(29) = "00000000000"
Font.Add "F", Letter
Letter(0) = "0000000000000"
Letter(1) = "0000000000000"
Letter(2) = "0000000000000"
Letter(3) = "0000000000000"
Letter(4) = "0000000000000"
Letter(5) = "0000000000000"
Letter(6) = "0000000000000"
Letter(7) = "0000000000000"
Letter(8) = "0000000000000"
Letter(9) = "0011000000000"
Letter(10) = "0011111111000"
Letter(11) = "0111111111000"
Letter(12) = "1110000000000"
Letter(13) = "1110000000000"
Letter(14) = "0110000000000"
Letter(15) = "0110000011000"
Letter(16) = "0110001111111"
Letter(17) = "0110001111110"
Letter(18) = "0110000011000"
Letter(19) = "0110000011000"
Letter(20) = "0111111111000"
Letter(21) = "0111111111000"
Letter(22) = "0011000011000"
Letter(23) = "0000000000000"
Letter(24) = "0000000000000"
Letter(25) = "0000000000000"
Letter(26) = "0000000000000"
Letter(27) = "0000000000000"
Letter(28) = "0000000000000"
Letter(29) = "0000000000000"
Font.Add "G", Letter
Letter(0) = "00000000000"
Letter(1) = "00000000000"
Letter(2) = "00000000000"
Letter(3) = "00000000000"
Letter(4) = "00000000000"
Letter(5) = "00000000000"
Letter(6) = "00000000000"
Letter(7) = "00000000000"
Letter(8) = "00000000100"
Letter(9) = "01100001100"
Letter(10) = "01100001100"
Letter(11) = "01100001100"
Letter(12) = "01110001100"
Letter(13) = "00110011000"
Letter(14) = "00110011000"
Letter(15) = "00111111000"
Letter(16) = "00111111000"
Letter(17) = "00110011000"
Letter(18) = "00110011000"
Letter(19) = "00110001100"
Letter(20) = "00110001110"
Letter(21) = "01110000110"
Letter(22) = "01100000010"
Letter(23) = "00000000000"
Letter(24) = "00000000000"
Letter(25) = "00000000000"
Letter(26) = "00000000000"
Letter(27) = "00000000000"
Letter(28) = "00000000000"
Letter(29) = "00000000000"
Font.Add "H", Letter
Letter(0) = "0000000000"
Letter(1) = "0000000000"
Letter(2) = "0000000000"
Letter(3) = "0000000000"
Letter(4) = "0000000000"
Letter(5) = "0000000000"
Letter(6) = "0000000000"
Letter(7) = "0000000000"
Letter(8) = "0000000000"
Letter(9) = "0000110000"
Letter(10) = "0110110110"
Letter(11) = "0111111110"
Letter(12) = "0001111000"
Letter(13) = "0001110000"
Letter(14) = "0001100000"
Letter(15) = "0001100000"
Letter(16) = "0001100000"
Letter(17) = "0001100000"
Letter(18) = "0001100000"
Letter(19) = "0001100000"
Letter(20) = "0111111000"
Letter(21) = "1111111110"
Letter(22) = "1100000100"
Letter(23) = "0000000000"
Letter(24) = "0000000000"
Letter(25) = "0000000000"
Letter(26) = "0000000000"
Letter(27) = "0000000000"
Letter(28) = "0000000000"
Letter(29) = "0000000000"
Font.Add "I", Letter
Letter(0) = "0000000000000"
Letter(1) = "0000000000000"
Letter(2) = "0000000000000"
Letter(3) = "0000000000000"
Letter(4) = "0000000000000"
Letter(5) = "0000000000000"
Letter(6) = "0000000000000"
Letter(7) = "0000000000000"
Letter(8) = "0000000110000"
Letter(9) = "0000111111110"
Letter(10) = "0000111111110"
Letter(11) = "0000000011000"
Letter(12) = "0000000011000"
Letter(13) = "0000000011000"
Letter(14) = "0000000011000"
Letter(15) = "1111100011000"
Letter(16) = "1111110011000"
Letter(17) = "0011000011000"
Letter(18) = "0011000011000"
Letter(19) = "0011000111000"
Letter(20) = "0001100110000"
Letter(21) = "0001111110000"
Letter(22) = "0000111100000"
Letter(23) = "0000000000000"
Letter(24) = "0000000000000"
Letter(25) = "0000000000000"
Letter(26) = "0000000000000"
Letter(27) = "0000000000000"
Letter(28) = "0000000000000"
Letter(29) = "0000000000000"
Font.Add "J", Letter
Letter(0) = "00000000000"
Letter(1) = "00000000000"
Letter(2) = "00000000000"
Letter(3) = "00000000000"
Letter(4) = "00000000000"
Letter(5) = "00000000000"
Letter(6) = "00000000000"
Letter(7) = "00000000000"
Letter(8) = "00000000000"
Letter(9) = "01100000100"
Letter(10) = "01100000110"
Letter(11) = "01100000110"
Letter(12) = "01100000110"
Letter(13) = "01100000110"
Letter(14) = "01100000110"
Letter(15) = "11111100110"
Letter(16) = "11111111110"
Letter(17) = "00110011100"
Letter(18) = "00110111110"
Letter(19) = "00110000110"
Letter(20) = "01110000110"
Letter(21) = "01100000110"
Letter(22) = "00000000000"
Letter(23) = "00000000000"
Letter(24) = "00000000000"
Letter(25) = "00000000000"
Letter(26) = "00000000000"
Letter(27) = "00000000000"
Letter(28) = "00000000000"
Letter(29) = "00000000000"
Font.Add "K", Letter
Letter(0) = "000000000000"
Letter(1) = "000000000000"
Letter(2) = "000000000000"
Letter(3) = "000000000000"
Letter(4) = "000000000000"
Letter(5) = "000000000000"
Letter(6) = "000000000000"
Letter(7) = "000000000000"
Letter(8) = "011000000000"
Letter(9) = "011000000000"
Letter(10) = "011000000000"
Letter(11) = "011000000000"
Letter(12) = "011100000000"
Letter(13) = "001100000000"
Letter(14) = "001100000000"
Letter(15) = "001100000000"
Letter(16) = "001100000000"
Letter(17) = "001100000000"
Letter(18) = "111100000000"
Letter(19) = "111110000000"
Letter(20) = "011111111110"
Letter(21) = "011111111100"
Letter(22) = "011000000000"
Letter(23) = "000000000000"
Letter(24) = "000000000000"
Letter(25) = "000000000000"
Letter(26) = "000000000000"
Letter(27) = "000000000000"
Letter(28) = "000000000000"
Letter(29) = "000000000000"
Font.Add "L", Letter
Letter(0) = "00000000000000"
Letter(1) = "00000000000000"
Letter(2) = "00000000000000"
Letter(3) = "00000000000000"
Letter(4) = "00000000000000"
Letter(5) = "00000000000000"
Letter(6) = "00000000000000"
Letter(7) = "00000000000000"
Letter(8) = "00000000000000"
Letter(9) = "01100000000000"
Letter(10) = "01100000110000"
Letter(11) = "11111000110000"
Letter(12) = "11111100111110"
Letter(13) = "01101111111110"
Letter(14) = "01100111011000"
Letter(15) = "01100110011000"
Letter(16) = "01100000011000"
Letter(17) = "01100000011000"
Letter(18) = "01100000011000"
Letter(19) = "01100000011000"
Letter(20) = "01100000010000"
Letter(21) = "01100000110000"
Letter(22) = "00000000100000"
Letter(23) = "00000000000000"
Letter(24) = "00000000000000"
Letter(25) = "00000000000000"
Letter(26) = "00000000000000"
Letter(27) = "00000000000000"
Letter(28) = "00000000000000"
Letter(29) = "00000000000000"
Font.Add "M", Letter
Letter(0) = "000000000"
Letter(1) = "000000000"
Letter(2) = "000000000"
Letter(3) = "000000000"
Letter(4) = "000000000"
Letter(5) = "000000000"
Letter(6) = "000000000"
Letter(7) = "000000000"
Letter(8) = "000000000"
Letter(9) = "000001100"
Letter(10) = "110001100"
Letter(11) = "111000110"
Letter(12) = "111000110"
Letter(13) = "111100110"
Letter(14) = "111100110"
Letter(15) = "111100110"
Letter(16) = "110110110"
Letter(17) = "110110110"
Letter(18) = "110111100"
Letter(19) = "110111100"
Letter(20) = "110011100"
Letter(21) = "110011000"
Letter(22) = "000011000"
Letter(23) = "000000000"
Letter(24) = "000000000"
Letter(25) = "000000000"
Letter(26) = "000000000"
Letter(27) = "000000000"
Letter(28) = "000000000"
Letter(29) = "000000000"
Font.Add "N", Letter
Letter(0) = "0000000000"
Letter(1) = "0000000000"
Letter(2) = "0000000000"
Letter(3) = "0000000000"
Letter(4) = "0000000000"
Letter(5) = "0000000000"
Letter(6) = "0000000000"
Letter(7) = "0000000000"
Letter(8) = "0000000000"
Letter(9) = "0000000000"
Letter(10) = "0000011000"
Letter(11) = "0001111100"
Letter(12) = "0110001110"
Letter(13) = "0100000110"
Letter(14) = "1100000011"
Letter(15) = "1100000011"
Letter(16) = "1100000011"
Letter(17) = "1100000011"
Letter(18) = "1110000011"
Letter(19) = "0110000011"
Letter(20) = "0011100110"
Letter(21) = "0011111110"
Letter(22) = "0000111100"
Letter(23) = "0000000000"
Letter(24) = "0000000000"
Letter(25) = "0000000000"
Letter(26) = "0000000000"
Letter(27) = "0000000000"
Letter(28) = "0000000000"
Letter(29) = "0000000000"
Font.Add "O", Letter
Letter(0) = "000000000"
Letter(1) = "000000000"
Letter(2) = "000000000"
Letter(3) = "000000000"
Letter(4) = "000000000"
Letter(5) = "000000000"
Letter(6) = "000000000"
Letter(7) = "000000000"
Letter(8) = "000000000"
Letter(9) = "011000000"
Letter(10) = "011111110"
Letter(11) = "111111110"
Letter(12) = "111000011"
Letter(13) = "001100011"
Letter(14) = "001100011"
Letter(15) = "011100111"
Letter(16) = "011111110"
Letter(17) = "001111000"
Letter(18) = "001100000"
Letter(19) = "001100000"
Letter(20) = "011100000"
Letter(21) = "011000000"
Letter(22) = "000000000"
Letter(23) = "000000000"
Letter(24) = "000000000"
Letter(25) = "000000000"
Letter(26) = "000000000"
Letter(27) = "000000000"
Letter(28) = "000000000"
Letter(29) = "000000000"
Font.Add "P", Letter
Letter(0) = "0000000000"
Letter(1) = "0000000000"
Letter(2) = "0000000000"
Letter(3) = "0000000000"
Letter(4) = "0000000000"
Letter(5) = "0000000000"
Letter(6) = "0000000000"
Letter(7) = "0000000000"
Letter(8) = "0000000000"
Letter(9) = "0000000000"
Letter(10) = "0001111000"
Letter(11) = "0111111100"
Letter(12) = "0111001110"
Letter(13) = "1100000110"
Letter(14) = "1100000011"
Letter(15) = "1100000011"
Letter(16) = "1100000011"
Letter(17) = "1100011011"
Letter(18) = "0110011011"
Letter(19) = "0111001111"
Letter(20) = "0011111110"
Letter(21) = "0001111110"
Letter(22) = "0000000110"
Letter(23) = "0000000010"
Letter(24) = "0000000000"
Letter(25) = "0000000000"
Letter(26) = "0000000000"
Letter(27) = "0000000000"
Letter(28) = "0000000000"
Letter(29) = "0000000000"
Font.Add "Q", Letter
Letter(0) = "00000000000"
Letter(1) = "00000000000"
Letter(2) = "00000000000"
Letter(3) = "00000000000"
Letter(4) = "00000000000"
Letter(5) = "00000000000"
Letter(6) = "00000000000"
Letter(7) = "00000000000"
Letter(8) = "00000000000"
Letter(9) = "01100000000"
Letter(10) = "01100000000"
Letter(11) = "01111111100"
Letter(12) = "11111111110"
Letter(13) = "11110000110"
Letter(14) = "00110000110"
Letter(15) = "00110011110"
Letter(16) = "00111111100"
Letter(17) = "01111100000"
Letter(18) = "01111110000"
Letter(19) = "00011111100"
Letter(20) = "00110011110"
Letter(21) = "00110000110"
Letter(22) = "00100000110"
Letter(23) = "00000000000"
Letter(24) = "00000000000"
Letter(25) = "00000000000"
Letter(26) = "00000000000"
Letter(27) = "00000000000"
Letter(28) = "00000000000"
Letter(29) = "00000000000"
Font.Add "R", Letter
Letter(0) = "000000000"
Letter(1) = "000000000"
Letter(2) = "000000000"
Letter(3) = "000000000"
Letter(4) = "000000000"
Letter(5) = "000000000"
Letter(6) = "000000000"
Letter(7) = "000000000"
Letter(8) = "000000000"
Letter(9) = "000000000"
Letter(10) = "001110000"
Letter(11) = "011111000"
Letter(12) = "111011000"
Letter(13) = "110011000"
Letter(14) = "110001110"
Letter(15) = "111111111"
Letter(16) = "011110011"
Letter(17) = "010000011"
Letter(18) = "110000011"
Letter(19) = "110000011"
Letter(20) = "111000111"
Letter(21) = "011111110"
Letter(22) = "000111100"
Letter(23) = "000000000"
Letter(24) = "000000000"
Letter(25) = "000000000"
Letter(26) = "000000000"
Letter(27) = "000000000"
Letter(28) = "000000000"
Letter(29) = "000000000"
Font.Add "S", Letter
Letter(0) = "000000000000"
Letter(1) = "000000000000"
Letter(2) = "000000000000"
Letter(3) = "000000000000"
Letter(4) = "000000000000"
Letter(5) = "000000000000"
Letter(6) = "000000000000"
Letter(7) = "000000000000"
Letter(8) = "000000000000"
Letter(9) = "000000000000"
Letter(10) = "000000000000"
Letter(11) = "000000000000"
Letter(12) = "011111111111"
Letter(13) = "111111111111"
Letter(14) = "110001100000"
Letter(15) = "000001100000"
Letter(16) = "000001100000"
Letter(17) = "000001100000"
Letter(18) = "000001100000"
Letter(19) = "000001100000"
Letter(20) = "000001100000"
Letter(21) = "000001100000"
Letter(22) = "000000000000"
Letter(23) = "000000000000"
Letter(24) = "000000000000"
Letter(25) = "000000000000"
Letter(26) = "000000000000"
Letter(27) = "000000000000"
Letter(28) = "000000000000"
Letter(29) = "000000000000"
Font.Add "T", Letter
Letter(0) = "00000000000"
Letter(1) = "00000000000"
Letter(2) = "00000000000"
Letter(3) = "00000000000"
Letter(4) = "00000000000"
Letter(5) = "00000000000"
Letter(6) = "00000000000"
Letter(7) = "00000000000"
Letter(8) = "00000000000"
Letter(9) = "00000001100"
Letter(10) = "00110001100"
Letter(11) = "00110001100"
Letter(12) = "00110001100"
Letter(13) = "01100011000"
Letter(14) = "01100011000"
Letter(15) = "01100011000"
Letter(16) = "01100011000"
Letter(17) = "01100011000"
Letter(18) = "01100011000"
Letter(19) = "00111111100"
Letter(20) = "11111111100"
Letter(21) = "11111001110"
Letter(22) = "00000000110"
Letter(23) = "00000000000"
Letter(24) = "00000000000"
Letter(25) = "00000000000"
Letter(26) = "00000000000"
Letter(27) = "00000000000"
Letter(28) = "00000000000"
Letter(29) = "00000000000"
Font.Add "U", Letter
Letter(0) = "0000000000"
Letter(1) = "0000000000"
Letter(2) = "0000000000"
Letter(3) = "0000000000"
Letter(4) = "0000000000"
Letter(5) = "0000000000"
Letter(6) = "0000000000"
Letter(7) = "0000000000"
Letter(8) = "0000000000"
Letter(9) = "0000000000"
Letter(10) = "1100000010"
Letter(11) = "1100000110"
Letter(12) = "0110001110"
Letter(13) = "0110011100"
Letter(14) = "0110011000"
Letter(15) = "0011111000"
Letter(16) = "0011110000"
Letter(17) = "0011110000"
Letter(18) = "0011110000"
Letter(19) = "0011100000"
Letter(20) = "0011100000"
Letter(21) = "0111100000"
Letter(22) = "0110000000"
Letter(23) = "0000000000"
Letter(24) = "0000000000"
Letter(25) = "0000000000"
Letter(26) = "0000000000"
Letter(27) = "0000000000"
Letter(28) = "0000000000"
Letter(29) = "0000000000"
Font.Add "V", Letter
Letter(0) = "00000000000000"
Letter(1) = "00000000000000"
Letter(2) = "00000000000000"
Letter(3) = "00000000000000"
Letter(4) = "00000000000000"
Letter(5) = "00000000000000"
Letter(6) = "00000000000000"
Letter(7) = "00000000000000"
Letter(8) = "00000000000000"
Letter(9) = "00000000000111"
Letter(10) = "00000000001111"
Letter(11) = "11000000001100"
Letter(12) = "11000000001100"
Letter(13) = "01100000001100"
Letter(14) = "01110000011100"
Letter(15) = "00110000011000"
Letter(16) = "00110010011000"
Letter(17) = "00110111011000"
Letter(18) = "00011111011000"
Letter(19) = "00011111111000"
Letter(20) = "00011101111000"
Letter(21) = "00011100111000"
Letter(22) = "00011000010000"
Letter(23) = "00000000000000"
Letter(24) = "00000000000000"
Letter(25) = "00000000000000"
Letter(26) = "00000000000000"
Letter(27) = "00000000000000"
Letter(28) = "00000000000000"
Letter(29) = "00000000000000"
Font.Add "W", Letter
Letter(0) = "00000000000"
Letter(1) = "00000000000"
Letter(2) = "00000000000"
Letter(3) = "00000000000"
Letter(4) = "00000000000"
Letter(5) = "00000000000"
Letter(6) = "00000000000"
Letter(7) = "00000000000"
Letter(8) = "00000000000"
Letter(9) = "00000000000"
Letter(10) = "01000000000"
Letter(11) = "01110001110"
Letter(12) = "00110111110"
Letter(13) = "00011110000"
Letter(14) = "00011100000"
Letter(15) = "00011100000"
Letter(16) = "00011110000"
Letter(17) = "00111110000"
Letter(18) = "00110011000"
Letter(19) = "01100011100"
Letter(20) = "01100001100"
Letter(21) = "11000001100"
Letter(22) = "11000000000"
Letter(23) = "00000000000"
Letter(24) = "00000000000"
Letter(25) = "00000000000"
Letter(26) = "00000000000"
Letter(27) = "00000000000"
Letter(28) = "00000000000"
Letter(29) = "00000000000"
Font.Add "X", Letter
Letter(0) = "0000000000000"
Letter(1) = "0000000000000"
Letter(2) = "0000000000000"
Letter(3) = "0000000000000"
Letter(4) = "0000000000000"
Letter(5) = "0000000000000"
Letter(6) = "0000000000000"
Letter(7) = "0000000000000"
Letter(8) = "0000000000000"
Letter(9) = "0000000000110"
Letter(10) = "1100000001110"
Letter(11) = "1100000011100"
Letter(12) = "1100000011000"
Letter(13) = "1100000110000"
Letter(14) = "1111111110000"
Letter(15) = "0111111110000"
Letter(16) = "0000110111000"
Letter(17) = "0000011011000"
Letter(18) = "0000011000000"
Letter(19) = "0000011000000"
Letter(20) = "0000011000000"
Letter(21) = "0000011000000"
Letter(22) = "0000010000000"
Letter(23) = "0000000000000"
Letter(24) = "0000000000000"
Letter(25) = "0000000000000"
Letter(26) = "0000000000000"
Letter(27) = "0000000000000"
Letter(28) = "0000000000000"
Letter(29) = "0000000000000"
Font.Add "Y", Letter
Letter(0) = "0000000000000"
Letter(1) = "0000000000000"
Letter(2) = "0000000000000"
Letter(3) = "0000000000000"
Letter(4) = "0000000000000"
Letter(5) = "0000000000000"
Letter(6) = "0000000000000"
Letter(7) = "0000000000000"
Letter(8) = "0000000000000"
Letter(9) = "0000000000000"
Letter(10) = "0111111110000"
Letter(11) = "0111111110000"
Letter(12) = "0000001100000"
Letter(13) = "0000011000000"
Letter(14) = "0000110000000"
Letter(15) = "0001110000000"
Letter(16) = "0011100000000"
Letter(17) = "0011000000000"
Letter(18) = "0110000000000"
Letter(19) = "1110000000000"
Letter(20) = "1100000000110"
Letter(21) = "1111111111110"
Letter(22) = "0111111111000"
Letter(23) = "0000000000000"
Letter(24) = "0000000000000"
Letter(25) = "0000000000000"
Letter(26) = "0000000000000"
Letter(27) = "0000000000000"
Letter(28) = "0000000000000"
Letter(29) = "0000000000000"
Font.Add "Z", Letter
Letter(0) = "000000000000"
Letter(1) = "000000000000"
Letter(2) = "000000000000"
Letter(3) = "000000000000"
Letter(4) = "000000000000"
Letter(5) = "000000000000"
Letter(6) = "000000000000"
Letter(7) = "000000000000"
Letter(8) = "000000000000"
Letter(9) = "000000000000"
Letter(10) = "001111110000"
Letter(11) = "011111111100"
Letter(12) = "110000011110"
Letter(13) = "110000000110"
Letter(14) = "110000000011"
Letter(15) = "110000000011"
Letter(16) = "110000000011"
Letter(17) = "110000000011"
Letter(18) = "110000000110"
Letter(19) = "011000011100"
Letter(20) = "011111111000"
Letter(21) = "000111000000"
Letter(22) = "000000000000"
Letter(23) = "000000000000"
Letter(24) = "000000000000"
Letter(25) = "000000000000"
Letter(26) = "000000000000"
Letter(27) = "000000000000"
Letter(28) = "000000000000"
Letter(29) = "000000000000"
Font.Add "0", Letter
Letter(0) = "00000"
Letter(1) = "00000"
Letter(2) = "00000"
Letter(3) = "00000"
Letter(4) = "00000"
Letter(5) = "00000"
Letter(6) = "00000"
Letter(7) = "00000"
Letter(8) = "00000"
Letter(9) = "00000"
Letter(10) = "00111"
Letter(11) = "01111"
Letter(12) = "11111"
Letter(13) = "11110"
Letter(14) = "00110"
Letter(15) = "00110"
Letter(16) = "01100"
Letter(17) = "01100"
Letter(18) = "11000"
Letter(19) = "11000"
Letter(20) = "11000"
Letter(21) = "11000"
Letter(22) = "00000"
Letter(23) = "00000"
Letter(24) = "00000"
Letter(25) = "00000"
Letter(26) = "00000"
Letter(27) = "00000"
Letter(28) = "00000"
Letter(29) = "00000"
Font.Add "1", Letter
Letter(0) = "0000000"
Letter(1) = "0000000"
Letter(2) = "0000000"
Letter(3) = "0000000"
Letter(4) = "0000000"
Letter(5) = "0000000"
Letter(6) = "0000000"
Letter(7) = "0000000"
Letter(8) = "0000000"
Letter(9) = "0111100"
Letter(10) = "1111110"
Letter(11) = "1100110"
Letter(12) = "1100110"
Letter(13) = "1100110"
Letter(14) = "0000110"
Letter(15) = "0000110"
Letter(16) = "0000110"
Letter(17) = "0111110"
Letter(18) = "1111110"
Letter(19) = "1101110"
Letter(20) = "1101110"
Letter(21) = "0111111"
Letter(22) = "0000010"
Letter(23) = "0000000"
Letter(24) = "0000000"
Letter(25) = "0000000"
Letter(26) = "0000000"
Letter(27) = "0000000"
Letter(28) = "0000000"
Letter(29) = "0000000"
Font.Add "2", Letter
Letter(0) = "00000000000"
Letter(1) = "00000000000"
Letter(2) = "00000000000"
Letter(3) = "00000000000"
Letter(4) = "00000000000"
Letter(5) = "00000000000"
Letter(6) = "00000000000"
Letter(7) = "00000000000"
Letter(8) = "00000000000"
Letter(9) = "01111100000"
Letter(10) = "11111100000"
Letter(11) = "00001100000"
Letter(12) = "00001100000"
Letter(13) = "00011111100"
Letter(14) = "11111111110"
Letter(15) = "11100000110"
Letter(16) = "00000000110"
Letter(17) = "00000000110"
Letter(18) = "00000000110"
Letter(19) = "00000000110"
Letter(20) = "00000011100"
Letter(21) = "00111111100"
Letter(22) = "00111110000"
Letter(23) = "00000000000"
Letter(24) = "00000000000"
Letter(25) = "00000000000"
Letter(26) = "00000000000"
Letter(27) = "00000000000"
Letter(28) = "00000000000"
Letter(29) = "00000000000"
Font.Add "3", Letter
Letter(0) = "00000000000"
Letter(1) = "00000000000"
Letter(2) = "00000000000"
Letter(3) = "00000000000"
Letter(4) = "00000000000"
Letter(5) = "00000000000"
Letter(6) = "00000000000"
Letter(7) = "00000000000"
Letter(8) = "00000000000"
Letter(9) = "01100000000"
Letter(10) = "01100000000"
Letter(11) = "01100000000"
Letter(12) = "01100000110"
Letter(13) = "01100000110"
Letter(14) = "01100001110"
Letter(15) = "01100001100"
Letter(16) = "11111111110"
Letter(17) = "11111111110"
Letter(18) = "00000011000"
Letter(19) = "00000011000"
Letter(20) = "00000011000"
Letter(21) = "00000011000"
Letter(22) = "00000000000"
Letter(23) = "00000000000"
Letter(24) = "00000000000"
Letter(25) = "00000000000"
Letter(26) = "00000000000"
Letter(27) = "00000000000"
Letter(28) = "00000000000"
Letter(29) = "00000000000"
Font.Add "4", Letter
Letter(0) = "00000000000"
Letter(1) = "00000000000"
Letter(2) = "00000000000"
Letter(3) = "00000000000"
Letter(4) = "00000000000"
Letter(5) = "00000000000"
Letter(6) = "00000000000"
Letter(7) = "00000000000"
Letter(8) = "01100000000"
Letter(9) = "01100000000"
Letter(10) = "11111111111"
Letter(11) = "01111111111"
Letter(12) = "01100000000"
Letter(13) = "01100000000"
Letter(14) = "01111111110"
Letter(15) = "01111111111"
Letter(16) = "01110000011"
Letter(17) = "00000000011"
Letter(18) = "00000000011"
Letter(19) = "00000000111"
Letter(20) = "11111111110"
Letter(21) = "11111111000"
Letter(22) = "00000000000"
Letter(23) = "00000000000"
Letter(24) = "00000000000"
Letter(25) = "00000000000"
Letter(26) = "00000000000"
Letter(27) = "00000000000"
Letter(28) = "00000000000"
Letter(29) = "00000000000"
Font.Add "5", Letter
Letter(0) = "0000000000"
Letter(1) = "0000000000"
Letter(2) = "0000000000"
Letter(3) = "0000000000"
Letter(4) = "0000000000"
Letter(5) = "0000000000"
Letter(6) = "0000000000"
Letter(7) = "0000000000"
Letter(8) = "0000000000"
Letter(9) = "0000000000"
Letter(10) = "0001110000"
Letter(11) = "0011111000"
Letter(12) = "0011110000"
Letter(13) = "0111001110"
Letter(14) = "0110111111"
Letter(15) = "0111111011"
Letter(16) = "1111100011"
Letter(17) = "1111000011"
Letter(18) = "1110000111"
Letter(19) = "1100000110"
Letter(20) = "1100001110"
Letter(21) = "1111111100"
Letter(22) = "0011110000"
Letter(23) = "0000000000"
Letter(24) = "0000000000"
Letter(25) = "0000000000"
Letter(26) = "0000000000"
Letter(27) = "0000000000"
Letter(28) = "0000000000"
Letter(29) = "0000000000"
Font.Add "6", Letter
Letter(0) = "0000000000"
Letter(1) = "0000000000"
Letter(2) = "0000000000"
Letter(3) = "0000000000"
Letter(4) = "0000000000"
Letter(5) = "0000000000"
Letter(6) = "0000000000"
Letter(7) = "0000000000"
Letter(8) = "0000000000"
Letter(9) = "0000000000"
Letter(10) = "1111111110"
Letter(11) = "1111111110"
Letter(12) = "0000001110"
Letter(13) = "0000001100"
Letter(14) = "0000011000"
Letter(15) = "0000111000"
Letter(16) = "0111111000"
Letter(17) = "0111111100"
Letter(18) = "0011000000"
Letter(19) = "0110000000"
Letter(20) = "0110000000"
Letter(21) = "0110000000"
Letter(22) = "0000000000"
Letter(23) = "0000000000"
Letter(24) = "0000000000"
Letter(25) = "0000000000"
Letter(26) = "0000000000"
Letter(27) = "0000000000"
Letter(28) = "0000000000"
Letter(29) = "0000000000"
Font.Add "7", Letter
Letter(0) = "000000000"
Letter(1) = "000000000"
Letter(2) = "000000000"
Letter(3) = "000000000"
Letter(4) = "000000000"
Letter(5) = "000000000"
Letter(6) = "000000000"
Letter(7) = "000000000"
Letter(8) = "000000000"
Letter(9) = "000111100"
Letter(10) = "000111110"
Letter(11) = "001100110"
Letter(12) = "001100110"
Letter(13) = "011111100"
Letter(14) = "110001110"
Letter(15) = "110000110"
Letter(16) = "110000110"
Letter(17) = "110000110"
Letter(18) = "110000110"
Letter(19) = "110001100"
Letter(20) = "011011100"
Letter(21) = "011111000"
Letter(22) = "001110000"
Letter(23) = "000000000"
Letter(24) = "000000000"
Letter(25) = "000000000"
Letter(26) = "000000000"
Letter(27) = "000000000"
Letter(28) = "000000000"
Letter(29) = "000000000"
Font.Add "8", Letter
Letter(0) = "000000000"
Letter(1) = "000000000"
Letter(2) = "000000000"
Letter(3) = "000000000"
Letter(4) = "000000000"
Letter(5) = "000000000"
Letter(6) = "000000000"
Letter(7) = "000000000"
Letter(8) = "000000000"
Letter(9) = "000000000"
Letter(10) = "001111100"
Letter(11) = "011111110"
Letter(12) = "111000110"
Letter(13) = "110000110"
Letter(14) = "110001110"
Letter(15) = "110001110"
Letter(16) = "111111110"
Letter(17) = "011110110"
Letter(18) = "000001100"
Letter(19) = "000001100"
Letter(20) = "000111000"
Letter(21) = "000110000"
Letter(22) = "000000000"
Letter(23) = "000000000"
Letter(24) = "000000000"
Letter(25) = "000000000"
Letter(26) = "000000000"
Letter(27) = "000000000"
Letter(28) = "000000000"
Letter(29) = "000000000"
Font.Add "9", Letter
Letter(0) = "000000000"
Letter(1) = "000000000"
Letter(2) = "000000000"
Letter(3) = "000000000"
Letter(4) = "000000000"
Letter(5) = "000000000"
Letter(6) = "000000000"
Letter(7) = "000000000"
Letter(8) = "000000000"
Letter(9) = "000000000"
Letter(10) = "000000000"
Letter(11) = "000000000"
Letter(12) = "000000000"
Letter(13) = "000000000"
Letter(14) = "000000000"
Letter(15) = "000000000"
Letter(16) = "000000000"
Letter(17) = "000000000"
Letter(18) = "000000000"
Letter(19) = "000000000"
Letter(20) = "000000000"
Letter(21) = "000000000"
Letter(22) = "000000000"
Letter(23) = "000000000"
Letter(24) = "000000000"
Letter(25) = "000000000"
Letter(26) = "000000000"
Letter(27) = "000000000"
Letter(28) = "000000000"
Letter(29) = "000000000"
Font.Add " ", Letter
%>
建立canvas.asp文件
<%
' Constants for this class
public const MAX_WIDTH = 65535
public const MAX_HEIGHT = 65535
public const INIT_WIDTH = 20
public const INIT_HEIGHT = 20
public const FLAG_DEBUG = false
public const CURRENT_VER = "01.00.05"
public const PI = 3.14159265 ' Roughly
Class Canvas
' Public data
public GlobalColourTable()
public LocalColourTable()
public ForegroundColourIndex ' Current foreground pen
public BackgroundColourIndex ' Current background pen
public TransparentColourIndex ' Current transparency colour index
public UseTransparency ' Boolean for writing transparency
public GIF89a ' Write GIF89a data
public Comment ' Image comment 255 characters max
' Private data
private sImage
private lWidth
private lHeight
private iBits
private lColourResolution
private bSortFlag
private bytePixelAspectRatio
private byteSeperator
private byteGraphicControl
private byteEndOfImage
private lLeftPosition
private lTopPosition
private lLocalColourTableSize
private lGlobalColourTableSize
private lReserved
private bInterlaceFlag
private bLocalColourTableFlag
private bGlobalColourTableFlag
private lCodeSize
private bTest
' ***************************************************************************
' ************************ Raster management functions **********************
' ***************************************************************************
public property get Version()
Version = CURRENT_VER
end property
' Get a specific pixel colour
public property get Pixel(ByVal lX,ByVal lY)
if lX <= lWidth and lX > 0 and lY <= lHeight and lY > 0 then
Pixel = AscB(MidB(sImage,(lWidth * (lY - 1)) + lX,1))
else ' Out of bounds, return zero
Pixel = 0
end if
end property
' Set a specific pixel colour, look at speeding this up somehow...
public property let Pixel(ByVal lX,ByVal lY,lValue)
Dim sTemp
Dim lOffset
lX = int(lX)
lY = int(lY)
lValue = int(lValue)
lOffset = lWidth * (lY - 1)
if lX <= lWidth and lY <= lHeight and lX > 0 and lY > 0 then ' Clipping
' Set the pixel value at this point
sImage = LeftB(sImage,lOffset + (lX - 1)) & ChrB(lValue) & RightB(sImage,LenB(sImage) - (lOffset + lX))
end if
end property
' Read only width and height, to change these, resize the image
public property get Width()
Width = lWidth
end property
public property get Height()
Height = lHeight
end property
public sub Replace(ByVal lOldColour,ByVal lNewColour)
Dim lTempX
Dim lTempY
for lTempy = 1 to lHeight
for lTempX = 1 to lWidth
if Pixel(lTempX,lTempY) = lOldColour then
Pixel(lTempX,lTempY) = lNewColour
end if
next
next
end sub
' Copy a section of the picture from one location to the other
public sub Copy(ByVal lX1,ByVal lY1,ByVal lX2,ByVal lY2,ByVal lX3,ByVal lY3)
Dim sCopy
Dim lTemp1
Dim lTemp2
Dim lStartX
Dim lStartY
Dim lFinishX
Dim lFinishY
Dim lWidth
Dim lHeight
if lX1 > lX2 then
lStartX = lX2
lFinishX = lX1
else
lStartX = lX1
lFinishX = lX2
end if
if lY1 > lY2 then
lStartY = lY2
lFinishY = lY1
else
lStartY = lY1
lFinishY = lY2
end if
sCopy = ""
lWidth = lFinishX - lStartX + 1
lHeight = lFinishY - lStartY + 1
for iTemp2 = lStartY to lFinishY
for iTemp1 = lStartX to lFinishX
sCopy = sCopy & ChrB(Pixel(iTemp1,iTemp2))
next
next
for iTemp2 = 1 to lHeight
for iTemp1 = 1 to lWidth
Pixel(lX3 + iTemp1,lY3 + iTemp2) = AscB(MidB(sCopy,(iTemp2 - 1) * lWidth + iTemp1,1))
next
next
end sub
' Non-recursive flood fill, VBScript has a short stack (200 bytes) so recursion won't work
public sub Flood(ByVal lX,ByVal lY)
Dim aPixelStack
Dim objPixel
Dim lOldPixel
Set aPixelStack = New PixelStack
aPixelStack.Push lX,lY
lOldPixel = Pixel(lX,lY)
while(aPixelStack.Size > 0)
Set objPixel = aPixelStack.Pop
if objPixel.X >= 1 and objPixel.X <= lWidth and objPixel.Y >= 1 and objPixel.Y <= lHeight then
if Pixel(objPixel.X,objPixel.Y) <> ForegroundColourIndex and Pixel(objPixel.X,objPixel.Y) = lOldPixel then
Pixel(objPixel.X,objPixel.Y) = ForegroundColourIndex
aPixelStack.Push objPixel.X + 1,objPixel.Y
aPixelStack.Push objPixel.X - 1,objPixel.Y
aPixelStack.Push objPixel.X,objPixel.Y + 1
aPixelStack.Push objPixel.X,objPixel.Y - 1
end if
end if
wend
end sub
public sub Polygon(aX,aY,bJoin)
Dim iTemp
Dim lUpper
if UBound(aX) <> UBound(aY) then exit sub
if UBound(aX) < 1 then exit sub ' Must be more than one point
lUpper = UBound(aX) - 1
' Draw a series of lines from arrays aX and aY
for iTemp = 1 to lUpper
Line aX(iTemp - 1),aY(iTemp - 1),aX(iTemp),aY(iTemp)
next
if bJoin then
Line aX(lUpper),aY(lUpper),aX(0),aY(0)
end if
end sub
' Easy as, err, rectangle?
public sub PieSlice(lX,lY,lRadius,sinStartAngle,sinArcAngle,bFilled)
Dim sinActualAngle
Dim sinMidAngle
Dim lX2
Dim lY2
Dim iTemp
Arc lX,lY,lRadius,lRadius,sinStartAngle,sinArcAngle
AngleLine lX,lY,lRadius,sinStartAngle
sinActualAngle = sinStartAngle + sinArcAngle
if sinActualAngle > 360 then
sinActualAngle = sinActualAngle - 360
end if
AngleLine lX,lY,lRadius,sinActualAngle
' Now pick a start flood point at the furthest point from the center
' Divide the arc angle by 2
sinMidAngle = sinStartAngle + (sinArcAngle / 2)
if sinMidAngle > 360 then
sinMidAngle = sinMidAngle - 360
end if
if bFilled then
for iTemp = 1 to lRadius - 1
lY2 = CInt(lY + (Sin(DegreesToRadians(sinMidAngle)) * iTemp))
lX2 = CInt(lX + (Cos(DegreesToRadians(sinMidAngle)) * iTemp))
Flood lX2,lY2
next
end if
end sub
public sub Bezier(lX1,lY1,lCX1,lCY1,lCX2,lCY2,lX2,lY2,lPointCount)
Dim sinT
dim lX,lY,lLastX,lLastY
dim sinResolution
if lPointCount = 0 then exit sub
sinResolution = 1 / lPointCount
sinT = 0
lLastX = lX1
lLastY = lY1
while sinT <= 1
lX = int(((sinT^3) * -1 + (sinT^2) * 3 + sinT * -3 + 1) * lX1 + ((sinT^3) * 3 + (sinT^2) *-6 + sinT * 3) * lCX1 + ((sinT^3) * -3 + (sinT^2) * 3) * lCX2 + (sinT^3) * lX2)
lY = int(((sinT^3) * -1 + (sinT^2) * 3 + sinT * -3 + 1) * lY1 + ((sinT^3) * 3 + (sinT^2) *-6 + sinT * 3) * lCY1 + ((sinT^3) * -3 + (sinT^2) * 3) * lCY2 + (sinT^3) * lY2)
Line lLastX,lLastY,lX,lY
lLastX = lX
lLastY = lY
sinT = sinT + sinResolution
wend
Line lLastX,lLastY,lX2,lY2
end sub
' ArcPixel Kindly donated by webjx.com ()
Private Sub ArcPixel(lX, lY, ltX, ltY, sinStart, sinEnd)
Dim dAngle
If ltX = 0 Then
dAngle = Sgn(ltY) * PI / 2
ElseIf ltX < 0 And ltY < 0 Then
dAngle = PI + Atn(ltY / ltX)
ElseIf ltX < 0 Then
dAngle = PI - Atn(-ltY / ltX)
ElseIf ltY < 0 Then
dAngle = 2 * PI - Atn(-ltY / ltX)
Else
dAngle = Atn(ltY / ltX)
End If
If dAngle < 0 Then dAngle = 2 * PI + dAngle
' Compensation for radii spanning over 0 degree marker
if sinEnd > DegreesToRadians(360) and dAngle < (sinEnd - DegreesToRadians(360)) then
dAngle = dAngle + DegreesToRadians(360)
end if
If sinStart < sinEnd And (dAngle > sinStart And dAngle < sinEnd) Then
'This is the "corrected" angle
'To change back, change the minus to a plus
Pixel(lX + ltX, lY + ltY) = ForegroundColourIndex
End If
End Sub
' Arc Kindly donated by Richard Deeming (), vast improvement on the
' previously kludgy Arc function.
Public Sub Arc(ByVal lX, ByVal lY, ByVal lRadiusX, ByVal lRadiusY, ByVal sinStartAngle, ByVal sinArcAngle)
' Draw an arc at point lX,lY with radius lRadius
' running from sinStartAngle degrees for sinArcAngle degrees
Dim lAlpha, lBeta, S, T, lTempX, lTempY
Dim dStart, dEnd
dStart = DegreesToRadians(sinStartAngle)
dEnd = dStart + DegreesToRadians(sinArcAngle)
lAlpha = lRadiusX * lRadiusX
lBeta = lRadiusY * lRadiusY
lTempX = 0
lTempY = lRadiusY
S = lAlpha * (1 - 2 * lRadiusY) + 2 * lBeta
T = lBeta - 2 * lAlpha * (2 * lRadiusY - 1)
ArcPixel lX, lY, lTempX, lTempY, dStart, dEnd
ArcPixel lX, lY, -lTempX, lTempY, dStart, dEnd
ArcPixel lX, lY, lTempX, -lTempY, dStart, dEnd
ArcPixel lX, lY, -lTempX, -lTempY, dStart, dEnd
Do
If S < 0 Then
S = S + 2 * lBeta * (2 * lTempX + 3)
T = T + 4 * lBeta * (lTempX + 1)
lTempX = lTempX + 1
ElseIf T < 0 Then
S = S + 2 * lBeta * (2 * lTempX + 3) - 4 * lAlpha * (lTempY - 1)
T = T + 4 * lBeta * (lTempX + 1) - 2 * lAlpha * (2 * lTempY - 3)
lTempX = lTempX + 1
lTempY = lTempY - 1
Else
S = S - 4 * lAlpha * (lTempY - 1)
T = T - 2 * lAlpha * (2 * lTempY - 3)
lTempY = lTempY - 1
End If
ArcPixel lX, lY, lTempX, lTempY, dStart, dEnd
ArcPixel lX, lY, -lTempX, lTempY, dStart, dEnd
ArcPixel lX, lY, lTempX, -lTempY, dStart, dEnd
ArcPixel lX, lY, -lTempX, -lTempY, dStart, dEnd
Loop While lTempY > 0
End Sub
public sub AngleLine(ByVal lX,ByVal lY,ByVal lRadius,ByVal sinAngle)
' Draw a line at an angle
' Angles start from the top vertical and work clockwise
' Work out the destination defined by length and angle
Dim lX2
Dim lY2
lY2 = (Sin(DegreesToRadians(sinAngle)) * lRadius)
lX2 = (Cos(DegreesToRadians(sinAngle)) * lRadius)
Line lX,lY,lX + lX2,lY + lY2
end sub
' Bresenham line algorithm, this is pretty quick, only uses point to point to avoid the
' mid-point problem
public sub Line(ByVal lX1,ByVal lY1,ByVal lX2,ByVal lY2)
Dim lDX
Dim lDY
Dim lXIncrement
Dim lYIncrement
Dim lDPr
Dim lDPru
Dim lP
lDX = Abs(lX2 - lX1)
lDY = Abs(lY2 - lY1)
if lX1 > lX2 then
lXIncrement = -1
else
lXIncrement = 1
end if
if lY1 > lY2 then
lYIncrement = -1
else
lYIncrement = 1
end if
if lDX >= lDY then
lDPr = ShiftLeft(lDY,1)
lDPru = lDPr - ShiftLeft(lDX,1)
lP = lDPr - lDX
while lDX >= 0
Pixel(lX1,lY1) = ForegroundColourIndex
if lP > 0 then
lX1 = lX1 + lXIncrement
lY1 = lY1 + lYIncrement
lP = lP + lDPru
else
lX1 = lX1 + lXIncrement
lP = lP + lDPr
end if
lDX = lDX - 1
wend
else
lDPr = ShiftLeft(lDX,1)
lDPru = lDPr - ShiftLeft(lDY,1)
lP = lDPR - lDY
while lDY >= 0
Pixel(lX1,lY1) = ForegroundColourIndex
if lP > 0 then
lX1 = lX1 + lXIncrement
lY1 = lY1 + lYIncrement
lP = lP + lDPru
else
lY1 = lY1 + lYIncrement
lP = lP + lDPr
end if
lDY = lDY - 1
wend
end if
end sub
public sub Rectangle(ByVal lX1,ByVal lY1,ByVal lX2,ByVal lY2)
' Easy as pie, well, actually pie is another function... draw four lines
Line lX1,lY1,lX2,lY1
Line lX2,lY1,lX2,lY2
Line lX2,lY2,lX1,lY2
Line lX1,lY2,lX1,lY1
end sub
public sub Circle(ByVal lX,ByVal lY,ByVal lRadius)
Ellipse lX,lY,lRadius,lRadius
end sub
' Bresenham ellispe, pretty quick also, uses reflection, so rotation is out of the
' question unless we perform a matrix rotation after rendering the ellipse coords
public sub Ellipse(ByVal lX,ByVal lY,ByVal lRadiusX,ByVal lRadiusY)
' Draw a circle at point lX,lY with radius lRadius
Dim lAlpha,lBeta,S,T,lTempX,lTempY
lAlpha = lRadiusX * lRadiusX
lBeta = lRadiusY * lRadiusY
lTempX = 0
lTempY = lRadiusY
S = lAlpha * (1 - 2 * lRadiusY) + 2 * lBeta
T = lBeta - 2 * lAlpha * (2 * lRadiusY - 1)
Pixel(lX + lTempX,lY + lTempY) = ForegroundColourIndex
Pixel(lX - lTempX,lY + lTempY) = ForegroundColourIndex
Pixel(lX + lTempX,lY - lTempY) = ForegroundColourIndex
Pixel(lX - lTempX,lY - lTempY) = ForegroundColourIndex
Do
if S < 0 then
S = S + 2 * lBeta * (2 * lTempX + 3)
T = T + 4 * lBeta * (lTempX + 1)
lTempX = lTempX + 1
elseif T < 0 then
S = S + 2 * lBeta * (2 * lTempX + 3) - 4 * lAlpha * (lTempY - 1)
T = T + 4 * lBeta * (lTempX + 1) - 2 * lAlpha * (2 * lTempY - 3)
lTempX = lTempX + 1
lTempY = lTempY - 1
else
S = S - 4 * lAlpha * (lTempY - 1)
T = T - 2 * lAlpha * (2 * lTempY - 3)
lTempY = lTempY - 1
end if
Pixel(lX + lTempX,lY + lTempY) = ForegroundColourIndex
Pixel(lX - lTempX,lY + lTempY) = ForegroundColourIndex
Pixel(lX + lTempX,lY - lTempY) = ForegroundColourIndex
Pixel(lX - lTempX,lY - lTempY) = ForegroundColourIndex
loop while lTempY > 0
end sub
' Vector font support
' These fonts are described in terms of points on a grid with simple
' X and Y offsets. These functions take elements of a string and render
' them from arrays storing character vector information. Vector fonts are
' have proportional widths, unlike bitmapped fonts which are fixed in size
' The format for the vector array is simply a variable length list of x y pairs
' the sub DrawVectorChar renders the single character from the array.
' The other advantage of vector fonts is that they can be scaled :)
' Maybe add an angle value?
public sub DrawVectorTextWE(ByVal lX,ByVal lY,sText,lSize)
Dim iTemp
Dim lCurrentStringX
lCurrentStringX = lX
For iTemp = 1 to Len(sText)
lCurrentStringX = lCurrentStringX + DrawVectorChar(lCurrentStringX,lY,Mid(sText,iTemp,1),lSize,true) + int(lSize)
Next
end sub
public sub DrawVectorTextNS(ByVal lX,ByVal lY,sText,lSize)
Dim iTemp
Dim lCurrentStringY
lCurrentStringY = lY
For iTemp = 1 to Len(sText)
lCurrentStringY = lCurrentStringY + DrawVectorChar(lX,lCurrentStringY,Mid(sText,iTemp,1),lSize,false) + int(lSize)
Next
end sub
private function DrawVectorChar(ByVal lX,ByVal lY,sChar,lSize,bOrientation)
Dim iTemp
Dim aFont
Dim lLargestWidth
if sChar <> " " then
aFont = VFont(sChar)
if bOrientation then
lLargest = aFont(1,0) * lSize
else
lLargest = aFont(1,1) * lSize
end if
for iTemp = 1 to UBound(aFont,1) - 1
if bOrientation then
if aFont(iTemp,2) = 1 then ' Pen down
Line lX + aFont(iTemp - 1,0) * lSize,lY + aFont(iTemp - 1,1) * lSize,lX + aFont(iTemp,0) * lSize,lY + aFont(iTemp,1) * lSize
end if
if (aFont(iTemp,0) * lSize) > lLargest then
lLargest = aFont(iTemp,0) * lSize
end if
else
if aFont(iTemp,2) = 1 then ' Pen down
Line lX + aFont(iTemp - 1,0) * lSize,lY + aFont(iTemp - 1,1) * lSize,lX + aFont(iTemp,0) * lSize,lY + aFont(iTemp,1) * lSize
end if
if (aFont(iTemp,1) * lSize) > lLargest then
lLargest = aFont(iTemp,1) * lSize
end if
end if
next
else
lLargest = lSize * 3
end if
' Return the width of the character
DrawVectorChar = lLargest
end function
' Bitmap font support
public sub DrawTextWE(ByVal lX,ByVal lY,sText)
' Render text at lX,lY
' There's a global dictionary object called Font and it should contain all the
' letters in arrays of a 5x5 grid
Dim iTemp1
Dim iTemp2
Dim iTemp3
Dim bChar
For iTemp1 = 0 to UBound(Letter) - 1
For iTemp2 = 1 to len(sText)
For iTemp3 = 1 to Len(Font(Mid(sText,iTemp2,1))(iTemp1))
bChar = Mid(Font(Mid(sText,iTemp2,1))(iTemp1),iTemp3,1)
if bChar <> "0" then
Pixel(lX + ((iTemp2 - 1) * Len(Letter(0))) + iTemp3,lY + iTemp1) = CLng(bChar)
end if
next
next
next
end sub
public sub DrawTextNS(ByVal lX,ByVal lY,sText)
' Render text at lX,lY
' There's a global dictionary object called Font and it should contain all the
' letters in arrays of a 5x5 grid
Dim iTemp1
Dim iTemp2
Dim iTemp3
Dim bChar
for iTemp1 = 1 to len(sText)
for iTemp2 = 0 to UBound(Letter) - 1
for iTemp3 = 1 to len(Font(Mid(sText,iTemp1,1))(iTemp2))
bChar = Mid(Font(Mid(sText,iTemp1,1))(iTemp2),iTemp3,1)
if bChar <> "0" then
Pixel(lX + iTemp3,lY + (iTemp1 * (UBound(Letter) + 1)) + iTemp2) = CLng(bChar)
end if
next
next
next
end sub
' Clear the image, because String sends out UNICODE characters, we double up the index as a WORD
public sub Clear()
' Possibly quicker, but a little less accurate
sImage = String(lWidth * ((lHeight + 1) / 2),ChrB(BackgroundColourIndex) & ChrB(BackgroundColourIndex))
end sub
public sub Resize(ByVal lNewWidth,ByVal lNewHeight,bPreserve)
' Resize the image, don't stretch
Dim sOldImage
Dim lOldWidth
Dim lOldHeight
Dim lCopyWidth
Dim lCopyHeight
Dim lX
Dim lY
if bPreserve then
sOldImage = sImage
lOldWidth = lWidth
lOldHeight = lHeight
end if
lWidth = lNewWidth
lHeight = lNewHeight
Clear
if bPreserve then
' Now copy the old image into the new
if lNewWidth > lOldWidth then
lCopyWidth = lOldWidth
else
lCopyWidth = lNewWidth
end if
if lNewHeight > lOldHeight then
lCopyHeight = lOldHeight
else
lCopyHeight = lNewHeight
end if
' Now set the new width and height
lWidth = lNewWidth
lHeight = lNewHeight
' Copy the old bitmap over, possibly could do with improvement, this does it
' on a pixel leve, there is room here to perform a MidB from one string to another
for lY = 1 to lCopyHeight
for lX = 1 to lCopyWidth
Pixel(lX,lY) = AscB(MidB(sOldImage,(lOldWidth * (lY - 1)) + lX,1))
next
next
end if
end sub
' ***************************************************************************
' ************************* GIF Management functions ************************
' ***************************************************************************
public property get TextImageData()
Dim iTemp
Dim sText
sText = ImageData
TextImageData = ""
for iTemp = 1 to LenB(sText)
TextImageData = TextImageData & Chr(AscB(Midb(sText,iTemp,1)))
next
end property
' Dump the image out as a GIF 87a
public property get ImageData()
Dim sText
Dim lTemp
ImageData = MagicNumber
ImageData = ImageData & MakeWord(lWidth)
ImageData = ImageData & MakeWord(lHeight)
ImageData = ImageData & MakeByte(GlobalDescriptor)
ImageData = ImageData & MakeByte(BackgroundColourIndex)
ImageData = ImageData & MakeByte(bytePixelAspectRatio)
ImageData = ImageData & GetGlobalColourTable
if GIF89a then
' Support for extended blocks
if UseTransparency then
ImageData = ImageData & MakeByte(byteGraphicControl)
ImageData = ImageData & MakeByte(&HF9)
ImageData = ImageData & MakeByte(&H04)
ImageData = ImageData & MakeByte(1)
ImageData = ImageData & MakeWord(0)
ImageData = ImageData & MakeByte(TransparentColourIndex)
ImageData = ImageData & MakeByte(0)
end if
if Comment <> "" then
ImageData = ImageData & MakeByte(byteGraphicControl)
ImageData = ImageData & MakeByte(&HFE)
sText = Left(Comment,255) ' Truncate to 255 characters
ImageData = ImageData & MakeByte(Len(sText))
For lTemp = 1 to Len(sText)
ImageData = ImageData & MakeByte(Asc(Mid(sText,lTemp,1)))
Next
ImageData = ImageData & MakeByte(0)
end if
end if
ImageData = ImageData & MakeByte(byteSeperator)
ImageData = ImageData & MakeWord(lLeftPosition)
ImageData = ImageData & MakeWord(lTopPosition)
ImageData = ImageData & MakeWord(lWidth)
ImageData = ImageData & MakeWord(lHeight)
ImageData = ImageData & MakeByte(LocalDescriptor)
ImageData = ImageData & MakeByte(lCodeSize)
ImageData = ImageData & GetRasterData
ImageData = ImageData & MakeByte(0)
ImageData = ImageData & MakeByte(byteEndOfImage)
end property
public sub Write()
if bTest then
' Write out the bytes in ASCII
Response.Write Debug(ImageData)
else
' Fix from Daniel Hasan so that duplicate headers don't get sent to confuse Netscape
Response.ContentType = "image/gif"
' Correct content disposition, so that when saving the image through the browser
' the filename and type comes up as image.gif instead of an asp file
Response.AddHeader "Content-Disposition","filename=image.gif"
&