zoukankan      html  css  js  c++  java
  • 简单取色器

    看到同事用了一个取色器,叫远方屏幕取色器,看着挺有意思,发现一个bug,取色的时候内存一直往上爬(原因是没有释放DC)。。模仿着写了一个,人家30几K,猜着应该用vb或者C#写的用exeinfope查了下

    果不其然,

    用Delphi xe3 3M多。。去掉杂七杂八2M多

    效果:

    代码:

    unit ColorPicker;
    
    interface
    
    uses
        Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
        System.Classes, Vcl.Graphics,
        Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls, Vcl.StdCtrls,
        Vcl.ActnMan,
        Vcl.ActnColorMaps, Vcl.GraphUtil, VCLTee.TeCanvas, Vcl.Imaging.pngimage,
        Vcl.Buttons, Vcl.Clipbrd, System.UIConsts, Vcl.ComCtrls;
    
    type
        TForm1 = class(TForm)
            Timer1: TTimer;
            ColorDialog1: TColorDialog;
            pgc1: TPageControl;
            ts1: TTabSheet;
            Label1: TLabel;
            lbl2: TLabel;
            btn1: TSpeedButton;
            lbl3: TLabel;
            Edit_hex: TEdit;
            pnl1: TPanel;
            Image2: TImage;
            Shape1: TShape;
            Panel2: TPanel;
            btn2: TButton;
            CheckBox1: TCheckBox;
            Memo1: TMemo;
            Image1: TImage;
            procedure Image1MouseDown(Sender: TObject; Button: TMouseButton;
              Shift: TShiftState; X, Y: Integer);
            procedure Image1MouseUp(Sender: TObject; Button: TMouseButton;
              Shift: TShiftState; X, Y: Integer);
            procedure Timer1Timer(Sender: TObject);
            procedure updateData(cc: Cardinal);
            procedure btn2Click(Sender: TObject);
            procedure chk1Click(Sender: TObject);
            procedure Image2MouseMove(Sender: TObject; Shift: TShiftState;
              X, Y: Integer);
            procedure btn1Click(Sender: TObject);
            procedure Shape1MouseDown(Sender: TObject; Button: TMouseButton;
              Shift: TShiftState; X, Y: Integer);
        private
            { Private declarations }
        public
            { Public declarations }
        end;
    
    var
        Form1: TForm1;
    
    implementation
    
    {$R *.dfm}
    
    var
        r, g, b: Byte;
        col: Cardinal;
    
    procedure TForm1.updateData(cc: Cardinal);
    var
        h, s, l: Word;
    begin
        r := GetRValue(cc);
        g := GetGValue(cc);
        b := GetBValue(cc);
        ColorRGBToHLS(cc, h, l, s);
    
        Memo1.Clear;
        Memo1.Lines.Add('红(R): ' + IntToStr(r));
        Memo1.Lines.Add('绿(G): ' + IntToStr(g));
        Memo1.Lines.Add('蓝(B): ' + IntToStr(b));
        Memo1.Lines.Add('色调(H): ' + IntToStr(h));
        Memo1.Lines.Add('饱和度(S): ' + IntToStr(s));
        Memo1.Lines.Add('亮度(L): ' + IntToStr(l));
        Edit_hex.Text := '#' + IntToHex(r, 2) + IntToHex(g, 2) + IntToHex(b, 2);
        // RGBToWebColorStr(cc)
    end;
    
    procedure TForm1.btn2Click(Sender: TObject);
    var
        rect: TRect;
    begin
        if not ColorDialog1.Execute then
            Exit;
        updateData(ColorDialog1.Color);
        Panel2.Color := ColorDialog1.Color;
        rect.SetLocation(0, 0);
        rect.Width := Image2.Width;
        rect.Height := Image2.Height;
        Image2.Canvas.Brush.Color := ColorDialog1.Color;
        Image2.Canvas.FillRect(rect);
    end;
    
    procedure TForm1.chk1Click(Sender: TObject);
    begin
        if CheckBox1.Checked then
            self.FormStyle := fsStayOnTop
        else
            self.FormStyle := TFormStyle.fsNormal;
    end;
    
    procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    var
        h: HCURSOR;
    begin
        Image1.Picture := nil;
        h := LoadCursor(HInstance, 'Cursor_1');
        SetSystemCursor(h, ocr_normal);
        Timer1.Enabled := true;
    
    end;
    
    procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
        Image1.Picture.Icon.LoadFromResourceName(HInstance, 'Icon_1');
        SystemParametersinfo(SPI_SETCURSORS, 0, NIL, SPIF_SENDCHANGE);
        Timer1.Enabled := false;
        WindowState := wsNormal;
    end;
    
    procedure TForm1.Image2MouseMove(Sender: TObject; Shift: TShiftState;
      X, Y: Integer);
    begin
        Shape1.Left := (X div 16) * 16;
        Shape1.Top := (Y div 16) * 16;
    end;
    
    procedure TForm1.Shape1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    var
        cal: Cardinal;
    begin
        //
        cal := GetPixel(Image2.Canvas.Handle, Shape1.Left, Shape1.Top);
        Panel2.Color := cal;
        // Shape1.Left := x - 16;
        // Shape1.top := y - 16;
        updateData(cal);
    end;
    
    procedure TForm1.btn1Click(Sender: TObject);
    begin
        //
        Clipboard.AsText := Edit_hex.Text;
    end;
    
    procedure TForm1.Timer1Timer(Sender: TObject);
    var
        outRect: TRect;
        point: TPoint;
        dc: HDC;
    begin
        //
        GetCursorPos(point);
        outRect := rect(Form1.Left, Form1.Top, Form1.Left + Form1.Width,
          Form1.Top + Form1.Height);
        if not PtInRect(outRect, point) then
        begin
            Label1.Caption := 'x: ' + IntToStr(point.X) + ',y: ' +
              IntToStr(point.Y);
            dc := GetDC(0);
            col := GetPixel(dc, point.X, point.Y);
    
            updateData(col);
            Panel2.Color := col;
            StretchBlt(Image2.Canvas.Handle, 0, 0, Image2.Width, Image2.Height, dc,
              point.X - 5, point.Y - 2, 8, 8, SRCCOPY);
            // Image2.Canvas.FillRect();
            Image2.Refresh;
            ReleaseDC(0, dc);
        end;
    
    end;
    
    end.
  • 相关阅读:
    关于图像分类问题读后感
    IO 输入流操作
    BP(back propagation)反向传播
    初识C++的类
    【转】贾扬清:希望Caffe成为深度学习领域的Hadoop
    转:谷歌大脑科学家 Caffe缔造者 贾扬清 微信讲座完整版
    cmd命令行给main传参数
    把vector中的string对象导入到字符指针数组中
    转:字符数组与字符指针
    MHI ,运动历史图像的的获取[下载自CSDN]
  • 原文地址:https://www.cnblogs.com/cause/p/3665068.html
Copyright © 2011-2022 走看看