相关资料:

http://blog.csdn.net/tokimemo/article/details/18702689

http://www.myexception.cn/delphi/215402.html

http://bbs.csdn.net/topics/390627275

结果总结:

1.生成的环中间会少一部分颜色,颜色会小于16581375。

2.手动选择颜色不准,手容易抖,要支持用户输入准确的数值。

代码实例:

 unit Unit1;

 interface

 uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls; type
TForm1 = class(TForm)
Button1: TButton;
Image1: TImage;
CheckBox1: TCheckBox;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Label6: TLabel;
procedure Button1Click(Sender: TObject);
procedure Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
private
{ Private declarations }
public
{ Public declarations }
end; var
Form1: TForm1; implementation {$R *.dfm} //生成RGB色环的代码绘制
//传入图片的大小
function CreateColorCircle(const size: integer): TBitmap;
var
i,j,x,y: Integer;
radius: integer;
perimeter,arc,degree,step: double;
R,G,B: byte;
color: TColor;
begin
radius := round(size / );
RESULT := TBitmap.Create;
R:=;
G:=;
B:=;
with RESULT do
begin
width := size;
height:= size;
pixelFormat := pf24bit;
Canvas.Brush.Color := RGB(R,G,B);
x := size + ;
y := round(radius) + ;
Canvas.FillRect(Rect(size,round(radius),x,y));
for j := to size do
begin
perimeter := (size - j) * PI + ;
arc := perimeter / ;
step := ( * ) / perimeter ; //颜色渐变步长
for i := to round(perimeter) - do
begin
degree := / perimeter * i;
x := round(cos(degree * PI / ) * (size - j + ) / ) + radius;//数学公式,最后加上的是圆心点
y := round(sin(degree * PI / ) * (size - j + ) / ) + radius; if (degree > ) and (degree <= ) then
begin
R := ;
G := ;
B := round(step * i);
end;
if (degree > ) and (degree <= ) then
begin
if perimeter / / * (degree - ) > 1.0 then
R := - round(step * (i - arc))
else
R := - round(step * ABS(i - arc));
G := ;
B := ;
end;
if (degree > ) and (degree <= ) then
begin
R := ;
if perimeter / / * (degree - ) > 1.0 then
G := round(step * (i - * arc))
else
G := round(step * ABS(i - * arc));
B := ;
end;
if (degree > ) and (degree <= ) then
begin
R := ;
G := ;
if perimeter / / * (degree - ) > 1.0 then
B := - round(step * (i - perimeter / ))
else
B := - round(step * ABS(i - perimeter / ));
end;
if (degree > ) and (degree <= ) then
begin
if perimeter / / * (degree - ) > 1.0 then
R := round(step * (i - * arc))
else
R := round(step * ABS(i - * arc)) ;
G := ;
B := ;
end;
if (degree > ) and (degree <= ) then
begin
R := ;
if perimeter / / * (degree - ) > 1.0 then
G := - round(step * (i - * arc))
else
G := - round(step * ABS(i - * arc));
B := ;
end;
color := RGB( ROUND(R + ( - R)/size * j),ROUND(G + ( - G) / size * j),ROUND(B + ( - B) / size * j));
Canvas.Brush.Color := color;
//为了绘制出来的圆好看,分成四个部分进行绘制
if (degree >= ) and (degree <= ) then
Canvas.FillRect(Rect(x,y,x-,y-));
if (degree > ) and (degree <= ) then
Canvas.FillRect(Rect(x,y,x-,y-));
if (degree > ) and (degree <= ) then
Canvas.FillRect(Rect(x,y,x+,y+));
if (degree > ) and (degree <= ) then
Canvas.FillRect(Rect(x,y,x+,y+));
if (degree > ) and (degree <= ) then
Canvas.FillRect(Rect(x,y,x-,y-));
end;
end;
end;
end; //扣出中心的黑色圆
//输入图片与中心圆的半径
procedure BuckleHole(ABitmap: TBitmap; ARadius: Integer);
var
oBmp :TBitmap;
oRgn :HRGN;
begin
// oBmp := TBitmap.Create; //为了代码整齐就不写try了
// oBmp.PixelFormat := ABitmap.PixelFormat;
// oBmp.Width := ABitmap.Width;
// oBmp.Height := ABitmap.Height;
// BitBlt(oBmp.Canvas.Handle, 0, 0, oBmp.Width, oBmp.Height, ABitmap.Canvas.Handle, 80, 80, SRCCOPY); //要拷贝的位图
// oRgn := CreateEllipticRgn(0, 0, 100, 100); //创建圆形区域
// SelectClipRgn(ABitmap.Canvas.Handle, oRgn); //选择剪切区域
// ABitmap.Canvas.Draw(0, 0, oBmp); //位图位于区域内的部分加载
// oBmp.Free;
// DeleteObject(oRgn);
ABitmap.Canvas.Pen.Color := clBlack;
ABitmap.Canvas.Brush.Style := bsClear;
ABitmap.Canvas.Brush.Color := clBlack;
ABitmap.Canvas.Ellipse(Trunc(ABitmap.Width/)-ARadius, Trunc(ABitmap.Height/)-ARadius,
Trunc(ABitmap.Width/)+ARadius, Trunc(ABitmap.Height/)+ARadius);
end; //把中心圆做成透明的
procedure MyDraw(ABitmap: TBitmap; ARadius: Integer);
var
bf: BLENDFUNCTION;
desBmp, srcBmp: TBitmap;
rgn: HRGN;
begin
with bf do
begin
BlendOp := AC_SRC_OVER;
BlendFlags := ;
AlphaFormat := ;
SourceConstantAlpha := ; // 透明度,0~255
end; desBmp := TBitmap.Create;
srcBmp := TBitmap.Create; try
srcBmp.Assign(ABitmap); desBmp.Width := srcBmp.Width;
desBmp.Height := srcBmp.Height; Winapi.Windows.AlphaBlend(desBmp.Canvas.Handle, , ,
desBmp.Width, desBmp.Height, srcBmp.Canvas.Handle,
, , srcBmp.Width, srcBmp.Height, bf); rgn := CreateEllipticRgn(Trunc(ABitmap.Width/)-ARadius, Trunc(ABitmap.Height/)-ARadius,
Trunc(ABitmap.Width/)+ARadius, Trunc(ABitmap.Height/)+ARadius); // 创建一个圆形区域
SelectClipRgn(srcBmp.Canvas.Handle, rgn);
srcBmp.Canvas.Draw(, , desBmp); ABitmap.Assign(nil);
ABitmap.Assign(srcBmp);
finally
desBmp.Free;
srcBmp.Free;
end
end; procedure TForm1.Button1Click(Sender: TObject);
var
oBitmap: TBitmap;
rgn: HRGN;
begin
oBitmap := CreateColorCircle(Image1.Width);
if CheckBox1.Checked then //要不要代中心圆选项
// BuckleHole(oBitmap, 100);
MyDraw(oBitmap, );
Image1.Picture.Graphic := oBitmap;
oBitmap.Free;
end; procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
var
oColor: TColor;
begin
//鼠标移动时提取颜色RGB的值
with Image1 do
oColor := GetPixel(GetDC(Parent.Handle), X + left,Y + Top);
Label4.Caption := IntToStr(oColor and $FF);
Label5.Caption := IntToStr((oColor and $FF00) shr );
Label6.Caption := IntToStr((oColor and $FF0000) shr );
end; end.

Delphi实现RGB色环的代码绘制(XE10.2+WIN764)的更多相关文章

  1. Delphi汉字简繁体转换代码(分为D7和D2010版本)

    //delphi 7 Delphi汉字简繁体转换代码unit ChineseCharactersConvert; interface uses   Classes, Windows; type   T ...

  2. delphi 常用属性+方法+事件+代码+函数

    内容居中(属性) alignment->tacenter mome控件 禁用最大化(属性) 窗体-> BorderIcons属性-> biMaximize-> False 让鼠 ...

  3. Delphi图像处理 -- RGB与HSV转换

    阅读提示:     <Delphi图像处理>系列以效率为侧重点,一般代码为PASCAL,核心代码采用BASM.     <C++图像处理>系列以代码清晰,可读性为主,全部使用C ...

  4. Delphi图像处理 -- RGB与HSL转换

    阅读提示:     <Delphi图像处理>系列以效率为侧重点,一般代码为PASCAL,核心代码采用BASM.     <C++图像处理>系列以代码清晰,可读性为主,全部使用C ...

  5. Delphi语言最好的JSON代码库 mORMot学习笔记1

    mORMot没有控件安装,直接添加到lib路径,工程中直接添加syncommons,syndb等到uses里 --------------------------------------------- ...

  6. delphi 微信(WeChat)多开源代码

    在网上看到一个C++代码示例: 原文地址:http://bbs.pediy.com/thread-217610.htm 觉得这是一个很好的调用 windows api 的示例,故将其转换成了 delp ...

  7. Delphi如何在Form的标题栏绘制自定义文字

    Delphi中Form窗体的标题被设计成绘制在系统菜单的旁边,如果你想要在标题栏绘制自定义文本又不想改变Caption属性,你需要处理特定的Windows消息:WM_NCPAINT.. WM_NCPA ...

  8. Delphi调用JAVA的WebService上传XML文件(XE10.2+WIN764)

    相关资料:1.http://blog.csdn.net/luojianfeng/article/details/512198902.http://blog.csdn.net/avsuper/artic ...

  9. Delphi语言最好的JSON代码库 mORMot学习笔记1(无数评论)

    mORMot没有控件安装,直接添加到lib路径,工程中直接添加syncommons,syndb等到uses里 --------------------------------------------- ...

随机推荐

  1. CSS艺术字

    一.使用canvas自己画 1. 脚本部分 <script type="text/javascript"> function drawText() { var canv ...

  2. ICDAR2015 数据处理及训练

    训练数据处理: 天池ICPR2018和MSRA_TD500两个数据集: 1)天池ICPR的数据集为网络图像,都是一些淘宝商家上传到淘宝的一些商品介绍图像,其标签方式参考了ICDAR2015的数据标签格 ...

  3. [转]gdb调试多进程和多线程命令

    1. 默认设置下,在调试多进程程序时GDB只会调试主进程.但是GDB(>V7.0)支持多进程的分别以及同时调试,换句话说,GDB可以同时调试多个程序.只需要设置follow-fork-mode( ...

  4. mybatis与mysql中的Date和String之间转换

    在javaweb开发过程中,难免会使用日期类型,在持久化时java的日期格式可以是String,Date.mysql格式可以是varchar,datetime.他们之间如何进行相互转化? 1 java ...

  5. springboot 中使用Druid 数据源提供数据库监控

    一.springboot 中注册 Servlet/Filter/Listener 的方式有两种,1 通过代码注册 ServletRegistrationBean. FilterRegistration ...

  6. xbox360 双65厚机自制系统无硬盘 U盘玩游戏方法

    因为没有硬盘,又没有光盘.所以想把游戏放在U盘里面.用U盘来做为硬盘玩游戏. 现有的自制系统主要是FSD,但是FSD要用硬盘才能安装,理论上U盘也可以,但是我没有尝试了. 这里介绍的是玩xex格式的游 ...

  7. Oracle多表关联如何更新多个字段

    注意点:1.被update主表一定要加上过滤条件.2.查询出来更新结果集,同时也要作为被更新主表的条件,作为同步大家都是更新这部分数据.update student stu set (stu.name ...

  8. vmware磁盘文件(vmdk)迁移

    原因:由于虚拟机安装时硬盘分配20G,随着虚拟机数据增多,磁盘占用也增多.磁盘总可用空间不能满足虚拟机数据增多.虽然虚拟机数据还没到20G,但磁盘总可用空间小,导致虚拟机继续运行时报空间不足. 解决办 ...

  9. virtualbox和vagrant卸载脚本在macbook

    virtualbox和vagrant在macbook版本的安装文件内,都有一个卸载脚本uninstall.tool vagrant2.1.5卸载脚本: #!/usr/bin/env bash #--- ...

  10. 互斥锁pthread_mutex_init()函数

    linux下为了多线程同步,通常用到锁的概念.posix下抽象了一个锁类型的结构:ptread_mutex_t.通过对该结构的操作,来判断资源是否可以访问.顾名思义,加锁(lock)后,别人就无法打开 ...