BlueArr[7]:= GetBValue(a);
a:= Pixels[X-1, Y-1];
RedArr[8]:= GetRValue(a);
GreenArr[8]:= GetGValue(a);
BlueArr[8]:= GetBValue(a);
RedArr[9]:= ord(Str[i]);
GreenArr[9]:= ord(Str[i+1]);
BlueArr[9]:= ord(Str[i+2]);
r:= 0; //читаем информацию из соседних пикселей
g:= 0;
b:= 0;
for j:= 1 to 9 do begin
r:= (r + RedArr[j]);
g:= (g + GreenArr[j]);
b:= (b + BlueArr[j]);
end;
j:=1;
while r mod 9 <> 0 do begin//добавим соседние точки до кратности 9
Case j of
1: begin
RedArr[1]:= RedArr[1]+1;
Pixels[X-1, Y+1]:= RGB(RedArr[1], GreenArr[1], BlueArr[1]);
j:= j+1;
end;
2: begin
RedArr[2]:= RedArr[2]+1;
Pixels[X-1, Y]:= RGB(RedArr[2], GreenArr[2], BlueArr[2]);
j:= j+1;
end;
3: begin
RedArr[3]:= RedArr[3]+1;
Pixels[X, Y+1]:= RGB(RedArr[3], GreenArr[3], BlueArr[3]);
j:= j+1;
end;
4: begin
RedArr[4]:= RedArr[4]+1;
Pixels[X+1, Y+1]:= RGB(RedArr[4], GreenArr[4], BlueArr[4]);
j:= j+1;
end;
5: begin
RedArr[5]:= RedArr[5]+1;
Pixels[X+1, Y]:= RGB(RedArr[5], GreenArr[5], BlueArr[5]);
j:= j+1;
end;
6: begin
RedArr[6]:= RedArr[6]+1;
Pixels[X+1, Y-1]:= RGB(RedArr[6], GreenArr[6], BlueArr[6]);
j:= j+1;
end;
7: begin
RedArr[7]:= RedArr[7]+1;
Pixels[X, Y-1]:= RGB(RedArr[7], GreenArr[7], BlueArr[7]);
j:= j+1;
end;
8: begin
RedArr[8]:= RedArr[8]+1;
Pixels[X-1, Y-1]:= RGB(RedArr[8], GreenArr[8], BlueArr[8]);
j:= j+1;
end;
end;
r:= r+1;
end;
j:=1;
while g mod 9 <> 0 do begin
Case j of
1: begin
GreenArr[1]:= GreenArr[1]+1;
Pixels[X-1, Y+1]:= RGB(RedArr[1], GreenArr[1], BlueArr[1]);
j:= j+1;
end;
2: begin
GreenArr[2]:= GreenArr[2]+1;
Pixels[X-1, Y]:= RGB(RedArr[2], GreenArr[2], BlueArr[2]);
j:= j+1;
end;
3: begin
GreenArr[3]:= GreenArr[3]+1;
Pixels[X, Y+1]:= RGB(RedArr[3], GreenArr[3], BlueArr[3]);
j:= j+1;
end;
4: begin
GreenArr[4]:= GreenArr[4]+1;
Pixels[X+1, Y+1]:= RGB(RedArr[4], GreenArr[4], BlueArr[4]);
j:= j+1;
end;
5: begin
GreenArr[5]:= GreenArr[5]+1;
Pixels[X+1, Y]:= RGB(RedArr[5], GreenArr[5], BlueArr[5]);
j:= j+1;
end;
6: begin
GreenArr[6]:= GreenArr[6]+1;
Pixels[X+1, Y-1]:= RGB(RedArr[6], GreenArr[6], BlueArr[6]);
j:= j+1;
end;
7: begin
GreenArr[7]:= GreenArr[7]+1;
Pixels[X, Y-1]:= RGB(RedArr[7], GreenArr[7], BlueArr[7]);
j:= j+1;
end;
8: begin
GreenArr[8]:= GreenArr[8]+1;
Pixels[X-1, Y-1]:= RGB(RedArr[8], GreenArr[8], BlueArr[8]);
j:= j+1;
end;
end;
g:= g+1;
end;
j:=1;
while b mod 9 <> 0 do begin
Case j of
1: begin
BlueArr[1]:= BlueArr[1]+1;
Pixels[X-1, Y+1]:= RGB(RedArr[1], GreenArr[1], BlueArr[1]);
j:= j+1;
end;
2: begin
BlueArr[2]:= BlueArr[2]+1;
Pixels[X-1, Y]:= RGB(RedArr[2], GreenArr[2], BlueArr[2]);
j:= j+1;
end;
3: begin
BlueArr[3]:= BlueArr[3]+1;
Pixels[X, Y+1]:= RGB(RedArr[3], GreenArr[3], BlueArr[3]);
j:= j+1;
end;
4: begin
BlueArr[4]:= BlueArr[4]+1;
Pixels[X+1, Y+1]:= RGB(RedArr[4], GreenArr[4], BlueArr[4]);
j:= j+1;
end;
5: begin
BlueArr[5]:= BlueArr[5]+1;
Pixels[X+1, Y]:= RGB(RedArr[5], GreenArr[5], BlueArr[5]);
j:= j+1;
end;
6: begin
BlueArr[6]:= BlueArr[6]+1;
Pixels[X+1, Y-1]:= RGB(RedArr[6], GreenArr[6], BlueArr[6]);
j:= j+1;
end;
7: begin
BlueArr[7]:= BlueArr[7]+1;
Pixels[X, Y-1]:= RGB(RedArr[7], GreenArr[7], BlueArr[7]);
j:= j+1;
end;
8: begin
BlueArr[8]:= BlueArr[8]+1;
Pixels[X-1, Y-1]:= RGB(RedArr[8], GreenArr[8], BlueArr[8]);
j:= j+1;
end;
end;
b:= b+1;
end;
r:= r div 9;
g:= g div 9;
b:= b div 9;
//закончили размытие точки
Image1.Canvas.Pixels[x, y]:= RGB(r, g, b); //в каждый пиксель помещаем три символа текста
i:= i+3;
Until i = length(Str)+1;
end;
end;
Image1.Repaint;
end;
procedure TfrmStenograf.N39Click(Sender: TObject); //вытащить информацию из рисунка
Type TColoreArr= array[1..8] of byte;
Var a: TColor;
RedArr, GreenArr, BlueArr: TColoreArr;
r, g, b: Integer;
j: byte;
i: LongWord;
Str: String;
begin
X:= GetStart(Edit1.Text);
Y:= 2;
Str:= '';
a:= Image1.Canvas.Pixels[X, Y];
i:= GetRValue(a)*65536 + GetGValue(a)*255 + GetBValue(a); //считываем длину текста
repeat
X:= 2 + (106*X+1230) mod (Image1.Width-3); //генератор псевдослучайной последовательности
Y:= Y + 3;
with Image1.Canvas do begin
// устраним размытие точки
a:= Pixels[X-1, Y];
RedArr[1]:= GetRValue(a);
GreenArr[1]:= GetGValue(a);
BlueArr[1]:= GetBValue(a);
a:= Pixels[X-1, Y+1];
RedArr[2]:= GetRValue(a);
GreenArr[2]:= GetGValue(a);
BlueArr[2]:= GetBValue(a);
a:= Pixels[X, Y+1];
RedArr[3]:= GetRValue(a);
GreenArr[3]:= GetGValue(a);
BlueArr[3]:= GetBValue(a);
a:= Pixels[X+1, Y+1];
RedArr[4]:= GetRValue(a);
GreenArr[4]:= GetGValue(a);
BlueArr[4]:= GetBValue(a);
a:= Pixels[X+1, Y];
RedArr[5]:= GetRValue(a);
GreenArr[5]:= GetGValue(a);
BlueArr[5]:= GetBValue(a);
a:= Pixels[X+1, Y-1];
RedArr[6]:= GetRValue(a);
GreenArr[6]:= GetGValue(a);
BlueArr[6]:= GetBValue(a);
a:= Pixels[X, Y-1];
RedArr[7]:= GetRValue(a);
GreenArr[7]:= GetGValue(a);
BlueArr[7]:= GetBValue(a);
a:= Pixels[X-1, Y-1];
RedArr[8]:= GetRValue(a);
GreenArr[8]:= GetGValue(a);
BlueArr[8]:= GetBValue(a);
r:= 0; //читаем информацию из соседних пикселей
g:= 0;
b:= 0;
for j:= 1 to 8 do begin
r:= (r + RedArr[j]);
g:= (g + GreenArr[j]);
b:= (b + BlueArr[j]);
end;
end;
//устранили размытость
a:= Image1.Canvas.Pixels[X, Y]; //читаем информацию из пикселя
r:= 9*GetRValue(a) - r;
g:= 9*GetGValue(a) - g;
b:= 9*GetBValue(a) - b;
Str:= Str + chr(r);
Str:= Str + chr(g);
Str:= Str + chr(b);
i:= i-3;
Until i = 0;
Memo1.Text:= Str;
end;
procedure TfrmStenograf.N1Click(Sender: TObject);
begin
N20.Click;
end;
procedure TfrmStenograf.N2Click(Sender: TObject);
begin
N21.Click;
end;
procedure TfrmStenograf.N6Click(Sender: TObject);
begin
N25.Click;
end;
procedure TfrmStenograf.N7Click(Sender: TObject);
begin
N26.Click;
end;
procedure TfrmStenograf.N8Click(Sender: TObject);
begin
N27.Click;
end;
procedure TfrmStenograf.N11Click(Sender: TObject);
begin
N30.Click;
end;
procedure TfrmStenograf.N12Click(Sender: TObject);
begin
N32.Click;
end;
procedure TfrmStenograf.N13Click(Sender: TObject);
begin
N33.Click;
end;
procedure TfrmStenograf.N15Click(Sender: TObject);
begin
N38.Click;
end;
procedure TfrmStenograf.N16Click(Sender: TObject);
begin
N39.Click;
end;
procedure TfrmStenograf.Timer1Timer(Sender: TObject);
begin
StatusBar1.Panels[0].Text:= 'Символов набрано: ' + IntToStr(length(Memo1.Text));
StatusBar1.Panels[1].Text:= 'Символов максимум: ' + IntToStr(Memo1.MaxLength);
StatusBar1.Panels[2].Text:= 'Рабочий файл: ' + OpenPictureDialog1.FileName;
end;
end.
ПРИОЖЕНИЕ Б
Рисунок 1. – форма 1 «Стегонаграфия»
Рисунок 2. - форма 1 «Стегонаграфия»