冒险解谜游戏中文网 ChinaAVG

标题: 【汉化任务简报】#27 图片交集像素抽出程序 [打印本页]

作者: shane007    时间: 2009-6-2 11:54
标题: 【汉化任务简报】#27 图片交集像素抽出程序
现在假设有100张BMP图片,这些图片宽高互相之间都彼此相同,当然每张的宽和高都不一样。
( Z$ n1 C- w* _! U图片的背景都不同,但是上面都用一种颜色写着一个汉字,比如是黄色。
# a, W4 H3 Y% V; G# L1 ^& r) V要求抽出一些像素,这些像素满足以下条件
1 E& h+ F7 j( s$ x% A$ O
0 D4 `$ [/ @0 K( B3 Z3 K# d: K1. 颜色都相同是黄色
+ v- s; i* d- ~1 P& D2.在图片中的位置x,y都相同9 h! w3 ~2 ^' M& O$ L( d$ z- J2 M
3.这些点在每张图片中都出现
+ Q7 t% l- S! P" g; b$ l& B/ c5 z; u: ^9 ?) H
要求程序能对应24bit  bmp 和32bit bmp
2 g+ l; n' x, a% K( ?' H; q( _6 \: o  X/ ?; F
把所有满足条件的点的x,y都输出到一个文本文件就行。: t/ @7 L: G' a* ?% a( G  y
这个程序主要是用来做图像识别的预处理。
作者: 肥牛    时间: 2009-6-3 20:13
查找像素的问题不难,难的是识别成文本文件。OCR的技术还是比较困难的。对于英文字体来说,26个字母+数字+符号可以生成码表查找,但是存在几个问题:6 ~3 I, ?7 u- Z% P7 A$ M
1、每个字符的宽度不同,这样在获取的时候有一定困难;, V3 L4 ^( \' [0 l8 ]( r/ w
2、文字字体假如不同,就需要建立不同的对码表;
; \  \% z& J% a. O) T& J8 u" \3、如果是汉字,那需要的码表就更复杂了
: a4 W" _# t# t$ C暂时只想到这些。
作者: shane007    时间: 2009-6-3 20:22
引用第1楼肥牛于2009-06-03 20:13发表的  :, l* ^, f1 S) y! _) _6 _
查找像素的问题不难,难的是识别成文本文件。OCR的技术还是比较困难的。对于英文字体来说,26个字母+数字+符号可以生成码表查找,但是存在几个问题:2 Q/ l3 Y& @* B/ I% a, ]
1、每个字符的宽度不同,这样在获取的时候有一定困难;( R( U! Z  l7 X7 h; e
2、文字字体假如不同,就需要建立不同的对码表;
" _, H& I9 T* [" s$ @" x3、如果是汉字,那需要的码表就更复杂了
" m# \9 K# ]' x) \" j暂时只想到这些。

" n8 S4 H; C' p# f; _7 R; H, ^  X2 Z$ c1 m" B( Y8 p
呵呵。这些问题我早就想到了。- ~6 s& T1 B8 @4 F; `/ q! F* u
办法都有了,就是最近这几天的事情。
& u. i* ^9 R" B只是还来不及详细写出来。
; M5 i) c/ B# U+ j你先看看我最近的帖子。- U  D, W6 d+ a" A' t2 i2 G
等等,我来解释。。。
作者: shane007    时间: 2009-6-3 20:31
你先看看这个帖子
8 v3 F& E) c/ G; W! fhttps://www.chinaavg.com/read.php?tid=17369* K2 C6 S6 {7 A
8 O. J: q5 M4 ^! P: @" B
其实对你的问题都有回答了,
0 ]8 E) O' ^3 z( w# ^8 t4 s. j+ O字符的宽度和高度肯定要调整,通过修改xml和tga来调整。
6 u, m) r" m. q. c: ^  O2 o( ^我识别的不是字体,是色块和像素。/ ?" H/ X3 }. O6 C' O
也就是我说的变型条形码和2维码。
) g' B4 w" b: N$ p/ ~& r的确要建立码表。5 _) D$ ~7 j$ c1 L3 Z

) l! f4 S" v1 R需要进一步解释吗?
作者: firendless    时间: 2009-6-4 21:14
VB,DELPHI都有一种异或笔刷,可以试一试~
; M% z  d8 m( Z' v) hC的话调用GDI进行XOR应该可以,我先试一试去~
作者: firendless    时间: 2009-6-4 21:50
补个VB CODE..! c( s2 K9 C" `9 ^1 O0 U% K0 T
0 @0 ]6 h2 g( a* ~
这个意思?
作者: shane007    时间: 2009-6-4 21:57
引用第5楼firendless于2009-06-04 21:50发表的  :
5 M, J1 O2 P5 |6 E) W补个VB CODE..
* s! j# J) A( m5 ?  E$ C5 L2 l
( g- _' j9 y% P这个意思?
6 i. r+ }( P6 `9 {) Z6 O& u
你把代码放出来吧。
) j, t) _8 ~$ w光测试看不出对不对。
作者: firendless    时间: 2009-6-4 22:02
别说丑...种子扫描算法..[就是平推]
  1. Option Explicit
  2. Private Declare Function GetPixel _
  3.                 Lib "gdi32" (ByVal hdc As Long, _
  4.                              ByVal x As Long, _
  5.                              ByVal y As Long) As Long
  6. Private Sub cmdText_Click()
  7.     With picBox
  8.         .Cls
  9.         .ForeColor = vbYellow
  10.         picBox.Print "This is a test."
  11.     End With
  12. End Sub
  13. Private Sub cmdWork_Click()
  14.     Dim x      As Single, y As Single, w As Single, h As Single
  15.     Dim strOut As String, strTmp As String, lngTmp As Long
  16.     With picBox
  17.         w = .Width
  18.         h = .Height
  19.     End With
  20.     strOut = ""
  21.     strTmp = ""
  22.     For x = 0 To w
  23.         For y = 0 To h
  24.             lngTmp = GetPixel(picBox.hdc, x, y)
  25.             If lngTmp = 0 Then
  26.                 strTmp = "x:" & x & " y:" & y & vbNewLine
  27.                 strOut = strOut & strTmp
  28.    
  29.             End If
  30.    
  31.         Next
  32.    
  33.     Next
  34.     txtOut = strOut
  35. End Sub
  36. Private Sub cmdXor_Click()
  37.     With picBox
  38.         .DrawMode = vbXorPen
  39.         picBox.Line (0, 0)-(.Width, .Height), vbYellow, BF
  40.     End With
  41. End Sub
复制代码

作者: shane007    时间: 2009-6-4 22:05
放着,以后可能会有用。
作者: sspking    时间: 2009-6-4 22:06
提示: 作者被禁止或删除 内容自动屏蔽
作者: firendless    时间: 2009-6-4 22:09
这个帖子回复的人不少么,我放一个C code
  1. public   void   DrawXORRectangle(   Graphics   grp,
  2.                                                             int   X1,   int   Y1,   int   X2,   int   Y2   )
  3. {
  4. //   Extract   the   Win32   HDC   from   the   Graphics   object   supplied.
  5. IntPtr   hdc   =   grp.GetHdc();
  6. //   Create   a   pen   with   a   dotted   style   to   draw   the   border   of   the
  7. //   rectangle.
  8. IntPtr   gdiPen   =   CreatePen(   penStyle,
  9.                             1,   BLACK_PEN   );
  10. //   Set   the   ROP   cdrawint   mode   to   XOR.
  11. SetROP2(   hdc,   R2_XORPEN   );
  12. //   Select   the   pen   into   the   device   context.
  13. IntPtr   oldPen   =   SelectObject(   hdc,   gdiPen   );
  14. //   Create   a   stock   NULL_BRUSH   brush   and   select   it   into   the   device
  15. //   context   so   that   the   rectangle   isn 't   filled.
  16. IntPtr   oldBrush   =   SelectObject(   hdc,
  17.                                           GetStockObject(   NULL_BRUSH   )   );
  18. //   Now   XOR   the   hollow   rectangle   on   the   Graphics   object   with
  19. //   a   dotted   outline.
  20. Rectangle(   hdc,   X1,   Y1,   X2,   Y2   );
  21. //   Put   the   old   stuff   back   where   it   was.
  22. SelectObject(   hdc,   oldBrush   );   //   no   need   to   delete   a   stock   object
  23. SelectObject(   hdc,   oldPen   );
  24. DeleteObject(   gdiPen   ); //   but   we   do   need   to   delete   the   pen
  25. //   Return   the   device   context   to   Windows.
  26. grp.ReleaseHdc(   hdc   );
  27. }
复制代码

作者: 肥牛    时间: 2009-6-4 22:21
我刚才又看了一遍你的帖子,现在我的理解是这样的,你看看对不对。& v5 J5 H- ^: J# Q- D' E
1、首先修改字体,让我们需要显示的文字等宽等高。
5 ]& n7 T! N8 |4 D2、然后修改要显示的文本,产生类似条码的东西。比如原来显示的Option,我们可能需要改成■ ■■■ ■
# I, P4 u, M8 d" i6 Z3、修改文字显示的位置,尽量让每个场景的文字都显示在同一个地方。
( b: e0 z4 e5 E/ K- ~: {4、另外运行一个程序,动态监测屏幕,发现类似条码的部分就去比照对码表,符合的就用DirectDraw技术将字幕覆盖原画面。
5 i. a0 u7 |  i& f: e; c+ p; i2 f; G3 v* @4 I  f
基于我上述的理解,我有几点不明白的地方:
$ l8 i9 r3 s. r. U! w+ F1、方块的显示用什么字符呢?0 |$ \! M4 K5 Y% t3 p$ Z
2、如果单纯是方块和空格的变化,那跟二进制差不多,需要的位数就会很长才能满足需要;% r; T* G  A$ q) Z# b
3、关于像素级二维码,我没看明白。怎么生成?
作者: shane007    时间: 2009-6-4 22:26
肥牛,你真聪明!
( y& k! D' O5 S6 j你看懂了大约80%。4 E. x2 g8 d' a( G/ W* X
还有20%等我慢慢告诉你。
作者: shane007    时间: 2009-6-4 22:28
引用第9楼sspking于2009-06-04 22:06发表的  :
8 |' [2 l/ z4 k0 |8 E2 F1 `/ r这个事情不难,我给你写个小程式~
; Q/ c+ r/ W4 `! M, x) F4 J! v就是取一个图片,把图片中所有的指定颜色的XY坐标集输出到TXT中对吧?

( J& h0 I% A; B" w' ]# [( \& x: r这个任务暂时取消了,本次ankh汉化暂时用不上这个。
作者: shane007    时间: 2009-6-4 22:47
1、首先修改字体,让我们需要显示的文字等宽等高。
! X) F8 E' [* D; p理解正确
/ j/ P' ]7 O. Y! T6 R# ^& R5 p
8 a) W& c! P7 I/ @2、然后修改要显示的文本,产生类似条码的东西。比如聪允镜腛ption,我们可能需要改成■ ■■■ ■ 0 v% g# z& u' m
基本理解正确。 1 c6 d+ m2 G% T( R$ ?) @4 M; J
条形码只用于识别屏幕下方黑色背景的字幕。 9 M& L0 [% v7 W2 f9 X
注意图片字库有多个,就是说有多个tga.
! c+ A% e. h2 d! `  T1 W, R
9 q6 q4 r. b( a由于图片字库可以自己定义每个字符的宽高,我想定义2个宽高都是1个像素的字符。 : a' ]# B3 P- O
一个是有色点,一个是透明点。显示出来就是一个像素级的条形码。这个能理解吧。
( d# H$ h0 @0 m% `) ]& o  }/ Z  N7 s9 s2 A! v/ ~- T6 J! r2 _2 H6 F
3、修改文字显示的位置,尽量让每个场景的文字都显示在同一个地方。 8 z' L. b: v5 j% Q' B
理解正确 2 p$ ]5 s6 d. z: f1 R

" F' `4 c7 x7 M1 e( p
7 T" M9 J5 g5 l5 t& V8 @) I4、另外运行一个程序,动态监测屏幕,发现类似条码的部分就去比照对码表,符合的就用DirectDraw技术将字幕覆盖原画面。
7 k' A/ M' _. G7 q& z理解正确
5 v$ \- A& B7 X+ E# M2 I这个游戏用的是dx9,不是DirectDraw。
3 P" j; P8 \; P: N9 I
dx9 proxy dll技术你可以再看看我发的帖子。 3 `- \1 }: r4 n; Y6 q6 `

( S2 C( v4 B) ]3 x基于我上述的理解,我有几点不明白的地方:
; d4 |& V( y3 E! M( V1、方块的显示用什么字符呢? : y3 M( U1 S3 }
这个上面解释了 3 s5 }, ^6 F# `) @, P2 o8 x

4 ?* V( d. N, p4 Q  u2、如果单纯是方块和空格的变化,那跟二进制差不多,需要的位数就会很长才能满足需要; ) k& B% X, |3 j/ {5 ]: E5 R
不错,要12-13 位,不过是像素级的,实际上很短。 $ M2 Q5 w5 g! n
就算比较长,我的字幕写上去之前,会先画个黑色矩形上去覆盖掉。
4 e9 R8 u) y- u2 y0 C  c所以不会有问题。
+ O/ O# S4 j3 z, W( j! p; x4 u) R1 D
3、关于像素级二维码,我没看明白。怎么生成? 7 O* P. S7 J2 r& T+ r. L/ i
上面的都理解的话这个也不难。
2 b* y) s7 |; A' ~, m6 U5 Y- H+ K' F道理和条形码类似,不过二维码和条形码用的不是同一个tga。
1 {  X* G9 F) h$ I9 ~, \- G' J二维码对应屏幕中央字幕。 ( y. y6 \  Q7 n6 V8 l8 h  n' [9 I2 J
条形码对应屏幕底部字幕。 ( A+ }% f! f5 [( S7 P* q" r. T4 f; D
- ?8 x2 a) C" A  u
二维码是一个3x3 像素级的小块,这样面积最小,要知道,在屏幕中央字幕显示的时候。
5 ]4 z9 K/ e9 G( e& R6 @9 y$ j由于有游戏背景,所以不能先画一个黑色矩形上去,所以要求二维码的面积足够小。 % E+ y' N( G$ y) O! _% |; L4 V
; }0 C$ V) ^. g& A$ i+ n
二维码 是一个ID 对应一个ASCII 码,再对应1个3x3 像素级的小块 1 Y0 {" H. c% @* E7 w
条形码 是一个ID 对应 12-13 个ASCII 码  再对应 12-13 个1x1 像素级的小块 3 J% U% D2 H$ n
+ e6 C3 e3 R- z7 k# q( G# I# U; L. f
明白了吗?
作者: firendless    时间: 2009-6-4 22:56
我明白了...
% U. u4 e1 q& N( |# D, G" D+ M不过屏幕中央是个什么概念,1024x768的标准的话, (512,384)还是?
作者: shane007    时间: 2009-6-4 22:59
引用第15楼firendless于2009-06-04 22:56发表的  :
2 i! V+ }) S1 R; ~) T' a- W我明白了...  q- }& M& b+ ]( @2 |  Q! K
不过屏幕中央是个什么概念,1024x768的标准的话, (512,384)还是?

2 x# z" |) O% V4 U' g: l! z7 \6 c' `! K不是指屏幕的正中央,是指屏幕中部。
1 }% l1 r# |  P5 L& f5 v; g  O你看过游戏画面就知道。




欢迎光临 冒险解谜游戏中文网 ChinaAVG (https://chinaavg.com/) Powered by Discuz! X3.2