рд░реВрдмреА рдореЗрдВ рдХреЛрдЪ-рдЭрд╛рдУ рд╕реНрдЯреЗрдЧреНрдиреЛрдЧреНрд░рд╛рдлрд╝рд┐рдХ рдкрджреНрдзрддрд┐ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди

рдпрд╣ рдЖрд▓реЗрдЦ рдЫрд╡рд┐рдпреЛрдВ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдЫрд┐рдкрд╛рдиреЗ рдХреА рд╕рдмрд╕реЗ рдкрд╕рдВрджреАрджрд╛ рд╕реНрдЯреЗрдЧреНрдиреЛрдЧреНрд░рд╛рдлрд╝рд┐рдХ рдкрджреНрдзрддрд┐ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░реЗрдЧрд╛, рджреЛрдиреЛрдВ рд╣реА рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рд╣рдорд▓реЛрдВ рдХреЗ рдкреНрд░рддрд┐рд░реЛрдз рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ, рдФрд░ рд╕реНрд╡реАрдХрд╛рд░реНрдп рдЫрд╡рд┐ рдЧреБрдгрд╡рддреНрддрд╛ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗред

рдЬрд╛рдирдХрд╛рд░реА рдПрдореНрдмреЗрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдЪ-рдЭрд╛рдУ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрдВрдЯреЗрдирд░ рдХреЗ рдЖрд╡реГрддреНрддрд┐ рдбреЛрдореЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЕрд╕рддрдд рдХреЛрд╕рд╛рдЗрди рдЯреНрд░рд╛рдВрд╕рдлреЙрд░реНрдореЗрд╢рди (рдбреАрд╕реАрдЯреА) рдХреЗ рдЧреБрдгрд╛рдВрдХ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрддрд╛ рд╣реИред рдЫрд╡рд┐ рдХреЛ 8 ├Ч 8 рдкрд┐рдХреНрд╕рд▓ рдХреЗ рдмреНрд▓реЙрдХ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдмреНрд▓реЙрдХ рдкрд░ рдбреАрд╕реАрдЯреА рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдмреНрд▓реЙрдХ рдПрдХ рдмрд┐рдЯ рдЬрд╛рдирдХрд╛рд░реА рджрд░реНрдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╣реИред

рддреЛ рдЫрд┐рдкрд╛рдиреЗ рдХреЗ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реЛрдЧрд╛:

- 8 рдХреА рд╡реЗрддрди рд╡реГрджреНрдзрд┐ рдореЗрдВ рдПрдХ рдбрдмрд▓ рд╕рд░рдгреА рдХреЗ рд╕рд╛рде рдЫрд╡рд┐ рдХреЛ рдкреБрдирд░рд╛рд╡реГрддреНрдд рдХрд░реЗрдВ
- рдкреНрд░рддреНрдпреЗрдХ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдкрд░ рд╣рдо 8x8 рдкрд┐рдХреНрд╕реЗрд▓ рдХрд╛ рдПрдХ рдЕрд╕реНрдерд╛рдпреА рд╕рд░рдгреА рдмрдирд╛рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡ рддреАрди рдкрд┐рдХреНрд╕реЗрд▓ рд░рдВрдЧреЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ рд╣реЛрдЧрд╛ред
- рдЗрд╕ рд╕рд░рдгреА рдореЗрдВ рдбреАрд╕реАрдЯреА рд▓рд╛рдЧреВ рдХрд░реЗрдВ, рдФрд░ рдЖрдХрд╛рд░ рдХреЗ рдЧреБрдгрд╛рдВрдХ 8x8 рдХрд╛ рдПрдХ рд╕рд░рдгреА рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ
- 2 рдЧреБрдгрд╛рдВрдХ рдХрд╛ рдЪрдпрди рдХрд░реЗрдВ рдФрд░ рдЙрдирдХреЗ рдЕрдВрддрд░ рдХреЛ рдорд╛рдкреЗрдВ
- рдпрджрд┐ рдЕрдВрддрд░ 25 рд╕реЗ рдХрдо рдпрд╛ рдЗрд╕рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ, рддреЛ рдкрд╣рд▓реЗ рдЧреБрдгрд╛рдВрдХ рдХреЛ рджреВрд╕рд░реЗ + рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреЗ рдПрдХ рд╕рдХрд╛рд░рд╛рддреНрдордХ рдорд╛рди рдпрд╛ рдПрдХ рд╢реВрдиреНрдп рдЪрд┐рд╣реНрди рдХреЗ рд╕рд╛рде рдПрдХ рд╣реА рдЪреАрдЬрд╝ рдЕрд╕рд╛рдЗрди рдХрд░реЗрдВ (рдЗрд╕реЗ рдмрд┐рдЯ рдЯреНрд░рд╛рдВрд╕рдлрд░ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ)
- рдпрджрд┐ рдЕрдВрддрд░ -25 рд╕реЗ рдХрдо рдпрд╛ рдЙрд╕рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ, рддреЛ рд╕рдорд╛рди рдХреНрд░рд┐рдпрд╛рдПрдВ рдХреЗрд╡рд▓ рджреВрд╕рд░реЗ рдЧреБрдгрд╛рдВрдХ рдХреЗ рд▓рд┐рдП рд╣реИрдВред
- рдЗрд╕рдХреЗ рдмрд╛рдж рд╣рдорд╛рд░реЗ рдЧреБрдгрд╛рдВрдХ рдХреЛ рд╕реНрдерд╛рдирд┐рдХ рдбреЛрдореЗрди рдкрд░ рд╡рд╛рдкрд╕ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░рд┐рд╡рд░реНрд╕ DCT рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
- рдЙрд╕рдХреЗ рдмрд╛рдж рдЗрдореЗрдЬ рдореЗрдВ рдирдП рдХрд▓рд░ рд╡реИрд▓реНрдпреВрдЬ рдХреЙрдкреА рдХрд░реЗрдВред

рд░реВрдмреА рднрд╛рд╖рд╛ рдореЗрдВ рдбреАрд╕реАрдЯреА рдФрд░ рдУрдбреАрдХреЗрдкреА рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:

def dct(dct,arr) s=0 (0..7).each do |i| (0..7).each do |j| temp = 0.0 (0..7).each do |x| (0..7).each do |y| temp = temp + $cos_t[i][x]*$cos_t[j][y]*arr[x][y][:blue] end end dct[i][j] = $e[i][j]*temp end end return dct end def idct(dct,arr) (0..7).each do |i| (0..7).each do |j| temp = 0 (0..7).each do |x| (0..7).each do |y| temp += dct[x][y]*$cos_t[x][i]*$cos_t[y][j]*$e[x][y] arr[i][j][:blue] = (temp > 255) ? 255 : (temp < 0 ) ? 0 : temp.round; end end end end return arr end 


$ cos_t рдФрд░ $ e рд╡реИрд╢реНрд╡рд┐рдХ рд╕рд░рдгреА рдЪрд░ рд╣реИрдВ рдЬрд┐рдирдХрд╛ рдорд╛рди рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЖрдмрд╛рдж рд╣реИред

рдпрд╣ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╡рд┐рдзрд┐ рдЫрд╡рд┐ рд╡рд┐рд░реВрдкрдг рдХреЗ рд▓рд┐рдП рдХрд╛рдлреА рдкреНрд░рддрд┐рд░реЛрдзреА рд╣реИ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЗрд╕рдХреЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рд▓рд┐рдП рднреА, рд▓реЗрдХрд┐рди рдмрдбрд╝реА рдорд╛рддреНрд░рд╛ рдореЗрдВ рдбреЗрдЯрд╛ рдЫрд┐рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реИред

рдкреВрд░реНрдг рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛрдб рдЬреЛ рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рдЫрд┐рдкрд╛рдиреЗ / рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ:

 require 'RMagick' include Magick $cos_t = [ [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], [0.9807853, 0.8314696, 0.5555702, 0.1950903, -0.1950903,-0.5555702,-0.8314696,-0.9807853], [0.9238795, 0.3826834,-0.3826834,-0.9238795, -0.9238795,-0.3826834, 0.3826834, 0.9238795], [0.8314696,-0.1950903,-0.9807853,-0.5555702, 0.5555702, 0.9807853, 0.1950903,-0.8314696], [0.7071068,-0.7071068,-0.7071068, 0.7071068, 0.7071068,-0.7071068,-0.7071068, 0.7071068], [0.5555702,-0.9807853, 0.1950903, 0.8314696, -0.8314696,-0.1950903, 0.9807853,-0.5555702], [0.3826834,-0.9238795, 0.9238795,-0.3826834, -0.3826834, 0.9238795,-0.9238795, 0.3826834], [0.1950903,-0.5555702, 0.8314696,-0.9807853, 0.9807853,-0.8314696, 0.5555702,-0.1950903] ] $e = [ [0.125, 0.176777777, 0.176777777, 0.176777777, 0.176777777, 0.176777777, 0.176777777, 0.176777777], [0.176777777, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25], [0.176777777, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25], [0.176777777, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25], [0.176777777, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25], [0.176777777, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25], [0.176777777, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25], [0.176777777, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25]]; def insert_message(image,text) i = image.copy dct = Array.new(8).map!{Array.new(8)} k = 0 l = 0 s=0 temp = Array.new(8).map!{Array.new(8)} (0..(image.columns - 1)).step(8) do |i| (0..(image.rows - 1)).step(8) do |j| break if l >= text.length*8 (0..7).each do |x| (0..7).each do |y| temp[x][y] = { :red=>image.pixel_color(j+x,i+y).red, :green=>image.pixel_color(j+x,i+y).green, :blue=>image.pixel_color(j+x,i+y).blue } end end dct = dct(dct,temp) k = dct[3][4].abs - dct[4][3].abs if get_bit(text,l) if k<=25 dct[3][4] = (dct[3][4]>=0) ? dct[4][3].abs + 150 : -1*(dct[4][3].abs + 150) end else if k>=-25 dct[4][3] = (dct[4][3]>=0) ? dct[3][4].abs + 150 : -1*(dct[3][4].abs + 150) end end xt = temp.clone temp = idct(dct,temp) (0..7).each do |x| (0..7).each do |y| pixel = Pixel.new(temp[x][y][:red],temp[x][y][:green],temp[x][y][:blue]) image.pixel_color(j+x,i+y,pixel) end end l=l+1 end break if l >= text.length end image.write('cr.bmp') return image end def read_message(image) k = 0 s=0 out = [] l=0 a='' p=0 b=0 dct = Array.new(8).map!{Array.new(8)} temp = Array.new(8).map!{Array.new(8)} (0..(image.columns - 1)).step(8) do |i| (0..(image.rows - 1)).step(8) do |j| (0..7).each do |x| (0..7).each do |y| temp[x][y] = { :red=>image.pixel_color(j+x,i+y).red, :green=>image.pixel_color(j+x,i+y).green, :blue=>image.pixel_color(j+x,i+y).blue } end end l=l+1 dct = dct(dct,temp) k = dct[3][4].abs-dct[4][3].abs if k>=25 a=1 elsif k<=-25 a=0 else a=-1 break end b |= a << p if p==7 out.push(b.chr) b=0 end p=(p<7) ? p+1 : 0 end if a==-1 break end end return out.join end def dct(dct,arr) s=0 (0..7).each do |i| (0..7).each do |j| temp = 0.0 (0..7).each do |x| (0..7).each do |y| temp = temp + $cos_t[i][x]*$cos_t[j][y]*arr[x][y][:blue] end end dct[i][j] = $e[i][j]*temp end end return dct end def idct(dct,arr) (0..7).each do |i| (0..7).each do |j| temp = 0 (0..7).each do |x| (0..7).each do |y| temp += dct[x][y]*$cos_t[x][i]*$cos_t[y][j]*$e[x][y] arr[i][j][:blue] = (temp > 255) ? 255 : (temp < 0 ) ? 0 : temp.round; end end end end return arr end def get_bit(str,pos) return true if str[pos/8].ord & (1 << pos % 8) > 0 return false if str[pos/8].ord & (1 << pos % 8) <= 0 end image = Magick::Image.read('src.bmp').first insert_message(image,"qweqwe") image = Magick::Image.read('dst.bmp').first puts read_message image 

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


All Articles