Function GetStart(Str: String): Word; //задать начальное значение генератора
Поможем в ✍️ написании учебной работы
Поможем с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой

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, просмотров: 233.