冒险解谜游戏中文网 ChinaAVG

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

作者: shane007    时间: 2009-6-2 11:54
标题: 【汉化任务简报】#27 图片交集像素抽出程序
现在假设有100张BMP图片,这些图片宽高互相之间都彼此相同,当然每张的宽和高都不一样。" j8 E2 |9 A5 u# m. _% ?
图片的背景都不同,但是上面都用一种颜色写着一个汉字,比如是黄色。
+ n( Y" C- p: h* |9 F* K要求抽出一些像素,这些像素满足以下条件* E& r) I$ }2 j6 V6 W! H

1 _; |6 K1 g( A6 l2 k; I4 u( f1. 颜色都相同是黄色
" q9 Y7 K9 }" P2 h1 X2.在图片中的位置x,y都相同
8 G' a. e$ w! h$ ^6 J) r- f3.这些点在每张图片中都出现
7 \% a5 n3 f+ I7 y& l: ^# E7 Z5 K$ V, k' u1 _
要求程序能对应24bit  bmp 和32bit bmp
% m: a6 h  V  U7 _  F: ]& H) g/ `; Y5 K% c4 S) c% w  g
把所有满足条件的点的x,y都输出到一个文本文件就行。
+ S0 F! A4 i6 r) J% g# _1 j; P这个程序主要是用来做图像识别的预处理。
作者: 肥牛    时间: 2009-6-3 20:13
查找像素的问题不难,难的是识别成文本文件。OCR的技术还是比较困难的。对于英文字体来说,26个字母+数字+符号可以生成码表查找,但是存在几个问题:
; s5 c5 }4 v9 E. D) B: E% s1、每个字符的宽度不同,这样在获取的时候有一定困难;! @4 j! r0 L* y9 t5 l; v- i2 `6 @+ g
2、文字字体假如不同,就需要建立不同的对码表;
; M% q0 C/ f% Z3 H4 v5 J3、如果是汉字,那需要的码表就更复杂了3 F$ F* j: q( a" t- o% e; ]  O
暂时只想到这些。
作者: shane007    时间: 2009-6-3 20:22
引用第1楼肥牛于2009-06-03 20:13发表的  :
9 j' H2 `7 \8 H$ G  ?% q# p查找像素的问题不难,难的是识别成文本文件。OCR的技术还是比较困难的。对于英文字体来说,26个字母+数字+符号可以生成码表查找,但是存在几个问题:0 p( B. n  @' F- C/ f/ Y3 I7 X
1、每个字符的宽度不同,这样在获取的时候有一定困难;
  R- J2 U+ [. `' _. m$ w# D2、文字字体假如不同,就需要建立不同的对码表;
( w: O% i1 W3 N. h3、如果是汉字,那需要的码表就更复杂了  s1 O# y5 h# w! K+ h( E# \# I
暂时只想到这些。

$ q8 M' `( X- B2 ]$ o0 @9 c7 J  v! y' d! ?0 W  S5 @
呵呵。这些问题我早就想到了。. Y0 G" x+ [+ T+ g; u
办法都有了,就是最近这几天的事情。
, h8 |* G( _9 p% L只是还来不及详细写出来。
- M6 o+ ?9 u/ a( F7 U& M, P你先看看我最近的帖子。
% p4 `' A3 N) p" g# O7 z8 M等等,我来解释。。。
作者: shane007    时间: 2009-6-3 20:31
你先看看这个帖子
; X2 \0 D7 e6 e$ A! h& ^https://www.chinaavg.com/read.php?tid=17369
% v0 ~6 ?4 X, @1 M$ i& w7 l, ~4 o( i$ {* G  S6 K' i1 B
其实对你的问题都有回答了,4 d) E0 {  ?" K9 H
字符的宽度和高度肯定要调整,通过修改xml和tga来调整。+ Q  @1 _9 W  a
我识别的不是字体,是色块和像素。+ w; ~( b; I* E3 G+ b8 m; K
也就是我说的变型条形码和2维码。
0 y! k: \" A* v2 o/ k2 u的确要建立码表。
$ Z" i  Q' p( J" s- p; A! O5 [7 X  I. ^4 g4 u* S% J- w: U4 H! E$ O
需要进一步解释吗?
作者: firendless    时间: 2009-6-4 21:14
VB,DELPHI都有一种异或笔刷,可以试一试~
' p* y  e4 u9 q! P. i/ oC的话调用GDI进行XOR应该可以,我先试一试去~
作者: firendless    时间: 2009-6-4 21:50
补个VB CODE..
! g5 n2 Z, d/ N  B% T
* T# r4 M8 T6 x7 x/ W# P- n/ @这个意思?
作者: shane007    时间: 2009-6-4 21:57
引用第5楼firendless于2009-06-04 21:50发表的  :3 A$ Z" [; y: x+ |
补个VB CODE..
" M, |$ y0 w, J0 f0 J) g7 J! Z4 i" T. N) t/ f
这个意思?
3 s5 O  H: J) X+ ~
你把代码放出来吧。
' s( Z, J! D% `: c* m  r) g光测试看不出对不对。
作者: 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
我刚才又看了一遍你的帖子,现在我的理解是这样的,你看看对不对。" `' q8 Z) J0 ~, f3 q5 Q; `% x
1、首先修改字体,让我们需要显示的文字等宽等高。9 W/ {$ i( f5 y9 v/ b4 J& c
2、然后修改要显示的文本,产生类似条码的东西。比如原来显示的Option,我们可能需要改成■ ■■■ ■1 r0 G( W0 y& T5 x7 g- |& m
3、修改文字显示的位置,尽量让每个场景的文字都显示在同一个地方。2 N' K* i0 q# F- f
4、另外运行一个程序,动态监测屏幕,发现类似条码的部分就去比照对码表,符合的就用DirectDraw技术将字幕覆盖原画面。
& s+ R. Y# x# r- V( T  }/ Q
7 ^6 r. N$ G5 P( N/ ~基于我上述的理解,我有几点不明白的地方:: U) M; g% l5 H& z
1、方块的显示用什么字符呢?
  L: w7 S& C! v+ j2、如果单纯是方块和空格的变化,那跟二进制差不多,需要的位数就会很长才能满足需要;# H4 }' H& ~# h4 p$ D7 m
3、关于像素级二维码,我没看明白。怎么生成?
作者: shane007    时间: 2009-6-4 22:26
肥牛,你真聪明!
! S) \' N' Z1 t  g0 ^" p你看懂了大约80%。
: s! {3 l( r; r' ]还有20%等我慢慢告诉你。
作者: shane007    时间: 2009-6-4 22:28
引用第9楼sspking于2009-06-04 22:06发表的  :
( U8 H' ~- S9 x& \  _4 l0 O这个事情不难,我给你写个小程式~
" ]3 o8 f' F1 ^" Z- R7 `/ k: M就是取一个图片,把图片中所有的指定颜色的XY坐标集输出到TXT中对吧?
6 I( z2 {+ f8 n4 s$ |' k
这个任务暂时取消了,本次ankh汉化暂时用不上这个。
作者: shane007    时间: 2009-6-4 22:47
1、首先修改字体,让我们需要显示的文字等宽等高。 ; q+ X# [/ ^- v) X/ q
理解正确
" p- B2 U& ~' I
: r7 R6 m* R$ T( M% x# I! N/ A2、然后修改要显示的文本,产生类似条码的东西。比如聪允镜腛ption,我们可能需要改成■ ■■■ ■ ! C3 X" `6 s8 K8 f9 D
基本理解正确。
: c" @. i3 E1 o, B: D条形码只用于识别屏幕下方黑色背景的字幕。 8 J! A- `- @' ~6 ]
注意图片字库有多个,就是说有多个tga. 9 E- ^$ u: x: m2 L9 W
; q1 c' e7 V& _) d; w/ T" x3 ]5 x
由于图片字库可以自己定义每个字符的宽高,我想定义2个宽高都是1个像素的字符。 , I+ Q. M* b, j8 s4 D& P; L7 l+ P, e" L
一个是有色点,一个是透明点。显示出来就是一个像素级的条形码。这个能理解吧。 2 |5 n: x4 \0 J: H- U  w% ^
) G8 [8 `" K+ V- ~- ^# |2 i. U' ~/ h/ e
3、修改文字显示的位置,尽量让每个场景的文字都显示在同一个地方。
" u' _* G+ r3 r: P理解正确
- @* G/ p/ W% @+ D
' l0 y% S$ w4 L3 Z5 z4 b  F* w0 t

  {/ q( _5 x6 I# i2 V0 k) \, I4、另外运行一个程序,动态监测屏幕,发现类似条码的部分就去比照对码表,符合的就用DirectDraw技术将字幕覆盖原画面。 . A5 ?+ P, z9 y2 L+ A
理解正确 ) @$ k. w# M; F7 `3 i2 }
这个游戏用的是dx9,不是DirectDraw。

( ]7 L: U4 h+ _, K: s8 `2 Adx9 proxy dll技术你可以再看看我发的帖子。 - t6 z8 m/ _: W- e* n  G
9 {* y! u, k2 d: e) s0 u
基于我上述的理解,我有几点不明白的地方:
  k. F, s2 {4 x, H) E1 \7 p* b1、方块的显示用什么字符呢? , w7 ^9 S/ n+ B  C. k
这个上面解释了
3 w* k. X5 y' P: {8 Z) k3 }$ H+ v
2、如果单纯是方块和空格的变化,那跟二进制差不多,需要的位数就会很长才能满足需要; - f; D' m- @" U* B  b
不错,要12-13 位,不过是像素级的,实际上很短。   G, t* K, U* _- c! z
就算比较长,我的字幕写上去之前,会先画个黑色矩形上去覆盖掉。
: D7 y: T8 L* a3 Q2 S% `8 g9 I所以不会有问题。
2 V( n. }) e% W: {. |# e" e, r8 Y8 z
3、关于像素级二维码,我没看明白。怎么生成?
  i# @6 }3 C6 W( ]1 G' f5 Q上面的都理解的话这个也不难。   P5 t9 T% |' h! X$ {' S5 s2 Q
道理和条形码类似,不过二维码和条形码用的不是同一个tga。
  ?% w$ v1 C( I0 z) m二维码对应屏幕中央字幕。 / d3 u1 K5 h3 B' k
条形码对应屏幕底部字幕。 ' X( O' J$ E1 ~# _/ w  L! ^  `
/ h9 r4 v7 u* ]8 J9 q8 L: E8 E( O
二维码是一个3x3 像素级的小块,这样面积最小,要知道,在屏幕中央字幕显示的时候。
+ V$ a2 s; s4 n5 T+ |$ k% x  M由于有游戏背景,所以不能先画一个黑色矩形上去,所以要求二维码的面积足够小。
9 t1 K6 D/ y  x* C( [1 }, T9 d
. B( E2 S3 k  ~6 C) _. w二维码 是一个ID 对应一个ASCII 码,再对应1个3x3 像素级的小块
3 E9 l$ l2 T/ C条形码 是一个ID 对应 12-13 个ASCII 码  再对应 12-13 个1x1 像素级的小块 7 W: @! C9 o  Q, @4 F. Q/ t
: |2 e, d# X* ], N; f' D
明白了吗?
作者: firendless    时间: 2009-6-4 22:56
我明白了...& E' n7 g2 r1 [* h' b) _, _
不过屏幕中央是个什么概念,1024x768的标准的话, (512,384)还是?
作者: shane007    时间: 2009-6-4 22:59
引用第15楼firendless于2009-06-04 22:56发表的  :
1 h9 H) @. E( n- L7 T* O9 t% t. j我明白了..." o* q3 s) z$ ~) ?  k/ [
不过屏幕中央是个什么概念,1024x768的标准的话, (512,384)还是?

5 J. Y. K$ I) V不是指屏幕的正中央,是指屏幕中部。
+ e- ^, S, k" O+ o你看过游戏画面就知道。




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