Var i: byte;
Res: Word;
Begin
Res:= 0;
for i:= 1 to length(Str) do begin
Res:= Res xor (Ord(Str[i]) shl 1); //Вычисляет значение простой хеш-функции (xor + циклический сдвиг) для блока данных.
end;
Result:= (Res mod frmStenograf.Image1.Width)+1;
end;
procedure TfrmStenograf.N18Click(Sender: TObject);
Begin
frmStenograf.Close;
end;
procedure TfrmStenograf.N20Click(Sender: TObject);
Begin
If OpenDialog1.Execute then
Memo1.Lines.LoadFromFile(OpenDialog1.FileName);
end;
procedure TfrmStenograf.N21Click(Sender: TObject);
Begin
If SaveDialog1.Execute then
Memo1.Lines.SaveToFile(SaveDialog1.FileName+'.txt');
end;
procedure TfrmStenograf.N25Click(Sender: TObject);
Begin
Memo1.CutToClipboard;
end;
procedure TfrmStenograf.N26Click(Sender: TObject);
Begin
Memo1.CopyToClipboard;
end;
procedure TfrmStenograf.N27Click(Sender: TObject);
Begin
Memo1.PasteFromClipboard;
end;
procedure TfrmStenograf.N30Click(Sender: TObject);
Begin
Memo1.SelectAll;
end;
Procedure TfrmStenograf.N32Click(Sender: TObject); //загрузка картинки
Var i, j: Word;
a: TColor;
r, g, b: byte;
Begin
if OpenPictureDialog1.Execute then
with Image1 do begin
Visible:= False;
Picture.LoadFromFile(OpenPictureDialog1.FileName);
if Picture.Bitmap.PixelFormat < pf16bit then
ShowMessage('Требуется большая глубина цвета')
else
for i:= 0 to Width-1 do
for j:= 0 to Height-1 do begin
a:= Canvas.Pixels[i, j];
r:= GetRValue(a);
if r = 255 then r:= 254;
g:= GetGValue(a);
if g = 255 then g:= 254;
b:= GetBValue(a);
if b = 255 then b:= 254;
Canvas.Pixels[i, j]:= RGB(r, g, b);
end;
Visible:= True;
Memo1.MaxLength:= Image1.Height-5;
end;
end;
procedure TfrmStenograf.N33Click(Sender: TObject);
Begin
if SavePictureDialog1.Execute then
Image1.Picture.SaveToFile(SavePictureDialog1.FileName);
end;
procedure TfrmStenograf.N38Click(Sender: TObject); //вшить информацию в рисунок
Type TColoreArr= array[1..9] of byte;
Var i: Word;
r, g, b: Integer;
j: byte;
Str: String;
RedArr, GreenArr, BlueArr: TColoreArr;
a: TColor;
Begin
X:= GetStart(Edit1.Text);
Y:= 2;
Str:= Memo1.Text;
if length(Str) > Image1.Height-5 then ShowMessage('Маленькая картинка ') else begin
i:= 1;
with Image1.Canvas do begin
while length(Str) mod 3 <> 0 do Str:= Str + ' ';
Pixels[x, y]:= RGB(length(Str) div 65536, (length(Str) mod 65536) div 255, (length(Str) mod 65536) mod 255); //записали кол -во символов
repeat
X:= 2 + (106*X+1230) mod (Image1.Width-3); //генератор псевдослучайной последовательности
Y:= Y + 3; //через три пикселя, для обеспечения размытия
//размоем точки методотом луча
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);
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;
Дата: 2019-12-22, просмотров: 266.