рдЙрдкрдпреЛрдЧреА рдУрдкрди рд╕реЛрд░реНрд╕ рдФрд░ рдХреИрд╕реЗ рд╣рдордиреЗ рдЬрд╝реЙрдХреНрд╕рд┐рдВрдЧ рдХреЛ рджреВрд╕рд░реА рднрд╛рд╖рд╛ рдмреЛрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд┐рдЦрд╛рдпрд╛

рд╣рдорд╛рд░реЗ рдПрдХ рд▓реЗрдЦ рдореЗрдВ, рд╣рдордиреЗ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХреА рдХрд┐ рдЖрдк рд╕реНрдХреИрди рдХрд┐рдП рдЧрдП рдХреВрдкрди рд╡рд╛рд▓реЗ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдФрд░ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП SharePoint 2010 рдореЗрдВ рдЗрдирдмреЙрдХреНрд╕ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдореЗрдВ, рд╣рдореЗрдВ рдХрдИ рджрд┐рд▓рдЪрд╕реНрдк рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдирд╛ рдкрдбрд╝рд╛ред рдФрд░ рдЕрдм рд╣рдо рдПрдХ рдмрд┐рдВрджреБ рдкрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдзреНрдпрд╛рди рджреЗрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред



рдЗрд╕рд▓рд┐рдП, рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреВрдкрди рд╕реНрдХреИрди рд╢реАрдЯ рдкрд░ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЛ рдкрд╣рдЪрд╛рдирдирд╛ рдерд╛ред рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдХрдИ рдХреВрдкрди рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рд╡реЗ рдПрдХ рд╢реАрдЯ рдкрд░ рджреЛрдиреЛрдВ рд▓рдВрдмрд╡рдд рдФрд░ рдХреНрд╖реИрддрд┐рдЬ рд░реВрдк рд╕реЗ рд╕реНрдерд┐рдд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред

рд╣рдордиреЗ рдХреВрдкрди рд╕реНрдХреИрди рдкрд░ рдЬреЛ рджреЗрдЦрд╛, рд╡рд╣ рдХреЛрдбрдмрд╛рд░ рдмрд╛рд░рдХреЛрдб рд╕реЗ рдХрд╛рдлреА рдорд┐рд▓рддрд╛-рдЬреБрд▓рддрд╛ рдерд╛, рдЬрд┐рд╕рдХрд╛ рд╕рд╛рдордирд╛ рд╣рдо рдкрд╣рд▓реЗ рд╣реА рджреВрд╕рд░реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯреНрд╕ рдкрд░ рдХрд░ рдЪреБрдХреЗ рдереЗред



рдХреЛрдбрдмрд╛рд░ рдПрдХ рд░реИрдЦрд┐рдХ рдмрд╛рд░рдХреЛрдб рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдЪрд░рд┐рддреНрд░ рдХреЛ 7 рддрддреНрд╡реЛрдВ рджреНрд╡рд╛рд░рд╛ рдПрдиреНрдХреЛрдб рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ: рдЙрдирдХреЗ рдмреАрдЪ 4 рд▓рд╛рдЗрдиреЗрдВ рдФрд░ 3 рд░рд┐рдХреНрдд рд╕реНрдерд╛рдиред рд╕реНрд╡рдпрдВ рдХреЗ рдмреАрдЪ, рд╡рд░реНрдг рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реНрдерд╛рди рд╕реЗ рдЕрд▓рдЧ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВред рдХреЛрдбрд╛рдмрд╛рд░ рдПрдХ рд╢реБрд░реБрдЖрддреА рдЪрд░рд┐рддреНрд░ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдПрдХ рд╕реНрдЯреЙрдк рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИред рдкреНрд░рддреАрдХреЛрдВ рдХреЛ рд╢реБрд░реВ рдХрд░рдирд╛ рдпрд╛ рд░реЛрдХрдирд╛, рдПрдХ рдирд┐рдпрдо рдХреЗ рд░реВрдк рдореЗрдВ, рдПрдмреАрд╕реАрдбреА рдкреНрд░рддреАрдХ рд╣реИрдВред рдЬрд╛рдирдХрд╛рд░реАрдкреВрд░реНрдг: 0-9, -, $ред
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЗрд╕ рдмрд╛рд░рдХреЛрдб рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд░реНрдгрдорд╛рд▓рд╛ рд╣реИ рдЬрд╣рд╛рдВ рдкреНрд░рддреНрдпреЗрдХ рд╡рд░реНрдг рд▓рд╛рдЗрдиреЛрдВ рдФрд░ рд░рд┐рдХреНрдд рд╕реНрдерд╛рди рдХреЗ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдЕрдиреБрдХреНрд░рдо рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИред


рдЪрд┐рддреНрд░ рдХреЛрдбрдмрд╛рд░ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджрд┐рдЦрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдореВрд▓реНрдп "401" рд╣реИред

ZXing


.NET рдореЗрдВ рдмрд╛рд░рдХреЛрдб рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп, рд╣рдо рдЬрд╝рдХреНрд╕рд┐рдВрдЧ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рдПрдХ рдкреЛрд░реНрдЯ рдХрд┐рдП рдЧрдП рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдкреБрд╕реНрддрдХрд╛рд▓рдп 1 рдбреА рдФрд░ 2 рдбреА рдмрд╛рд░рдХреЛрдб рдХреЗ рд╕рднреА рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдЙрддреНрдкрдиреНрди рдФрд░ рдкрд╣рдЪрд╛рди рд╕рдХрддреЗ рд╣реИрдВ: рдХреНрдпреВрдЖрд░-рдХреЛрдб, рдкреАрдбреАрдПрдл 417, рдИрдПрдПрди, рдпреВрдкреАрд╕реА, рдПрдЬрд╝реНрдЯреЗрдХ, рдбреЗрдЯрд╛ рдореИрдЯреНрд░рд┐рдХреНрд╕ред рдФрд░ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд, рд╡рд╣ рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рдХреЛрдбреИрдмрд░ рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рдирд╛ рд╣реИред рдЬрд╝рдХреНрд╕рд┐рдВрдЧ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдЖрдо рддреМрд░ рдкрд░ рд╕рдорд╕реНрдпрд╛рдПрдВ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИрдВ, рд╣рдордиреЗ рд╡рд┐рднрд┐рдиреНрди рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдореЛрдВ рдкрд░ рдЗрд╕рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ред рд▓реЗрдХрд┐рди рд╣рдорд╛рд░рд╛ рдмрд╛рд░рдХреЛрдб рдЬрд╝реЙрдХреНрд╕рд┐рдВрдЧ рддреБрд░рдВрдд рдкрд╣рдЪрд╛рдирдиреЗ рдореЗрдВ рд╡рд┐рдлрд▓ рд░рд╣рд╛ред рд╕рдм рдХреБрдЫ рдЗрддрдирд╛ рдЖрд╕рд╛рди рдирд╣реАрдВ рдирд┐рдХрд▓рд╛ ... рд╕рд╛рд╡рдзрд╛рди рдкрд░реАрдХреНрд╖рд╛ рдХреЗ рдмрд╛рдж, рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рдЧреНрд░рд╛рд╣рдХ рдХреЛрдб, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдХреЛрдбреНрд░рд╛рдмрд░ рдХреЗ рд╕рдорд╛рди рд╣реА, рдлрд┐рд░ рднреА рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╣реИрдВ:


рд╢рд╛рдпрдж рдпрд╣ рдкреНрд░рд╛рд░реВрдк "рдорд╛рдирдХ" рднреА рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╣рдореЗрдВ рдЗрд╕рдХреЗ рд╡рд┐рд╕реНрддреГрдд рд╡рд┐рд╡рд░рдг рдФрд░ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдирд╣реАрдВ рдорд┐рд▓реАред рд╢рд╛рдпрдж рдЗрд╕ рдХреЛрдб рдХреА рдорд╛рдиреНрдпрддрд╛ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╣рдо рдЙрдиреНрд╣реЗрдВ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рднрд╛рдЧреНрдпрд╢рд╛рд▓реА рдирд╣реАрдВ рдереЗ ... рдирддреАрдЬрддрди, рдЬрд╝рдХреНрд╕рд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦрдиреЗ рдФрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдЧрдпрд╛: рд╕реНрд░реЛрдд рдХреЛрдб рд▓реЗрдВ рдФрд░ рдорд╛рдиреНрдпрддрд╛ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЛ рдЕрдкрдиреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдореЗрдВ рдмрджрд▓реЗрдВред

рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо


Zxing рдореЗрдВ, рдкреНрд░рддреНрдпреЗрдХ рд╡рд░реНрдЧ рдЬреЛ рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рдХреЛрдб рдХреА рдорд╛рдиреНрдпрддрд╛ рдХреЗ рддрд░реНрдХ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, CodabarReader.cs), OneDReader.cs рд╡рд░реНрдЧ рдореЗрдВ рдШреЛрд╖рд┐рдд рд╕рд╛рд░ рдбрд┐рдХреЛрдбрд░ рд╡рд┐рдзрд┐ рдХрд╛ рдЕрдкрдирд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИред

override public List<Result> decodeRow(int rowNumber, BitArray row, Hashtable hints) 


рдЗрдирдкреБрдЯ рдЫрд╡рд┐ рдХреА рд▓рд╛рдЗрди рд╕рдВрдЦреНрдпрд╛ рдФрд░ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рд░рдгреА рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд░реЗрдЦрд╛ рдХреЗ рдкрд┐рдХреНрд╕реЗрд▓ рдорд╛рди (рдбрд╛рд░реНрдХ - рд▓рд╛рдЗрдЯ) рд╣реЛрддреЗ рд╣реИрдВред

рдлрд┐рд░, рд╕реЗрдЯрдХрд╛рдЙрдВрдЯрд░реНрд╕ (рдмрд┐рдЯрдЕрд░реЗрдпрд░ рдкрдВрдХреНрддрд┐) рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдПрдХ int [] рдХрд╛рдЙрдВрдЯрд░ рдРрд░реЗ рдХреЛ рдирд┐рдореНрди рдПрд▓реНрдЧреЛрд░рд┐рдердо рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╢реБрд░реВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: рдПрдХ рдбрд╛рд░реНрдХ рдкрд┐рдХреНрд╕реЗрд▓ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ, рд╕рд░рдгреА рдХрд╛ рдкрд╣рд▓рд╛ рддрддреНрд╡ рдкрдВрдХреНрддрд┐ рд╕рд░рдгреА рдореЗрдВ рдПрдХ рд╕рдлреЗрдж рдкрд┐рдХреНрд╕реЗрд▓ рдХреЗ рд╕рд╛рдордиреЗ рдЖрдиреЗ рддрдХ рдмрдврд╝рд╛рдирд╛ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИред рдЙрд╕рдХреЗ рдмрд╛рдж, рдХрд╛рдЙрдВрдЯрд░ рд╕рд░рдгреА рдХреЗ рджреВрд╕рд░реЗ рддрддреНрд╡ рдореЗрдВ рд╕рдВрдХреНрд░рдордг рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рддрдм рддрдХ рдмрдврд╝ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рдПрдХ рдХрд╛рд▓рд╛ рдкрд┐рдХреНрд╕реЗрд▓ рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджреЗрддрд╛ред рдФрд░ рдЗрд╕рд▓рд┐рдП рд▓рд╛рдЗрди рдХреЗ рдЕрдВрдд рддрдХред рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдХрд╛рдЙрдВрдЯрд░ рд╕рд░рдгреА рдирд┐рдореНрди рдХреА рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрдЧреА:

15 7 10 3 4 8 16 ...

рдпрд╛рдиреА: 15 рдмреНрд▓реИрдХ рдкрд┐рдХреНрд╕рд▓реНрд╕, 7 рд╡реНрд╣рд╛рдЗрдЯ, 10 рдмреНрд▓реИрдХ, 3 рд╡реНрд╣рд╛рдЗрдЯ, рдЖрджрд┐ред (рдЗрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдкрд╣рд▓рд╛ рддрддреНрд╡ рдмреНрд▓реИрдХ рдкрд┐рдХреНрд╕рд▓ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ)ред

рдЕрдЧрд▓рд╛, рд╣рдо рдкреНрд░рд╛рд░рдВрдн рд╡рд░реНрдг рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЕрдиреБрдХреНрд░рдо рдХреА рддрд▓рд╛рд╢ рдХрд░рддреЗ рд╣реИрдВ (рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рдЪрд░рд┐рддреНрд░ "рдП" рд╣реИ, рдореВрд▓ рдХреЛрдбрдмрд╛рд░ рдореЗрдВ - рд╡рд░реНрдг "рдП", "рдмреА", "рд╕реА" рдпрд╛ "рдбреА") рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред рд╣рдо findStartPattern рд╡рд┐рдзрд┐ (int charOffset, int GlobalOffset) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЦреЛрдЬ рдХрд░рддреЗ рд╣реИрдВред рдЕрд╕рдВрдЧрддрд┐ рдкрд╛рдП рдЬрд╛рдиреЗ рддрдХ, GlobalOffset рдХрд╛ рдорд╛рди рдмрдврд╝рд╛рдПрдБ (рдЫрд╡рд┐ рд░реЗрдЦрд╛ рдореЗрдВ рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ) рдФрд░ рдХрд╛рдЙрдВрдЯрд░ рд╕рд░рдгреА рдХреЗ рдЕрдЧрд▓реЗ рд╡рд░реНрдг рдкрд░ рдЖрдЧреЗ рдмрдврд╝реЗрдВред FindStartPattern рд╡рд┐рдзрд┐ рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рддреА рд╣реИ:

 int toNarrowWidePattern(int position, int offset) 


рдпрд╣ рдХрд╛рдЙрдВрдЯрд░ рд╕рд░рдгреА рдХреЗ рд╡рд░реНрддрдорд╛рди рддрддреНрд╡ рдХреА рд╕рдВрдЦреНрдпрд╛ рдФрд░ рдЪрд░рд┐рддреНрд░ рдХреА рд▓рдВрдмрд╛рдИ рд▓реЗрддрд╛ рд╣реИ (рд╢реБрд░реБрдЖрдд рдХреЗ рд▓рд┐рдП 3 рдпрд╛ рд╡рд░реНрдг рдмрдВрдж рдХрд░реЗрдВ! рдмрд╛рдХреА рдкрд╛рддреНрд░реЛрдВ рдХреЗ рд▓рд┐рдП 9)ред рд░рд┐рдЯрд░реНрди -1 рдЕрдЧрд░ рдЪрд░рд┐рддреНрд░ рдирд╣реАрдВ рдорд┐рд▓рд╛ред рдпрджрд┐ рд╡рд░реНрдг рдкрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ CHARACTER_ENCODINGS рд╕рд░рдгреА рдореЗрдВ рдпрд╣ рд╕реНрдерд┐рддрд┐ рд▓реМрдЯрд╛рддрд╛ рд╣реИред

рд╡рд░реНрдгрдорд╛рд▓рд╛


рдХреЛрдб рдХреА рд╡рд░реНрдгрдорд╛рд▓рд╛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреНрд╖реЗрддреНрд░реЛрдВ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИ:

CHARACTER_ENCODINGS рд╕рд░рдгреА рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдорд╛рдиреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рд╢рдмреНрдж рдФрд░ рдЖрдорддреМрд░ рдкрд░ рдХреЛрдбрд╛рдмрд░ рдХреИрд╕реЗ рдПрдиреНрдХреЛрдбреЗрдб рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕рдВрдЦреНрдпрд╛ "0" рдзрд╛рд░рд┐рдпреЛрдВ рдФрд░ рд░рд┐рдХреНрдд рд╕реНрдерд╛рди рдХреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЕрдиреБрдХреНрд░рдо рджреНрд╡рд╛рд░рд╛ рдПрдиреНрдХреЛрдбреЗрдб рд╣реИ:



рдпрд╣ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ: 101010011 (рдмрд╛рд░рдХреЛрдб рдПрдиреНрдХреЛрдбрд┐рдВрдЧ)ред рдПрдХ рдПрдХрд▓ 0/1 рдПрдХ рдЫреЛрдЯреА рдЬрдЧрд╣ / рдкрдЯреНрдЯреА рдХреЛ рдПрдиреНрдХреЛрдб рдХрд░рддрд╛ рд╣реИ, рдПрдХ рдбрдмрд▓ 00/11 рдПрдХ рд▓рдВрдмреЗ рд╕реНрдерд╛рди / рдкрдЯреНрдЯреА рдХреЛ рдПрдиреНрдХреЛрдб рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рдЕрдиреБрдХреНрд░рдо рдХреЛрдб 0000011 (рдЪреМрдбрд╝рд╛рдИ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ), рдпрд╛ рд╣реЗрдХреНрд╕рд╛рдбреЗрд╕рд┐рдорд▓ рд░реВрдк рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ: 0x03ред рдпрд╛рдиреА рдПрдХрд▓ рд╡рд░реНрдг рд╢реВрдиреНрдп рдХреЗ рд╕рд╛рде рд▓рд┐рдЦреЗ рдЧрдП рд╣реИрдВ, рджреЛрд╣рд░реЗ рдЪрд░рд┐рддреНрд░ рдПрдХ рдХреЗ рд╕рд╛рдеред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдкреНрд░рддреНрдпреЗрдХ рд╡рд░реНрдг 7 рд╕реЗ рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ 9 рд╡рд░реНрдгреЛрдВ рд╕реЗ рдХреВрдЯрдмрджреНрдз рд╣реИ, рд▓реЗрдХрд┐рди рдбрд┐рдЬрд┐рдЯрд▓ рдХреЛрдб рдмрдирд╛рдиреЗ рдХрд╛ рддрд░реНрдХ рд╕рдорд╛рди рд╣реИред

рд╣рдореЗрдВ рдХреБрдЫ рд╕рдордп рдХреВрдкрди рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рдиреЗ рдореЗрдВ рдмрд┐рддрд╛рдирд╛ рдкрдбрд╝рд╛ред рд╣рдордиреЗ рд╕рд╛рд╡рдзрд╛рдиреА рд╕реЗ рдмрд╛рд░рдХреЛрдб рдХреЛ рджреЗрдЦрд╛ рдФрд░ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдЪрд░рд┐рддреНрд░ рдХреЗ рдЕрдиреБрд░реВрдк рджреГрд╢реНрдпреЛрдВ рдХреЛ рд▓рд┐рдЦрд╛ред рдкрд░рд┐рдгрд╛рдо рд╣рдорд╛рд░реА рдЕрдкрдиреА рд╡рд░реНрдгрдорд╛рд▓рд╛ рд╣реИ:

 private const String ALPHABET_STRING = "0123456789AE"; static int[] CHARACTER_ENCODINGS = { 0x014, 0x101, 0x041, 0x140, 0x011, 0x110, 0x050, 0x005, 0x104, 0x044, // 0-9 0x000, 0x004, // AE}; 


рдЗрд╕рд▓рд┐рдП, рдХреЛрдб рдХреЛ рдкреНрд░реЛрд╕реЗрд╕ рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ: рдЬреИрд╕реЗ рд╣реА рд╣рдореЗрдВ рд╕реНрдЯрд╛рд░реНрдЯ рдХреИрд░реЗрдХреНрдЯрд░ рдорд┐рд▓ рдЬрд╛рддрд╛ рд╣реИ - рд╣рдо рд╕реВрдЪрдирд╛ рдХреЛ рдЦреЛрдЬрддреЗ рд╣реИрдВ, рдЙрд╕реА toNarrowWidePattern рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗред рдЕрдиреБрдХреНрд░рдо рдХреА рд▓рдВрдмрд╛рдИ рддрдп рд╣реЛ рдЧрдИ рд╣реИ, рдЕрд░реНрдерд╛рдд рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдХрджрдо рдкрд░, рд╣рдореЗрдВ рдпрд╣ рдЬрд╛рдВрдЪрдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдХреНрдпрд╛ рдкреНрд░рддреАрдХ рдПрдХ рд╕реНрдЯреЙрдк рдкреНрд░рддреАрдХ рд╣реИред рдпрджрд┐ рд╣рд╛рдБ, рддреЛ рд╣рдо рдкрд░рд┐рдгрд╛рдо рдЙрддреНрдкрдиреНрди рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрдВ рдмрд╛рд░рдХреЛрдб рдХреА рдЦреЛрдЬ рдЬрд╛рд░реА рд░рдЦрддреЗ рд╣реБрдП, рдХрд╛рдЙрдВрдЯрд░ рд╕рд░рдгреА рдХреЗ рдЕрдЧрд▓реЗ рддрддреНрд╡ рдкрд░ рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВред

рдирддреАрдЬрддрди, рдПрдХ рдкрдВрдХреНрддрд┐ рдХреЛ рд╕реНрдХреИрди рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдпрд╛ рдЕрдзрд┐рдХ рдХреЛрдб рд╣реЛрддреЗ рд╣реИрдВ, рдЬрд┐рдиреНрд╣реЗрдВ рд╣рдо рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреА рд╡реИрд╢реНрд╡рд┐рдХ рд╕рд░рдгреА рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддреЗ рд╣реИрдВред рдФрд░ рдЫрд╡рд┐ рдХреА рдЕрдЧрд▓реА рдкрдВрдХреНрддрд┐ рдкрд░ рдЬрд╛рдПрдВред

рдпрджрд┐ рд╕рднреА рдЪрд╛рд░ рдкрджреЛрдВ рдореЗрдВ рдХреЛрдб рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреЗ рд▓рд┐рдП рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рддреЛ рдЫрд╡рд┐ рдХреЛ 90 рдбрд┐рдЧреНрд░реА рд╕реЗ рджрдХреНрд╖рд┐рдгрд╛рд╡рд░реНрдд рдореЛрдбрд╝рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рднреА рдЬреЛрдбрд╝реА рдЧрдИ рдереАред рдЬрд╝рдХреНрд╕рд┐рдВрдЧ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ, рд╕рдВрд╕рд╛рдзрд┐рдд рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рдЫрд╡рд┐ рдмрд╛рдЗрдирд░реАрдмрд┐рдЯрдореИрдк рдХреНрд▓рд╛рд╕ рдореЗрдВ рд╕рдорд╛рд╣рд┐рдд рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд░реЛрдЯреНрд░реЗрдХреНрдЯрдХреЙрдиреНрдХрд╡рд╛рдЗрдХ рд╡рд╛рдЗрдЬ () рд╡рд┐рдзрд┐ рд╣реИред рдЫрд╡рд┐ рдХреЛ рдШреБрдорд╛рдПрдВ рдЖрд╕рд╛рди рд╣реИред

рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдереЛрдбрд╝рд╛ рд╡рд┐рдЪрд╛рд░ рдФрд░ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рдПрдХ рдирдП рдХреЛрдб рдкреНрд░рд╛рд░реВрдк рдХреЗ рд▓рд┐рдП рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдереЗред рдХреМрди рдкрд░рд╡рд╛рд╣ рдХрд░рддрд╛ рд╣реИ, рдХреЛрдб рдпрд╣рд╛рдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ

рдЫрд┐рдкрд╛ рд╣реБрдЖ рдкрд╛рда
 using System; using System.Collections; using System.Collections.Generic; using System.Text; using BitArray = ETR.REBT.BarcodeReader.common.BitArray; namespace ETR.REBT.BarcodeReader.oned { public sealed class MyCodeReader : OneDReader { // These values are critical for determining how permissive the decoding // will be. All stripe sizes must be within the window these define, as // compared to the average stripe size. private static readonly int MAX_ACCEPTABLE = (int)(PATTERN_MATCH_RESULT_SCALE_FACTOR * 2.0f); private static readonly int PADDING = (int)(PATTERN_MATCH_RESULT_SCALE_FACTOR * 1.5f); private static readonly int STARTEND_LENGTH = 3; private static readonly int SYMBOL_LENGTH = 9; private static readonly int DATA_LENGTH = 15; // 15 symbols + 2 start/stop symbols private static readonly int All_LENGHT = (16 + DATA_LENGTH * SYMBOL_LENGTH + 2 * STARTEND_LENGTH); private const String ALPHABET_STRING = "0123456789AE"; internal static readonly char[] ALPHABET = ALPHABET_STRING.ToCharArray(); /** * These represent the encodings of characters, as patterns of wide and narrow bars. The 7 least-significant bits of * each int correspond to the pattern of wide and narrow, with 1s representing "wide" and 0s representing narrow. */ internal static int[] CHARACTER_ENCODINGS = { 0x014, 0x101, 0x041, 0x140, 0x011, 0x110, 0x050, 0x005, 0x104, 0x044, // 0-9 0x000, 0x004, // AE }; // minimal number of characters that should be present (inclusing start and stop characters) // under normal circumstances this should be set to 3, but can be set higher // as a last-ditch attempt to reduce false positives. private const int MIN_CHARACTER_LENGTH = 3; // Start and end patterns private static readonly char[] START_ENCODING = { 'A' }; private static readonly char[] END_ENCODING = { 'E' }; private static readonly char[] DATA_ENCODING = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' }; // some codabar generator allow the codabar string to be closed by every // character. This will cause lots of false positives! // some industries use a checksum standard but this is not part of the original codabar standard // for more information see : http://www.mecsw.com/specs/codabar.html // Keep some instance variables to avoid reallocations private readonly StringBuilder decodeRowResult; private int[] counters; private int counterLength; public MyCodeReader() { decodeRowResult = new StringBuilder(40); counters = new int[500]; counterLength = 0; } override public List<Result> decodeRow(int rowNumber, BitArray row, Hashtable hints) { List<Result> returnList = null; if (!setCounters(row)) return null; int globalOffset = 0; while (globalOffset < counterLength) { int startSymbolPos = -1; int startOffset = findStartPattern(out startSymbolPos, globalOffset); if (startOffset < 0) return returnList; // we can't find start char in the whole row -> so, exit decodeRowResult.Length = 0; decodeRowResult.Append((char)startSymbolPos); int nextStart = startOffset; nextStart += (STARTEND_LENGTH + 1/*space between symbols*/); bool findNextStart = false; do { int charOffset = toNarrowWidePattern(nextStart, SYMBOL_LENGTH); if (charOffset == -1 || !arrayContains(DATA_ENCODING, ALPHABET[charOffset])) { findNextStart = true; break; } decodeRowResult.Append((char)charOffset); nextStart += (SYMBOL_LENGTH + 1); // Stop as soon as length of data symbols equals to corresponding number if (decodeRowResult.Length == DATA_LENGTH + 1/*start symbol*/) { int endOffset = toNarrowWidePattern(nextStart, STARTEND_LENGTH); if (endOffset == -1 || !arrayContains(END_ENCODING, ALPHABET[endOffset])) { findNextStart = true; break; } globalOffset = nextStart + STARTEND_LENGTH; decodeRowResult.Append((char)endOffset); break; } } while (nextStart < counterLength); // no fixed end pattern so keep on reading while data is available if (findNextStart) { globalOffset = ++startOffset; continue; } if (!validatePattern()) { globalOffset = ++startOffset; continue; } // remove stop/start characters character decodeRowResult.Remove(decodeRowResult.Length - 1, 1); decodeRowResult.Remove(0, 1); int runningCount = 0; for (int i = 0; i < startOffset; i++) { runningCount += counters[i]; } float left = (float)runningCount; for (int i = startOffset; i < nextStart - 1; i++) { runningCount += counters[i]; } float right = (float)runningCount; Result result = new Result( decodeRowResult.ToString(), null, new ResultPoint[] { new ResultPoint(left, (float) rowNumber), new ResultPoint(right, (float) rowNumber) }, BarcodeFormat.CODABAR); if (returnList == null) returnList = new List<Result>(); returnList.Add(result); } return returnList; } private bool validatePattern() { if (decodeRowResult.Length != DATA_LENGTH + 2) { return false; } // Translate character table offsets to actual characters. for (int i = 0; i < decodeRowResult.Length; i++) { decodeRowResult[i] = ALPHABET[decodeRowResult[i]]; } // Ensure a valid start character char startchar = decodeRowResult[0]; if (!arrayContains(START_ENCODING, startchar)) { return false; } // Ensure a valid end character char endchar = decodeRowResult[decodeRowResult.Length - 1]; if (!arrayContains(END_ENCODING, endchar)) { return false; } // Ensure a valid data symbols for (int i = 1; i < decodeRowResult.Length - 1; i++) { if (!arrayContains(DATA_ENCODING, decodeRowResult[i])) { return false; } } return true; } /// <summary> /// Records the size of all runs of white and black pixels, starting with white. /// This is just like recordPattern, except it records all the counters, and /// uses our builtin "counters" member for storage. /// </summary> /// <param name="row">row to count from</param> private bool setCounters(BitArray row) { counterLength = 0; // Start from the first white bit. int i = row.getNextUnset(0); int end = row.Size; if (i >= end) { return false; } bool isWhite = true; int count = 0; for (; i < end; i++) { if (row[i] ^ isWhite) { // that is, exactly one is true count++; } else { counterAppend(count); count = 1; isWhite = !isWhite; } } counterAppend(count); return true; } private void counterAppend(int e) { counters[counterLength] = e; counterLength++; if (counterLength >= counters.Length) { int[] temp = new int[counterLength * 2]; Array.Copy(counters, 0, temp, 0, counterLength); counters = temp; } } private int findStartPattern(out int charOffset, int globalOffset) { charOffset = -1; // // Assume that first (i = 0) set of pixels is white, // so we start find symbols from second set (i = 1). // And next we step over white set ('i += 2'). // for (int i = 1 + globalOffset; i < counterLength; i += 2) { if (counters[i - 1] < counters[i] * 5) // before start char must be a long space continue; charOffset = toNarrowWidePattern(i, 3); if (charOffset != -1 && arrayContains(START_ENCODING, ALPHABET[charOffset])) { return i; } } return -1; } internal static bool arrayContains(char[] array, char key) { if (array != null) { foreach (char c in array) { if (c == key) { return true; } } } return false; } // Assumes that counters[position] is a bar. private int toNarrowWidePattern(int position, int offset) { int end = position + offset; if (end >= counterLength) return -1; // First element is for bars, second is for spaces. int[] maxes = { 0, 0 }; int[] mins = { Int32.MaxValue, Int32.MaxValue }; int[] thresholds = { 0, 0 }; for (int i = 0; i < 2; i++) { for (int j = position + i; j < end; j += 2) { if (counters[j] < mins[i]) { mins[i] = counters[j]; } if (counters[j] > maxes[i]) { maxes[i] = counters[j]; } } double tr = ((double)mins[i] + (double)maxes[i]) / 2; thresholds[i] = (int)Math.Ceiling(tr); } // There are no big spaces in the barcode -> only small spaces thresholds[1] = Int32.MaxValue; // For start and end symbols defined empirically threshold equals to 5 if (offset == STARTEND_LENGTH) thresholds[0] = 5; int bitmask = 1 << offset; int pattern = 0; for (int i = 0; i < offset; i++) { int barOrSpace = i & 1; bitmask >>= 1; if (counters[position + i] >= thresholds[barOrSpace]) { pattern |= bitmask; } } for (int i = 0; i < CHARACTER_ENCODINGS.Length; i++) { if (CHARACTER_ENCODINGS[i] == pattern) { return i; } } return -1; } } } 



"рдЕрдиреБрдХреВрд▓рди" рдЬрд╝рдХреНрд╕рд┐рдВрдЧ


рдЗрд╕рд▓рд┐рдП, рд╣рдо рдкреГрд╖реНрда рдкрд░ рдПрдХ рдпрд╛ рдЕрдзрд┐рдХ рдХреЛрдб рдкрд╣рдЪрд╛рдирдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣реЗред рд▓реЗрдХрд┐рди рд╣рдорд╛рд░реА рд╕рдорд╕реНрдпрд╛рдПрдВ рдпрд╣реА рдЦрддреНрдо рдирд╣реАрдВ рд╣реБрдИрдВред рдЪреВрдВрдХрд┐, рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХрдИ рдХреЛрдб рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рд╕рд╛рде рд╣реА рд╢реАрдЯ рдХреЗ 4 рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкрджреЛрдВ рдХреЛ рд╕реНрдХреИрди рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛рдлреА "рдзреАрдорд╛" рд╣реЛ рдЧрдпрд╛ рд╣реИред рдореБрдЭреЗ рдЖрдЧреЗ рдЦреБрджрд╛рдИ рдХрд░рдиреА рдкрдбрд╝реА, рдЬрд┐рд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреА рдЦреЛрдЬ рдХреА рдЧрдИ:
Zxing рдЫрд╡рд┐ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ RGBLuminanceSource рд╡рд░реНрдЧ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рддрд╛ рд╣реИред рдЗрд╕рдореЗрдВ рдмрд╛рдЗрдЯреНрд╕ рдХреА рдПрдХ рд╕рд░рдгреА рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдореВрд▓ рдЫрд╡рд┐ рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдкрд┐рдХреНрд╕реЗрд▓ рдХреА рдЪрдордХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд╣реИред рдлрд┐рд░, рдЗрд╕ рдЬрд╛рдирдХрд╛рд░реА рдФрд░ рд╕реАрдорд╛ рдореВрд▓реНрдп рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдПрдХ рдмрд┐рдЯрдореИрдк рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдпрд╣рд╛рдБ RGBLuminanceSource рд╡рд░реНрдЧ рдХреЗ рдирд┐рд░реНрдорд╛рддрд╛ рдХреЗ рдХреЛрдб рднрд╛рдЧ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

  Color c; for (int y = 0; y < height; y++) { int offset = y * width; for (int x = 0; x < width; x++) { c = bitmap.GetPixel(x, y); var r = ColorUtility.GetRValue(c); var g = ColorUtility.GetGValue(c); var b = ColorUtility.GetBValue(c); luminances[offset + x] = (byte)(0.3 * r + 0.59 * g + 0.11 * b + 0.01); } } 

рдпрд╣реА рд╣реИ, рдЪрдХреНрд░реЛрдВ рдореЗрдВ, рдПрдХ рдзреАрдорд╛ рдмрд┐рдЯрдореИрдкред GetPixel (x, y) рдЫрд╡рд┐ рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдкрд┐рдХреНрд╕реЗрд▓ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ! 200x300 рдкрд┐рдХреНрд╕реЗрд▓ (рдпрд╛ рдЙрд╕рдХреЗ рдХрд░реАрдм) рдХреЗ рд░рд┐рдЬрд╝реЙрд▓реНрдпреВрд╢рди рд╡рд╛рд▓реА рдЫреЛрдЯреА рдЫрд╡рд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП, рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛рдлреА рдЙрдкрдпреБрдХреНрдд рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рджреЗрд░реА рдХрд╛ рдХрд╛рд░рдг рдирд╣реАрдВ рдмрдирддрд╛ рд╣реИ (рдпрд╣ рдПрдХ рдирд┐рдпрдо рдХреЗ рд░реВрдк рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдХреЛрдб рдорд╛рдиреНрдпрддрд╛ рдкреНрд░рд╛рдкреНрдд рд╣реИ)ред рд▓реЗрдХрд┐рди рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЫрд╡рд┐ рдореЗрдВ рдПрдХ рдЙрдЪреНрдЪ рд░рд┐рдЬрд╝реЙрд▓реНрдпреВрд╢рди (3000 x 5000 рдкрд┐рдХреНрд╕реЗрд▓ рддрдХ) рд╣реИ, рдЬрд┐рд╕реЗ рдЕрднрд┐рд╡рд┐рдиреНрдпрд╛рд╕ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╕реЗ рднреА рдЧреБрдгрд╛ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдХрдИ рдкреГрд╖реНрдареЛрдВ рдХреЗ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рд╕реЗ рдЧреБрдгрд╛ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рд╕рдм рдЕрд╕реНрд╡реАрдХрд╛рд░реНрдп рджреЗрд░реА рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЙрдкрд░реЛрдХреНрдд рд░рд┐рдЬрд╝реЙрд▓реНрдпреВрд╢рди рдХреЗ рдПрдХ рдкреГрд╖реНрда рдХреЗ рд▓рд┐рдП, рд╡рд░реНрдЧ RGBLuminanceSource рдХреА рдПрдХ рд╡рд╕реНрддреБ 8 рд╕реЗрдХрдВрдб рдореЗрдВ рдмрдирд╛рдИ рдЧрдИ рдереАред рдпрд╣, рдЬрд╝рд╛рд╣рд┐рд░ рд╣реИ, рдПрдХ рдмрд╣реБрдд рд▓рдВрдмрд╛ рд╕рдордп рд╣реИред

рдореБрдЭреЗ рдЗрд╕ рдХреЛрдб рдХреЛ рдФрд░ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЧреЗрдЯрдкрд┐рдХреНрд╕рд▓ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреВрд▓рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рд╕реНрдХреИрди рдкрд░ рдХрд╛рдо рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

  bmp = bitmap.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.ReadOnly, bitmap.PixelFormat); for (var y = 0; y < bmp.Height; y++) { var row = (byte*)bmp.Scan0 + (y * bmp.Stride); int offset = y * width; for (var x = 0; x < bmp.Width; x++) { var b = row[(x * pixelSize)]; var g = row[(x * pixelSize) + 1]; var r = row[(x * pixelSize) + 2]; luminances[offset + x] = (byte)(0.3 * r + 0.59 * g + 0.11 * b + 0.01); } } 

рдЗрд╕ рдХрджрдо рдиреЗ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЛ рдХрд╛рдлреА рддреЗрдЬ рдХрд┐рдпрд╛ рдФрд░ рд╣рдореЗрдВ рдПрдХ рд╕реНрд╡реАрдХрд╛рд░реНрдп рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рд╕рдордп рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреАред

рдкреАрдбреАрдПрдл рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВ


рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдХреВрдкрди рд╕реНрдХреИрди рдЫрд╡рд┐ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдпрд╛ рдПрдХ рдкреАрдбреАрдПрдл рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдореЗрдВ рдЖ рд╕рдХрддрд╛ рд╣реИред рдкреАрдбреАрдПрдл рдкреГрд╖реНрдареЛрдВ рдХреЛ рдЫрд╡рд┐рдпреЛрдВ рдореЗрдВ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдордиреЗ itextsharp рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред

рдЗрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рдореБрдЦреНрдп рд╡рд░реНрдЧ PdfReader рд╣реИред рдЗрд╕ рд╡рд░реНрдЧ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

рд╕реНрдкреЙрдЗрд▓рд░ рдХреЗ рддрд╣рдд рдХреЛрдб рдХреЗ рдЯреБрдХрдбрд╝реЗ рджреЗрдЦреЗрдВред
рдЫрд┐рдкрд╛ рд╣реБрдЖ рдкрд╛рда
 var reader = new PdfReader(filePath) 


рдЙрд╕рдХреЗ рдмрд╛рдж, рдЖрдк рдЗрд╕реЗ рдХреЛрдб рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
 for (var pageNumber = 1; pageNumber <= reader.NumberOfPages; pageNumber++) { var page = reader.GetPageN(pageNumber); List<ImageRenderInfo> images; try { images = FindImageInPDFDictionary(page); } catch (Exception) { //     PDF  continue; } finally { reader.ReleasePage(pageNumber); } foreach (var img in images) { var image = RenderImage(img); var result = ImageDecoder.Decode(image, allRotations); if (result != null && result.Count > 0) { //  ,     } } } 


рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рд╣рдо рдкреАрдбреАрдПрдл рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдкреГрд╖реНрда рдкрд░ рдЫрд╡рд┐рдпрд╛рдВ рдЦреЛрдЬрддреЗ рд╣реИрдВ

 private static List<ImageRenderInfo> FindImageInPDFDictionary(PdfDictionary pg) { var result = new List<ImageRenderInfo>(); var res = (PdfDictionary)PdfReader.GetPdfObject(pg.Get(PdfName.RESOURCES)); var xobj = (PdfDictionary)PdfReader.GetPdfObject(res.Get(PdfName.XOBJECT)); if (xobj == null) return null; foreach (var name in xobj.Keys) { var obj = xobj.Get(name); if (!obj.IsIndirect()) continue; var tg = (PdfDictionary)PdfReader.GetPdfObject(obj); var type = (PdfName)PdfReader.GetPdfObject(tg.Get(PdfName.SUBTYPE)); if (PdfName.IMAGE.Equals(type)) { var width = float.Parse(tg.Get(PdfName.WIDTH).ToString()); var height = float.Parse(tg.Get(PdfName.HEIGHT).ToString()); if (width > ImageDecoder.MinimalSideResolution || height >= ImageDecoder.MinimalSideResolution) { var imgRi = ImageRenderInfo.CreateForXObject(new Matrix(width, height), (PRIndirectReference)obj, tg); result.Add(imgRi); } } if (PdfName.FORM.Equals(type)) { result.AddRange(FindImageInPDFDictionary(tg)); } if (PdfName.GROUP.Equals(type)) { result.AddRange(FindImageInPDFDictionary(tg)); } } return result; } 


ImageRenderInfo рд╡рд░реНрдЧ рдХреА рд╡рд╕реНрддреБ рд╕реЗ рдмрд┐рдЯрдореИрдк рдХреЗ рдкреНрд░рдХрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ

 private static Bitmap RenderImage(ImageRenderInfo renderInfo) { try { var image = renderInfo.GetImage(); using (var dotnetImg = image.GetDrawingImage()) { if (dotnetImg != null) { using (var ms = new MemoryStream()) { dotnetImg.Save(ms, ImageFormat.Png); return new Bitmap(dotnetImg); } } } } catch (Exception) { } return null; } 


ImageDecoder.D timecode рд╡рд┐рдзрд┐ рдПрдХ рддрд╕реНрд╡реАрд░ рдореЗрдВ рдХреЛрдб рдЦреЛрдЬрдиреЗ рдХреЗ рддрд░реНрдХ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреА рд╣реИред


рдРрд╕рд╛ рд╣реБрдЖ рдХрд┐ рдЕрдм рджреБрдирд┐рдпрд╛ рдореЗрдВ рдмрд╛рд░рдХреЛрдб рдХреА рдХрдИ рдХрд┐рд╕реНрдореЗрдВ рд╣реИрдВред рдЙрдирдореЗрдВ рд╕реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдХреА рдорд╛рдиреНрдпрддрд╛ рдФрд░ рдкреАрдврд╝реА рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдХрднреА-рдХрднреА рдЖрдк рдореВрд▓ рдкреНрд░рдХрд╛рд░ рдХреЗ рдмрд╛рд░рдХреЛрдб рдкрд░ рдареЛрдХрд░ рдЦрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ рдЖрдк рддреБрд░рдВрдд рдкрд╣рдЪрд╛рди рдирд╣реАрдВ рдкрд╛рдПрдВрдЧреЗред

рдФрд░ рдлрд┐рд░ рдПрдХ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдП рдЧрдП рдУрдкрди рд╕реЛрд░реНрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рд╕рд╛рд╡рдзрд╛рдиреАрдкреВрд░реНрд╡рдХ рд╕рд╣рдХрд░реНрдореА рдФрд░ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рд╡рд┐рдзрд┐ рдЖрдкрдХреЛ рдЬрд▓реНрджреА рд╕реЗ рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддреА рд╣реИред

Source: https://habr.com/ru/post/In214967/


All Articles