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
给个方向吧,实际应用时还需要处理很多东西:
  1. wsa_startup = Win32API.new('ws2_32', 'WSAStartup', 'ip', 'i')
  2. wsa_cleanup = Win32API.new('ws2_32', 'WSACleanup', 'v', 'i')
  3. get_addr_info = Win32API.new('ws2_32', 'getaddrinfo', 'pppp', 'i')
  4. free_addr_info = Win32API.new('ws2_32', 'freeaddrinfo', 'l', 'v')
  5. socket = Win32API.new('ws2_32', 'socket', 'iii', 'l')
  6. closesocket = Win32API.new('ws2_32', 'closesocket', 'l', 'i')
  7. connect = Win32API.new('ws2_32', 'connect', 'lli', 'i')
  8. send = Win32API.new('ws2_32', 'send', 'lpii', 'i')
  9. recv = Win32API.new('ws2_32', 'recv', 'lpii', 'i')
  10. move_memory = Win32API.new('kernel32', 'RtlMoveMemory', 'pll', 'v')

  11. BUF_LEN = 16
  12. buf = "\000" * BUF_LEN
  13. praw_addr_info = "\000\000\000\000"
  14. raw_addr_info = "\000" * 32
  15. http_response = ''
  16. http_request = <<EOR
  17. GET http://rpg.blue/uc_server/data/avatar/000/05/63/75_avatar_middle.jpg HTTP/1.1
  18. Host: rpg.blue
  19. Connection: close

  20. EOR

  21. wsa_startup.call(0x0202, "\000" * 400)
  22. get_addr_info.call('rpg.blue', 'http', 0, praw_addr_info)
  23. raw_addr_info_addr = praw_addr_info.unpack('l')[0]
  24. move_memory.call(raw_addr_info, raw_addr_info_addr, 32)
  25. addr_info = raw_addr_info.unpack('iiiillll')

  26. sock = socket.call(addr_info[1], addr_info[2], addr_info[3])
  27. connect.call(sock, addr_info[6], addr_info[4])

  28. send.call(sock, http_request, http_request.length, 0)
  29. loop do
  30.   byte_count = recv.call(sock, buf, BUF_LEN, 0)
  31.   break if byte_count <= 0
  32.   http_response += buf[0, byte_count]
  33. end

  34. free_addr_info.call(raw_addr_info_addr)
  35. closesocket.call(sock)
  36. wsa_cleanup.call

  37. response_headers = http_response.split(/\r\n/)
  38. image_data = response_headers[-1]

  39. open('1.jpg', 'wb') do |jpeg|
  40.         jpeg << image_data
  41. 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