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

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 := '' + encoded64String + '';
parts := length(encoded64String) div PartSize;
inc(parts);
Label1.Caption := labeltext + #13#10 + 'Áóäåò ðàçáèòî íà ' + IntToStr(parts) + ' ñîîáù.';
end;
end.