冒险解谜游戏中文网 ChinaAVG

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

作者: shane007    时间: 2009-6-2 11:54
标题: 【汉化任务简报】#27 图片交集像素抽出程序
现在假设有100张BMP图片,这些图片宽高互相之间都彼此相同,当然每张的宽和高都不一样。
/ L5 X& |5 W1 ]8 G' v图片的背景都不同,但是上面都用一种颜色写着一个汉字,比如是黄色。2 u+ x4 w7 l. s- }
要求抽出一些像素,这些像素满足以下条件& t* {4 [3 }  k
7 i# p5 Z' R: T9 n
1. 颜色都相同是黄色: N9 l: q  ]# h. B
2.在图片中的位置x,y都相同
$ ~. @& w: x( D1 s3.这些点在每张图片中都出现! k- X1 J1 l# o1 |

) \7 p0 s3 F7 ~4 S, k& M- z要求程序能对应24bit  bmp 和32bit bmp1 l% w3 E' @& J+ j3 H4 ]+ h3 L

5 R- A+ l0 G# F6 a* h1 d把所有满足条件的点的x,y都输出到一个文本文件就行。
% W, R/ Q# N: n这个程序主要是用来做图像识别的预处理。
作者: 肥牛    时间: 2009-6-3 20:13
查找像素的问题不难,难的是识别成文本文件。OCR的技术还是比较困难的。对于英文字体来说,26个字母+数字+符号可以生成码表查找,但是存在几个问题:
# x: J2 `; j7 |" r1、每个字符的宽度不同,这样在获取的时候有一定困难;
9 }- ]1 r* h0 t. {2、文字字体假如不同,就需要建立不同的对码表;
& m( r! O5 P8 V# g5 e" a5 A3、如果是汉字,那需要的码表就更复杂了
8 f) S" j3 V1 X7 f! T% K暂时只想到这些。
作者: shane007    时间: 2009-6-3 20:22
引用第1楼肥牛于2009-06-03 20:13发表的  :
% y  N8 q: n) f- z7 p% z查找像素的问题不难,难的是识别成文本文件。OCR的技术还是比较困难的。对于英文字体来说,26个字母+数字+符号可以生成码表查找,但是存在几个问题:
0 C7 i4 e+ l) [" ]1、每个字符的宽度不同,这样在获取的时候有一定困难;
& f9 u' G" g% S+ }' }2、文字字体假如不同,就需要建立不同的对码表;
" k- f, i& V# D- M3、如果是汉字,那需要的码表就更复杂了# e, |7 @* s1 [: z' B
暂时只想到这些。

% |7 w2 r; m% ~8 h0 ?, \. A4 c7 \
呵呵。这些问题我早就想到了。
8 n% G0 l9 C# c" d, C7 H+ S# i/ o办法都有了,就是最近这几天的事情。
. q" j/ z8 `! B2 o: F5 t! ~只是还来不及详细写出来。
4 F7 N2 a+ \3 v0 \! Y你先看看我最近的帖子。  f: |' \5 A/ c$ q+ o/ d: }2 U5 X
等等,我来解释。。。
作者: shane007    时间: 2009-6-3 20:31
你先看看这个帖子
5 V' k. ~* D  }: h" zhttps://www.chinaavg.com/read.php?tid=17369
1 m; f- Q) [3 e( L  g$ x  {- n" ^: u) E
其实对你的问题都有回答了,
: @. y1 [  P; @字符的宽度和高度肯定要调整,通过修改xml和tga来调整。
. M5 R" A0 Z# c) h: O0 J我识别的不是字体,是色块和像素。) v9 W/ ]8 h2 x1 u$ j8 `
也就是我说的变型条形码和2维码。: R9 Z  j9 }" L+ u4 }
的确要建立码表。% h( A/ F" Q9 s3 `. O" s+ P+ ]6 N

- }( S" a$ @& q: W" d- t* a+ H需要进一步解释吗?
作者: firendless    时间: 2009-6-4 21:14
VB,DELPHI都有一种异或笔刷,可以试一试~
7 G+ K+ q! V) kC的话调用GDI进行XOR应该可以,我先试一试去~
作者: firendless    时间: 2009-6-4 21:50
补个VB CODE..
  c8 ^6 ~+ j/ g& R2 S9 Q6 U) n) f7 ~' Y5 u2 p/ m% W, l
这个意思?
作者: shane007    时间: 2009-6-4 21:57
引用第5楼firendless于2009-06-04 21:50发表的  :  j, @% Z/ E. a9 F, o
补个VB CODE..& J4 E  w* U6 C4 S5 i
8 w' J2 o1 R& q& J6 \
这个意思?

( u! M: u# B  a6 ?/ }1 I  X你把代码放出来吧。' k1 z5 E/ j# L5 G! C
光测试看不出对不对。
作者: 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
我刚才又看了一遍你的帖子,现在我的理解是这样的,你看看对不对。7 }6 Z6 _2 k" S
1、首先修改字体,让我们需要显示的文字等宽等高。! Z, T( P8 m6 e4 v3 P' e
2、然后修改要显示的文本,产生类似条码的东西。比如原来显示的Option,我们可能需要改成■ ■■■ ■, K: g- u$ k8 Q/ N( p! Z; Q; o
3、修改文字显示的位置,尽量让每个场景的文字都显示在同一个地方。
- q1 l5 M& _  S2 q( x0 B9 b5 u+ z4、另外运行一个程序,动态监测屏幕,发现类似条码的部分就去比照对码表,符合的就用DirectDraw技术将字幕覆盖原画面。
3 Z6 |3 u  c% y% D# ^; D7 i
9 i; p* L( k2 U) C- t基于我上述的理解,我有几点不明白的地方:3 O3 A& r' j4 a$ v# H0 s/ N  c( y
1、方块的显示用什么字符呢?
) e+ b. g/ @# x( a! O' c2、如果单纯是方块和空格的变化,那跟二进制差不多,需要的位数就会很长才能满足需要;
, _, s# o0 E# k* S, x$ r5 o3、关于像素级二维码,我没看明白。怎么生成?
作者: shane007    时间: 2009-6-4 22:26
肥牛,你真聪明!
9 i7 Q+ n" o# u; {9 w你看懂了大约80%。* _7 m. e- ~. k' U3 U3 e3 m
还有20%等我慢慢告诉你。
作者: shane007    时间: 2009-6-4 22:28
引用第9楼sspking于2009-06-04 22:06发表的  :
+ G' O4 i% y, a' u2 c. a) g: I- i这个事情不难,我给你写个小程式~1 C: O* f! T( T4 D
就是取一个图片,把图片中所有的指定颜色的XY坐标集输出到TXT中对吧?

, U4 W1 H7 q$ y9 m这个任务暂时取消了,本次ankh汉化暂时用不上这个。
作者: shane007    时间: 2009-6-4 22:47
1、首先修改字体,让我们需要显示的文字等宽等高。
6 O/ q$ `) c# h+ W2 t8 i" J理解正确
" I+ L; l$ ^) g3 g! C* h# @) n0 O0 v7 ]' B1 l0 x5 ?( w
2、然后修改要显示的文本,产生类似条码的东西。比如聪允镜腛ption,我们可能需要改成■ ■■■ ■
4 B4 `& C, _( L  f; g0 J基本理解正确。
; G+ l6 L9 l" |6 t) r& P条形码只用于识别屏幕下方黑色背景的字幕。
( h( G* @/ u0 K, g" p& s5 f$ q注意图片字库有多个,就是说有多个tga.
6 p( d) ]3 x' d' I% p4 _+ g# b& w9 b
+ v3 }" w; n" E2 c& E7 z7 W7 }由于图片字库可以自己定义每个字符的宽高,我想定义2个宽高都是1个像素的字符。 , h& d  y" k1 R& s! H% ~$ s
一个是有色点,一个是透明点。显示出来就是一个像素级的条形码。这个能理解吧。
, N! M7 v9 Y8 c/ K7 r
4 u& j" O2 u. ~( [& n, z+ [* s! h3、修改文字显示的位置,尽量让每个场景的文字都显示在同一个地方。
+ q* ^% i& }' Z! }: Y7 ^理解正确 # c1 |2 L7 W7 e% w+ T

$ O# {* \& o1 R
; M( \- S% N& ~" ~% d( M6 }2 W4、另外运行一个程序,动态监测屏幕,发现类似条码的部分就去比照对码表,符合的就用DirectDraw技术将字幕覆盖原画面。
7 l- v: x/ O0 |8 q理解正确 0 u  A2 ~2 |$ ~3 I
这个游戏用的是dx9,不是DirectDraw。
- X2 V% e: [8 i; L6 j
dx9 proxy dll技术你可以再看看我发的帖子。
0 l6 \# [& K+ L
! R( [& \' h- g3 \$ @6 i基于我上述的理解,我有几点不明白的地方:
- V, W) p5 e* N& z) l1、方块的显示用什么字符呢?
- I! K4 \0 ]2 j  V" h& q9 M这个上面解释了 - J* S( b4 I  {$ L6 Q% c3 b
6 ~: q" ^3 n% a% b: s
2、如果单纯是方块和空格的变化,那跟二进制差不多,需要的位数就会很长才能满足需要; & q! b1 ]' E% D7 J8 T
不错,要12-13 位,不过是像素级的,实际上很短。
9 p6 \9 l; @' j1 `  `- O就算比较长,我的字幕写上去之前,会先画个黑色矩形上去覆盖掉。 9 q3 u# F! Z  j# \+ m$ \; o
所以不会有问题。 ! j% U; F# _" l! {6 s9 G
& r# h, l- }8 A& l0 S- [) O
3、关于像素级二维码,我没看明白。怎么生成?
6 e: U7 {: |" F+ g; k2 ?9 y% _上面的都理解的话这个也不难。
; I% m# d* n9 T" |道理和条形码类似,不过二维码和条形码用的不是同一个tga。
# A" V3 X0 Z1 n7 X, i8 o/ m# R二维码对应屏幕中央字幕。
: _9 ]" j. o7 _/ Q  f" ]" x' E条形码对应屏幕底部字幕。
) e& Z% K+ l& o1 U, m2 q6 ?9 y, Z: ~  R' _' u
二维码是一个3x3 像素级的小块,这样面积最小,要知道,在屏幕中央字幕显示的时候。 % @: t  y8 W6 @% P# f# \, ]
由于有游戏背景,所以不能先画一个黑色矩形上去,所以要求二维码的面积足够小。 % ?& z" a$ |0 D) A. h+ j7 d* ~
0 C$ B7 Q- S2 T0 u2 |, p
二维码 是一个ID 对应一个ASCII 码,再对应1个3x3 像素级的小块
, g: }! H8 `3 V3 L% V2 s: S条形码 是一个ID 对应 12-13 个ASCII 码  再对应 12-13 个1x1 像素级的小块
0 \8 ^9 j5 e, ?; u% V. D' p* T" z$ o' h+ t  T: ^$ P) |
明白了吗?
作者: firendless    时间: 2009-6-4 22:56
我明白了...! X: \! E5 ?, `: d% a8 f0 q( S
不过屏幕中央是个什么概念,1024x768的标准的话, (512,384)还是?
作者: shane007    时间: 2009-6-4 22:59
引用第15楼firendless于2009-06-04 22:56发表的  :
+ n6 ?/ A0 i# }" k  D! s我明白了...+ P5 K+ K: ^" Z" m
不过屏幕中央是个什么概念,1024x768的标准的话, (512,384)还是?

$ v, s0 W3 p+ C% k; L; z不是指屏幕的正中央,是指屏幕中部。  i5 f' w! [, }8 l3 z( }+ E" S, n* a
你看过游戏画面就知道。




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