Project1

标题: Bitmap用[图片数字]代替[文字数字]_v1.0 [打印本页]

作者: 一箭烂YiJL    时间: 2011-3-31 20:43
标题: Bitmap用[图片数字]代替[文字数字]_v1.0
0.序
可能以前早就有人有这个想法了,在 >这一帖(计时器)< 已用到类似的技术了。
用法是这样:
     bitmap对象.draw_number(x, y, number, flie_id)
       number    : 数字的字符串/整数类
       flie_id   : "A"-"Z" 的数字图片
就是先做定一些"A"至"Z"的数字图片,左至右为 0123456789。存放在"Graphics/System/Number/"。
然后就在bitmap对象用以上方法,绘画出数字。
默认为"Graphics/System/Number/"路径下的"A.png"的图片。

1.效果观看
使用这个放在"Graphics/System/Number/"路径下:
再做绘画:


2.脚本

  1. #==============================================================================
  2. # ■ 图片数字 v1.0     by 一箭烂
  3. #------------------------------------------------------------------------------
  4. #
  5. #  使用说明:
  6. #
  7. #     bitmap对象.draw_number(x, y, number, flie_id)
  8. #       number    : 数字的字符串/整数类
  9. #       flie_id   : "A"-"Z" 的数字图片
  10. #==============================================================================
  11. class Bitmap
  12.   @@cache = {}
  13.   for i in "A".."Z"
  14.     @@cache[i] = Bitmap.new("Graphics/System/Number/#{i}.png") if FileTest.exist?("Graphics/System/Number/#{i}.png")
  15.   end
  16.   #--------------------------------------------------------------------------
  17.   # ● draw_number
  18.   #--------------------------------------------------------------------------
  19.   def draw_number(x, y, number, flie_id = "A")
  20.     number = number.to_s unless number.is_a?(String)
  21.     bitmap_width = @@cache[flie_id].width / 10
  22.     bitmap_height = @@cache[flie_id].height
  23.     rect = Rect.new(0, 0, bitmap_width, bitmap_height)
  24.     buff = Bitmap.new(width * number.size, bitmap_height)
  25.     number_array = number.split(//)
  26.     index = -1
  27.     for i in number_array
  28.       index += 1
  29.       if i != " "
  30.         rect.x = number_array[index].to_i * bitmap_width
  31.         buff.blt(index * bitmap_width, 0, @@cache[flie_id], rect)
  32.       end
  33.     end
  34.     self.blt(x, y, buff, Rect.new(0, 0, bitmap_width * number.size, height))
  35.     buff.dispose
  36.   end
  37. end
复制代码

3.范例
图片数字_v1.0.zip (269.66 KB, 下载次数: 451)

4.更新历史及下一个版本的期望
目前为初版v1.0
下一个版本希望能够支持:

作者: 一瞬间的幻觉    时间: 2011-4-1 18:02
这个脚本比较简单~~正好拿来学习下~~

谢谢剑兰,最近更新很勤啊
作者: yangff    时间: 2011-4-2 17:25
浮点数 ->to_s一下什么都是浮云
draw_text的width、height和align参数以及功能。 ->width和height……建议你去看看有一种缩放算法可以减小失真率……align->这个不难吧……
作者: 一箭烂YiJL    时间: 2011-4-2 17:37
回复 yangff 的帖子

to_s有两个好处:
1.方便参数使用变量
2.功能合符要求(size和split拆开)

一开始我也想做那四个参数的了,做到关于这四个参数的时候,
发现需要很多的判断:
要看width是否短或长于整个图片长度(长于就不用缩)
要看height是否短或长于整个图片高度(长于就不用缩)
看完上面那两个后就stretch_blt来填进(3个可能的填法)
之后如果上面那width长于的话align失效,
短过的话就要在stretch_blt的坐标作(width-整体数字图片.width)/2,
align为0就无动作,align为1就是坐标+,align为2就是坐标边缘-

真的很烦= = 还有就是缩放算法? stretch_blt好像可以... # <=不好用?
作者: yangff    时间: 2011-4-2 23:29
一箭烂YiJL 发表于 2011-4-2 17:37
回复 yangff 的帖子

to_s有两个好处:

失真严重
我记得有一个算法可以这样
图A和图B
A是1x也就是正常大小
B是2x也就是放大一倍
要得到1.5x也就是放大0.5被的图可以通过1x和2x计算出来
特别是对于什么.1223x啊1.445x啊的效果最好了
作者: 一箭烂YiJL    时间: 2011-4-7 18:42
回复 yangff 的帖子

那么就要API或者自制式仿制一些缩放方法?
表示对Bitmap的缩放API没研究,查了一查后发现有几个:
BitBlt
Stretchblt
StretchDIBits
貌似都是根据窗口的场景句柄(<=没研究啥么是场景句柄= =),
但是得到后无法准保窗口内那图的背景是透明。
或者是自己做一个缩放?要get_pixel?
还有2x是长度和高度都2x(就是4x?),还是整体上2x?(对图片缩放真的没研究)
作者: yangff    时间: 2011-4-7 21:34
一箭烂YiJL 发表于 2011-4-7 18:42
回复 yangff 的帖子

那么就要API或者自制式仿制一些缩放方法?

zoom_x/y
但是最好自制……用61的那个快速保存Bitmap里面的办法取Bitmap的地址然后用C++的DLL快速变换……相信我RM的效率还有zoom_xy的效果会让你蛋痛的
作者: 苏小脉    时间: 2011-4-7 21:44
一箭烂YiJL 发表于 2011-4-7 18:42
回复 yangff 的帖子

那么就要API或者自制式仿制一些缩放方法?

这些是 GDI 的函数,需要的是设备上下文(DC)句柄,和 RM 使用的 DirectDraw 处于不同的层面。AlphaBlend 是 GDI 用来处理半透明的函数。

真正的无损缩放需要矢量图,位图无论如何都包含一定的估算性。
作者: yangff    时间: 2011-4-7 21:49
苏小脉 发表于 2011-4-7 21:44
这些是 GDI 的函数,需要的是设备上下文(DC)句柄,和 RM 使用的 DirectDraw 处于不同的层面。AlphaBlen ...

http://rpg.blue/forum.php?mod=vi ... B%E5%BF%AB%E9%80%9F
作者: 一箭烂YiJL    时间: 2011-4-8 19:04
回复 yangff 的帖子

提到zoom_x/y就联想到Sprite,Sprite的zoom_x/y好用么? (好用也限于Sprite= =)
不过61的保存方法保存在rvdata,用C++读取也难倒我了......

很遗憾的是...我这台死机无法安装VS的任何一款工具(2008、2010都失败...),
听说Office会影响,用官方方法把2007过期版和2010快过期版都卸载掉,
依然无法安装。(我想换机...同时求助...能不用vc++做c++的dll吗?)
作者: 苏小脉    时间: 2011-4-8 23:42
回复 一箭烂YiJL 的帖子
矢量图类似RM的窗口图? 中间应该有缩放, 那原理是...(RGE应该知道)

RM 默认应该没有利用任何矢量图,只不过 RM 的窗口确实是分辨率无关的。矢量图是用数学公式表示的分辨率无关的几何图形组合,比如Flash,字体都有矢量的性质。然而,矢量图大多是由纯色或渐变区域组成,他们往往缺乏描绘仿真图像中细微色调的能力,故而仿真图通常都是由位图表示。当然,科技在进步,如今的矢量图相比几十年前应用更加广泛了,特别是在位图纹理映射被引入矢量图标准之后。

转化为RM的Bitmap的方法应该有,但要去掉背景...

RM 的 Bitmap 是 32 位真彩色位图,其中包含了 Alpha 通道,而所谓的透明/半透明背景就是通过这第四个通道进行的 Alpha 合成。GDI 的 Bitmap 也同样支持 32 位位图,理论上在内存中只需要一次简单的 Blit 就能做到转换。当然,如果要用 GDI 的函数,还涉及到通过 DC 操纵实际位图的问题,可以参考这贴:
http://rpg.blue/forum.php?mod=viewthread&tid=162227

很遗憾的是...我这台死机无法安装VS的任何一款工具(2008、2010都失败...)

错误提示是什么?是 VS 的哪种版本?一般做小型开发,不需要所见即所得 GUI 编辑模式的话 Express 版足够了。

能不用vc++做c++的dll吗?

Win32 环境下,通常是不用 MSVC 就用 MinGW32 + GCC。
作者: yangff    时间: 2011-4-8 23:42
一箭烂YiJL 发表于 2011-4-8 19:04
回复 yangff 的帖子

提到zoom_x/y就联想到Sprite,Sprite的zoom_x/y好用么? (好用也限于Sprite= =)

汗……61那个把Bitmap里面的东西全部移出来(也就是
abgrabgrabgrabgrabgrabgrabgrabgrabgrabgrabgrabgr
这样的串显然是可以读的……详见我的斜切代码……
作者: 一箭烂YiJL    时间: 2011-4-9 13:44
回复 苏小脉 的帖子
矢量图

估计RM的Window也是类似于RM的Bitmap一点一点的显示。
矢量图,我想起了Expression 3(3.3),图案分为面和线两部分,
线可以用其他素材重复连成,面就是在线之内,也可以密铺而成。
Flash的字体要无需打散就已经是矢量图?
但图案过小,线太粗的时候,反而线会盖着面。
还有就是要制作这些矢量图的面线范围就有更高的难度了。

转换为Bitmap

类似这样的方法在神思的XP Graphics.snap_to_bitmap里面有用过(但复制窗口位图)。
可是经过类似BitBlt的缩放后,会缩放得好么?

安装VS

我安装的时Express,无论VC++、VC#、VB、2010、2008,哪一个都失败,
由于Express的版本,只会显示错误,不会显示错误提示。

MinGW32 + GCC

真复杂,已经不知怎么弄了...相信很多的功能都比不上VC++。
作者: 苏小脉    时间: 2011-4-9 14:30
回复 一箭烂YiJL 的帖子
Flash的字体要无需打散就已经是矢量图?

“打散”不是栅格运算吗?运算前置条件是系统矢量字体,后置条件就是一般的位图了。

我想起了Expression 3

这个没用过,不过微软在这方面的商业软件能和 Adobe 竞争吗?
自由软件中,Inkscape 是很不错的矢量图编辑器;OpenOffice 也有内置的矢量图编辑功能。Adobe Illustrator、Adobe Flash 这些商业软件就更不用说了。

可是经过类似BitBlt的缩放后,会缩放得好么?

这个取决于缩放使用的内插法,一般来说都用的是比较简单的邻近插值,效果一般吧。
还有一些高质量的内值法运算量庞大,除非有硬件加速,否则不适合游戏这样的实时应用程序。

真复杂,已经不知怎么弄了...相信很多的功能都比不上VC++。

VC++ 的优化性能在自己的平台下即便是胜过 MinGW 和 GCC 也不会相差太远。MinGW 是软件兼容层,GCC 是编译器,如果你还需要 IDE,可以在外面套一层 Code::Block。
作者: 冰舞蝶恋    时间: 2011-4-9 14:41
不得不顶的好东西!!!
作者: 一箭烂YiJL    时间: 2011-4-9 16:50
本帖最后由 一箭烂YiJL 于 2011-4-9 16:52 编辑

回复 苏小脉 的帖子

微软在这方面的商业软件能和 Adobe 竞争吗?

其实我所说的Expression 3.3是Creature House 的 Creature House Expression,
之后被微软收购,更新至3.3免费发布。随后融入Expression Studio中的Expression Design。
建议紫苏下载来试试(有汉化的)。
Flash的矢量设计差,Expression 3.3应该比Inkscape好一些。
Adobe Illustrator和Expression Design都没用过。

这个取决于缩放使用的内插法,一般来说都用的是比较简单的邻近插值,效果一般吧。

内插法,长度加一像素,就插进垂直的一列,其他的不变?(相反就删掉?)
那么高质量的是,取得缩放前的比例范围的平均作为那格的色相?

VC++、MinGW 和 GCC

MinGW 和 GCC哪里下载?
作者: DeathKing    时间: 2011-4-9 16:57
回复 一箭烂YiJL 的帖子

MinGW 和 GCC 在 SourceForge 上应该有托管。 GCC 要下 GCC for Windows。我的 GCC 都是好老的版本了。

C:\Documents and Settings\DeathKing>gcc --version
g++.exe (GCC) 3.4.0 (mingw special)
Copyright (C) 2004 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

作者: yangff    时间: 2011-4-9 19:10
谁叫你dump出来的……你敢直接把指针传过去然后当成
int *hi=point;
然后hi就是位图0,0的指针……我说了你去看看我的斜切的代码你就知道了……
高质量的代码可以看看二次线性插值和三次卷积插值……MS还有一个基于搞死函的= =
作者: 苏小脉    时间: 2011-4-10 11:33
本帖最后由 苏小脉 于 2011-4-10 11:40 编辑

回复 一箭烂YiJL 的帖子

内插法,长度加一像素,就插进垂直的一列,其他的不变?(相反就删掉?)

邻近内插是取源位图某个最近的点映射到目的地。

那么高质量的是,取得缩放前的比例范围的平均作为那格的色相?

这个勉强符合双线性内插法的思想。
再高级的还有用卷积插值的,用 Lagrange 的二元三点插值的,用二元全区间插值的,都是著名算法,网上有大量材料。

MinGW 和 GCC哪里下载?

http://www.mingw.org/wiki/InstallationHOWTOforMinGW
http://www.mingw.org/wiki/Getting_Started

第一个是手动安装,第二个好像是带了安装程序的。如果嫌麻烦就直接下包含了 GCC 的 Code::Block 吧:
codeblocks-10.05mingw-setup.exe:http://www.codeblocks.org/downloads/26
作者: 一箭烂YiJL    时间: 2011-4-10 20:07
本帖最后由 一箭烂YiJL 于 2011-4-10 22:01 编辑

回复 苏小脉 的帖子

感谢!!
下载了后者Code::Block,然后面对着一堆英语求助,如何创建一个C++的dll ? 怎么生成dll?
作者: 苏小脉    时间: 2011-4-11 03:46
一箭烂YiJL 发表于 2011-4-10 20:07
回复 苏小脉 的帖子

感谢!!

File -> New -> Project -> Dynamic Link Library,之后配置工程的一些信息,就会产生一个 DLL 的模版,build 之后生成 DLL。




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1