Project1
标题:
请教关于显示图片的问题
[打印本页]
作者:
赛露休斯
时间:
2010-12-27 03:32
标题:
请教关于显示图片的问题
本帖最后由 赛露休斯 于 2010-12-27 03:42 编辑
我想在RMXP中显示网络上的图片,比如显示我在66rpg上的头像,图片不保存到电脑,该怎么做?
听上去比较困难,不知道有没有可能做到
作者:
san9
时间:
2010-12-27 11:40
提示:
作者被禁止或删除 内容自动屏蔽
作者:
赛露休斯
时间:
2010-12-27 21:37
本帖最后由 赛露休斯 于 2010-12-27 21:37 编辑
那么如果必须要保存到系统临时文件夹的话,再显示出来,具体该怎么实现?
作者:
步兵中尉
时间:
2010-12-27 22:48
这个基本不现实吧!
在脚本里设置的话要吧每个图片的地址都写上,以前我朋友曾经尝试过,但效果差,经常脚本错误。
作者:
px.凤翔九天
时间:
2010-12-27 22:53
建议还是保存下来吧,估计上网找图片然后显示交给RM自己来说不是什么太难的事,但是引用楼上的话 :经常脚本错误。建议放弃。
作者:
苏小脉
时间:
2010-12-29 13:01
给个方向吧,实际应用时还需要处理很多东西:
wsa_startup = Win32API.new('ws2_32', 'WSAStartup', 'ip', 'i')
wsa_cleanup = Win32API.new('ws2_32', 'WSACleanup', 'v', 'i')
get_addr_info = Win32API.new('ws2_32', 'getaddrinfo', 'pppp', 'i')
free_addr_info = Win32API.new('ws2_32', 'freeaddrinfo', 'l', 'v')
socket = Win32API.new('ws2_32', 'socket', 'iii', 'l')
closesocket = Win32API.new('ws2_32', 'closesocket', 'l', 'i')
connect = Win32API.new('ws2_32', 'connect', 'lli', 'i')
send = Win32API.new('ws2_32', 'send', 'lpii', 'i')
recv = Win32API.new('ws2_32', 'recv', 'lpii', 'i')
move_memory = Win32API.new('kernel32', 'RtlMoveMemory', 'pll', 'v')
BUF_LEN = 16
buf = "\000" * BUF_LEN
praw_addr_info = "\000\000\000\000"
raw_addr_info = "\000" * 32
http_response = ''
http_request = <<EOR
GET http://rpg.blue/uc_server/data/avatar/000/05/63/75_avatar_middle.jpg HTTP/1.1
Host: rpg.blue
Connection: close
EOR
wsa_startup.call(0x0202, "\000" * 400)
get_addr_info.call('rpg.blue', 'http', 0, praw_addr_info)
raw_addr_info_addr = praw_addr_info.unpack('l')[0]
move_memory.call(raw_addr_info, raw_addr_info_addr, 32)
addr_info = raw_addr_info.unpack('iiiillll')
sock = socket.call(addr_info[1], addr_info[2], addr_info[3])
connect.call(sock, addr_info[6], addr_info[4])
send.call(sock, http_request, http_request.length, 0)
loop do
byte_count = recv.call(sock, buf, BUF_LEN, 0)
break if byte_count <= 0
http_response += buf[0, byte_count]
end
free_addr_info.call(raw_addr_info_addr)
closesocket.call(sock)
wsa_cleanup.call
response_headers = http_response.split(/\r\n/)
image_data = response_headers[-1]
open('1.jpg', 'wb') do |jpeg|
jpeg << image_data
end
复制代码
打开一个 Socket,发送 HTTP 请求,接收 HTTP 响应中的图像数据。实际应用时,需要处理 Winsock 函数可能导致的各种错误;BUF_LEN 是每次接收数据的缓冲区大小,可以调整到 1024 左右;http_request 是实际的 HTTP 请求行、报头以及可能的正文,这里给了一个很简单的 GET,根据需要可以添加其它报头。
最后的 image_data 接收到了完整的图像数据,这段代码通过 Kernel#open 函数保存到了当前目录的 1.jpg。你可以选择把游戏目录下的某个目录作为临时目录保存这个图像,或者通过 Windows API 的 GetTempPath 和 GetTempFileName 保存到系统临时目录,然后用 RGSS 的 Bitmap.new 去创建位图并显示,或者在内存中直接处理图像数据——由于数据是 jpg 格式,你还需要解码、解压为 RMXP 使用的 32 位位图格式,然后给拷贝到一个已有的 Bitmap 对象的位图数据缓冲区中(参见柳之一的 Bitmap Marshal)。
欢迎光临 Project1 (https://rpg.blue/)
Powered by Discuz! X3.1