You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
317 lines
9.1 KiB
Plaintext
317 lines
9.1 KiB
Plaintext
unit clipfrm;
|
|
|
|
interface
|
|
|
|
uses
|
|
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
|
|
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls, Vcl.Tabs, Vcl.StdCtrls, CallExec,
|
|
jpeg, pngimage, ClipBrd, plugin, pluginutil, StrUtils, My.EncdDecd, GIFImg, IniFiles,
|
|
ColorQuantizationLibrary, PaletteLibrary;
|
|
|
|
{$I NoRTTI.inc}
|
|
|
|
type
|
|
TMyJPEGImage = class(TJPEGImage);
|
|
|
|
Tclipform = class(TForm)
|
|
TabSet1: TTabSet;
|
|
Label1: TLabel;
|
|
Panel1: TPanel;
|
|
Panel2: TPanel;
|
|
Panel3: TPanel;
|
|
Panel4: TPanel;
|
|
ScrollBox2: TScrollBox;
|
|
imgtmp: TImage;
|
|
Panel5: TPanel;
|
|
Label2: TLabel;
|
|
ComboBox1: TComboBox;
|
|
ScrollBox1: TScrollBox;
|
|
img: TImage;
|
|
SendBtn: TButton;
|
|
procedure imgMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
|
|
procedure FormShow(Sender: TObject);
|
|
procedure TabSet1Change(Sender: TObject; NewTab: Integer; var AllowChange: Boolean);
|
|
procedure SendBtnClick(Sender: TObject);
|
|
procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
|
|
procedure Panel1Resize(Sender: TObject);
|
|
procedure imgMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
|
|
procedure ComboBox1Change(Sender: TObject);
|
|
procedure FormCreate(Sender: TObject);
|
|
private
|
|
{ Private declarations }
|
|
public
|
|
{ Public declarations }
|
|
end;
|
|
|
|
var
|
|
clipform: Tclipform;
|
|
SX: Integer;
|
|
SY: Integer;
|
|
LX: Integer;
|
|
LY: Integer;
|
|
PaletteHandle: hPalette;
|
|
|
|
implementation
|
|
|
|
{$R *.dfm}
|
|
|
|
uses setpassform, sett;
|
|
|
|
function FormatByteSize(const bytes: Longint): string;
|
|
const
|
|
B = 1; // byte
|
|
KB = 1024 * B; // kilobyte
|
|
MB = 1024 * KB; // megabyte
|
|
GB = 1024 * MB; // gigabyte
|
|
begin
|
|
if bytes > GB then
|
|
result := FormatFloat('#.## ÃÁ', bytes / GB)
|
|
else if bytes > MB then
|
|
result := FormatFloat('#.## ÌÁ', bytes / MB)
|
|
else if bytes > KB then
|
|
result := FormatFloat('#.## ÊÁ', bytes / KB)
|
|
else
|
|
result := FormatFloat('#.## áàéò', bytes);
|
|
end;
|
|
|
|
procedure Tclipform.SendBtnClick(Sender: TObject);
|
|
var i, num, tnum: Integer;
|
|
scrfile: string;
|
|
begin
|
|
ViewPic.LoadSaved;
|
|
num := 0;
|
|
for i := 0 to ViewPic.scrlist.Items.Count - 1 do
|
|
begin
|
|
tnum := StrToInt(copy(ViewPic.scrlist.Items[i].Caption, 11, length(ViewPic.scrlist.Items[i].Caption)));
|
|
if tnum > num then
|
|
num := tnum;
|
|
end;
|
|
inc(num);
|
|
|
|
if TabSet1.TabIndex = 0 then
|
|
scrfile := userpath + 'Scr\' + FormatDateTime('hh.mm.ss_dd-mm-yy', now) + '_Screenshot' + IntToStr(num) + '.jpg'
|
|
else
|
|
scrfile := userpath + 'Scr\' + FormatDateTime('hh.mm.ss_dd-mm-yy', now) + '_Screenshot' + IntToStr(num) + '.png';
|
|
img.Picture.SaveToFile(scrfile);
|
|
ViewPic.OD.FileName := scrfile;
|
|
|
|
execOD := false;
|
|
clipform.Close;
|
|
ViewPic.SendImgBuf;
|
|
end;
|
|
|
|
procedure Tclipform.ComboBox1Change(Sender: TObject);
|
|
var ini: TIniFile; v: Boolean;
|
|
begin
|
|
TabSet1.OnChange(nil, TabSet1.TabIndex, v);
|
|
ini := TIniFile.Create(userpath + 'Pic-Is-Big-Set.ini');
|
|
ini.WriteString('Settings', 'JPEGQuality', IntToStr(ComboBox1.ItemIndex));
|
|
ini.Free;
|
|
end;
|
|
|
|
procedure Tclipform.FormCreate(Sender: TObject);
|
|
var ini: TIniFile;
|
|
begin
|
|
Icon.LoadFromResourceName(HInstance, 'PIC1');
|
|
ini := TIniFile.Create(userpath + 'Pic-Is-Big-Set.ini');
|
|
ComboBox1.ItemIndex := StrToInt(ini.ReadString('Settings', 'JPEGQuality', '5'));
|
|
ini.Free;
|
|
end;
|
|
|
|
procedure Tclipform.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
|
|
begin
|
|
if Key = VK_ESCAPE then
|
|
Close;
|
|
end;
|
|
|
|
procedure Tclipform.FormShow(Sender: TObject);
|
|
var MonNum: Integer; v: Boolean;
|
|
begin
|
|
MonNum := Screen.MonitorFromWindow(GetForegroundWindow, mdNearest).MonitorNum;
|
|
Self.Top := Screen.Monitors[MonNum].Top + ((Screen.Monitors[MonNum].Height div 2) - (Self.Height div 2));
|
|
Self.Left := Screen.Monitors[MonNum].Left + ((Screen.Monitors[MonNum].Width div 2) - (Self.Width div 2));
|
|
TabSet1.OnChange(nil, TabSet1.TabIndex, v);
|
|
|
|
img.Left := 0;
|
|
img.Top := 0;
|
|
imgtmp.Left := 0;
|
|
imgtmp.Top := 0;
|
|
LX := (img.Width - ScrollBox1.ClientWidth) * -1;
|
|
LY := (img.Height - ScrollBox1.ClientHeight) * -1;
|
|
end;
|
|
|
|
procedure Tclipform.imgMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
|
|
begin
|
|
SX := X;
|
|
SY := Y;
|
|
end;
|
|
|
|
procedure Tclipform.imgMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
|
|
var ks: TKeyBoardState;
|
|
NX: Integer; NY: Integer;
|
|
begin
|
|
GetKeyBoardState(ks);
|
|
if ks[VK_LBUTTON] >= 128 then
|
|
begin
|
|
NX := TWinControl(Sender).Left + X - SX;
|
|
NY := TWinControl(Sender).Top + Y - SY;
|
|
if (NX < 0) and (NX > LX) then
|
|
begin
|
|
img.Left := NX;
|
|
imgtmp.Left := NX;
|
|
end;
|
|
if (NY < 0) and (NY > LY) then
|
|
begin
|
|
img.Top := NY;
|
|
imgtmp.Top := NY;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure Tclipform.Panel1Resize(Sender: TObject);
|
|
begin
|
|
Panel2.Width := round(Panel1.Width / 2);
|
|
Panel4.Width := Panel2.Width;
|
|
LX := (img.Width - ScrollBox1.ClientWidth) * -1;
|
|
LY := (img.Height - ScrollBox1.ClientHeight) * -1;
|
|
end;
|
|
|
|
procedure Tclipform.TabSet1Change(Sender: TObject; NewTab: Integer; var AllowChange: Boolean);
|
|
var jpg: TMyJPEGImage;
|
|
png: TPNGImage;
|
|
bmp: TBitmap;
|
|
ms: TMemoryStream;
|
|
data1: pointer;
|
|
encoded64String: WideString;
|
|
PartSize: Integer;
|
|
labeltext: string;
|
|
const PG_PREF_VALUE = 103;
|
|
begin
|
|
Label1.Caption := 'Îáðàáîòêà...';
|
|
application.ProcessMessages;
|
|
ms := TMemoryStream.Create;
|
|
case NewTab of
|
|
0:
|
|
begin
|
|
ComboBox1.Show;
|
|
Label2.Show;
|
|
jpg := TMyJPEGImage.Create;
|
|
jpg.Assign(imgtmp.Picture.Bitmap);
|
|
case ComboBox1.ItemIndex of
|
|
0:
|
|
jpg.CompressionQuality := 50;
|
|
1:
|
|
jpg.CompressionQuality := 55;
|
|
2:
|
|
jpg.CompressionQuality := 60;
|
|
3:
|
|
jpg.CompressionQuality := 65;
|
|
4:
|
|
jpg.CompressionQuality := 70;
|
|
5:
|
|
jpg.CompressionQuality := 75;
|
|
6:
|
|
jpg.CompressionQuality := 80;
|
|
7:
|
|
jpg.CompressionQuality := 85;
|
|
8:
|
|
jpg.CompressionQuality := 90;
|
|
9:
|
|
jpg.CompressionQuality := 95;
|
|
10:
|
|
jpg.CompressionQuality := 100;
|
|
end;
|
|
jpg.ProgressiveEncoding := true;
|
|
jpg.ProgressiveDisplay := true;
|
|
jpg.Performance := jpBestQuality;
|
|
jpg.PixelFormat := jf24Bit;
|
|
jpg.Compress;
|
|
jpg.FreeBitmap;
|
|
jpg.SaveToStream(ms);
|
|
ms.Position := 0;
|
|
labeltext := IntToStr(jpg.Width) + 'x' + IntToStr(jpg.Height) + ' ' + FormatByteSize(ms.Size);
|
|
img.Picture.Assign(jpg);
|
|
jpg.Free;
|
|
end;
|
|
|
|
1:
|
|
begin
|
|
ComboBox1.Hide;
|
|
Label2.Hide;
|
|
png := TPNGImage.Create;
|
|
png.Assign(imgtmp.Picture.Bitmap);
|
|
png.CompressionLevel := 9;
|
|
png.SaveToStream(ms);
|
|
ms.Position := 0;
|
|
labeltext := IntToStr(png.Width) + 'x' + IntToStr(png.Height) + ' ' + FormatByteSize(ms.Size);
|
|
img.Picture.Assign(png);
|
|
png.Free;
|
|
end;
|
|
|
|
2:
|
|
begin
|
|
ComboBox1.Hide;
|
|
Label2.Hide;
|
|
bmp := TBitmap.Create;
|
|
bmp.Assign(imgtmp.Picture.Bitmap);
|
|
bmp.ReleasePalette;
|
|
bmp := ReduceColors(bmp, rmQuantizeWindows, dmNearest, 8, 0);
|
|
bmp.PixelFormat := pf8bit;
|
|
png := TPNGImage.Create;
|
|
png.Assign(bmp);
|
|
png.CompressionLevel := 9;
|
|
png.SaveToStream(ms);
|
|
ms.Position := 0;
|
|
labeltext := IntToStr(png.Width) + 'x' + IntToStr(png.Height) + ' ' + FormatByteSize(ms.Size);
|
|
img.Picture.Assign(png);
|
|
bmp.Free;
|
|
png.Free;
|
|
end;
|
|
|
|
3:
|
|
begin
|
|
ComboBox1.Hide;
|
|
Label2.Hide;
|
|
bmp := TBitmap.Create;
|
|
bmp.Assign(imgtmp.Picture.Bitmap);
|
|
bmp.PixelFormat := pf24bit;
|
|
bmp.ReleasePalette;
|
|
bmp := ReduceColors(bmp, rmPalette, dmNearest, 4, CopyPalette(CreateOptimizedPaletteForSingleBitmap(bmp, 4)));
|
|
bmp.PixelFormat := pf4bit;
|
|
png := TPNGImage.Create;
|
|
png.Assign(bmp);
|
|
png.CompressionLevel := 9;
|
|
png.SaveToStream(ms);
|
|
ms.Position := 0;
|
|
labeltext := IntToStr(png.Width) + 'x' + IntToStr(png.Height) + ' ' + FormatByteSize(ms.Size);
|
|
img.Picture.Assign(png);
|
|
bmp.Free;
|
|
png.Free;
|
|
end;
|
|
end;
|
|
|
|
data1 := callStr(AnsiChar(PM_GET) + AnsiChar(PG_PREF_VALUE) + _istring('use-crypt-msg'));
|
|
if _istring_at(data1, 6) = 'Yes' then
|
|
begin
|
|
PartSize := 5500;
|
|
labeltext := labeltext + #13#10'Øèôðîâàíèå: ÂÊË'
|
|
end
|
|
else
|
|
begin
|
|
PartSize := 7500;
|
|
labeltext := labeltext + #13#10'Øèôðîâàíèå: ÂÛÊË';
|
|
end;
|
|
|
|
ms.Seek(0, soFromBeginning);
|
|
encoded64String := EncodeBase64(ms.Memory, ms.Size);
|
|
ms.Free;
|
|
|
|
encoded64String := ' |
|
parts := length(encoded64String) div PartSize;
|
|
inc(parts);
|
|
|
|
Label1.Caption := labeltext + #13#10 + 'Áóäåò ðàçáèòî íà ' + IntToStr(parts) + ' ñîîáù.';
|
|
end;
|
|
|
|
end.
|