delphi下用Timage显示圆形的图像(还没有封装成控件)

2023-10-13 22:59

本文主要是介绍delphi下用Timage显示圆形的图像(还没有封装成控件),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

可以不用再写代码了,直接上DEMO(参考附件)

第四个按钮是最后效果按钮。

(由于 不能加附件,看来直接上代码了):

unit Unit1;


interface


uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, jpeg, ExtCtrls, StdCtrls, Spin;


type
  TForm1 = class(TForm)
    Image1: TImage;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    SpinEdit1: TSpinEdit;
    Button4: TButton;
    Panel1: TPanel;
    Image2: TImage;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
  private
    { Private declarations }
    procedure MyDraw;
  public
    { Public declarations }
  end;


var
  Form1: TForm1;


implementation


{$R *.dfm}
uses Math;


procedure TForm1.Button1Click(Sender: TObject);
begin
  MyDraw;
end;


procedure TForm1.Button2Click(Sender: TObject);
var
  
  desBmp, srcBmp: TBitmap;
  Bmp :TBitmap;
  FRgn :HRGN;
  R:TRect;
begin 
  Bmp := TBitmap.Create;
  try
    Bmp.PixelFormat := Image1.Picture.Bitmap.PixelFormat;
    Bmp.Width  :=100;
    Bmp.Height :=100;
    R := Image1.ClientRect;
    R.Left := 0;
    R.Top := 0;
    R.Bottom := 200;
    R.Right := 200;


    BitBlt(Bmp.Canvas.Handle,0,0,Bmp.Width,Bmp.Height,Image1.Canvas.Handle,100, 0,SRCCOPY); //要拷贝的位图
    //FRgn:= CreateEllipticRgnIndirect(R);
    FRgn := CreateEllipticRgn(0,0,200,200); //创建圆形区域
    SelectClipRgn(Image1.Canvas.Handle,FRgn); //选择剪切区域
    ///Image2.Canvas.Draw(0,0,Bmp); //位图位于区域内的部分加载
    Image2.Picture.Assign(bmp);
    //Image2.Canvas.Ellipse(R);


  finally
    Bmp.Free;
  end;
  DeleteObject(FRgn);
end;


procedure TForm1.MyDraw;
var
  bf: BLENDFUNCTION;
  desBmp, srcBmp: TBitmap;
  rgn: HRGN;
begin
  with bf do
  begin
    BlendOp := AC_SRC_OVER;
    BlendFlags := 0;
    AlphaFormat := 0;
    SourceConstantAlpha := 150; // 透明度,0~255
  end;
 
  desBmp := TBitmap.Create;
  srcBmp := TBitmap.Create;
  try
    //这里进行了转换(jpg的适应了bitmap
    srcBmp.Assign(image1.Picture.Graphic);
    
    image1.Picture.Assign(nil);
    image1.Picture.Bitmap.Assign(nil);


    desBmp.Width := srcBmp.Width;
    desBmp.Height := srcBmp.Height;
    Windows.AlphaBlend(desBmp.Canvas.Handle, 0, 0,
      desBmp.Width, desBmp.Height, srcBmp.Canvas.Handle,
      0, 0, srcBmp.Width, srcBmp.Height, bf);


    rgn := CreateEllipticRgn(80,0, 200, 120); // 创建一个圆形区域
    SelectClipRgn(srcBmp.Canvas.Handle, rgn);
    //画个透明的圈圈    
    srcBmp.Canvas.Draw(0, 0, desBmp); 
    image1.Picture.Bitmap.Assign(srcBmp);
  finally
    desBmp.Free;
    srcBmp.Free;
  end
end;


procedure TForm1.FormCreate(Sender: TObject);
var
  jp:TJPEGImage;
begin
  (*
   jp:=TJPEGImage.Create;
   jp.loadfromFile('1.jpg');
   Image1.Picture.Assign(jp);
   jp.Free;
   *)
   Image1.Picture.LoadFromFile('head.jpg');
   DoubleBuffered := True;
end;






procedure TForm1.Button3Click(Sender: TObject);
const
  BORDER = 3;
Var
  Bmp : TBitmap;
  w, h: Integer;
  x, y: Integer;    
  rgn: HRGN;
begin
  Bmp:=TBitmap.Create;
  try
    Bmp.PixelFormat:=pf24bit;
    Bmp.Canvas.Font.Name  :='Arial';                            // set the font to use
    Bmp.Canvas.Font.Size  :=20;                                 //set the size of the font
    Bmp.Canvas.Font.Color := clWhite;                           //set the color of the text
    w          := SpinEdit1.Value;//Bmp.Canvas.TextWidth(IntToStr(SpinEdit1.Value));   //calculate the width of the image
    h          := SpinEdit1.Value;//Bmp.Canvas.TextHeight(IntToStr(SpinEdit1.Value));  //calculate the height of the image
    Bmp.Width  := Max(w, h) + BORDER * 2;                       // get a square
    Bmp.Height := Max(w, h) + BORDER * 2;                       // get a square
    x          := (Bmp.Width  - w) div 2;                       // center
    y          := (Bmp.Height - h) div 2;                       // center
    Bmp.Canvas.Brush.Color := clBlue;                           //set the background
    //Bmp.Canvas.FillRect(Rect(0,0, Bmp.Width, Bmp.Height));      //paint the background which is transparent
    Bmp.Canvas.Brush.Color := clRed;                            // circle in red
    Bmp.Canvas.Pen.Color   := clRed;                            // circle in red
    //Bmp.Canvas.Ellipse(0, 0, Bmp.Width, Bmp.Height);            // draw the circle
    //Bmp.Canvas.TextOut(x, y, IntToStr(SpinEdit1.Value));            //draw the number


    BitBlt(Bmp.Canvas.Handle,0,0,Bmp.Width,Bmp.Height,Image1.Canvas.Handle,100, 0,SRCCOPY); //要拷贝的位图


    rgn := CreateEllipticRgn(0,0, 100, 100); // 创建一个圆形区域
    SelectClipRgn(bmp.Canvas.Handle, rgn);
    //Bmp.Canvas.Draw(0,0, bmp);


    Image2.Picture.Assign(bmp);                                   // assign the bmp to the image ; image.transparent = true, .stretch = true;
  finally
    Bmp.Free;
  end;
end;


procedure TForm1.Button4Click(Sender: TObject);
var
  bmp:TBitmap;
  Rhandle:HRGN;
  R:TRect;
begin


  Image2.Picture.LoadFromFile('head.jpg');
  Image2.AutoSize := true;
  R := Image2.ClientRect;
  bmp := TBitmap.Create;
  //bmp.LoadFromFile('1.bmp');
  bmp.Assign(Image2.Picture.Graphic);
  
  //Rhandle:=CreateRoundRectRgn(100,0,200,100,100,100);
  Rhandle:=CreateRoundRectRgn(0,0,Image2.Width,Image2.Height,Image2.Width,Image2.Height);


  Image2.Picture.Assign(nil);
  Image2.AutoSize := false;
  Image2.Stretch := false;
  Image2.Height := R.Bottom - R.Top;
  Image2.Width := R.Right - R.Left;


  Image2.Canvas.Brush.Color:=clRed;
  Image2.Canvas.FillRect(Image2.ClientRect);


  SelectclipRgn(Image2.Canvas.Handle,rHandle); 
  Image2.Canvas.Draw(0,0,bmp);
  deleteObject(Rhandle);
  Image2.Canvas.Brush.Style := bsClear;
  Image2.Picture.Bitmap.TransparentColor := clRed;
  Image2.Picture.Bitmap.Transparent      := True;
  Image2.Transparent:=True;
end;


end.


这篇关于delphi下用Timage显示圆形的图像(还没有封装成控件)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/206444

相关文章

豆包 MarsCode 不允许你还没有女朋友

在这个喧嚣的世界里,爱意需要被温柔地唤醒。为心爱的她制作每日一句小工具,就像是一场永不落幕的浪漫仪式,每天都在她的心田播撒爱的种子,让她的每一天都充满甜蜜与期待。 背景 在这个瞬息万变的时代,我们都在寻找那些能让我们慢下来,感受生活美好的瞬间。为了让这份浪漫持久而深刻,我们决定为女朋友定制一个每日一句小工具。这个工具会在她意想不到的时刻,为她呈现一句充满爱意的话语,让她的每一天都充满惊喜和感动

基于人工智能的图像分类系统

目录 引言项目背景环境准备 硬件要求软件安装与配置系统设计 系统架构关键技术代码示例 数据预处理模型训练模型预测应用场景结论 1. 引言 图像分类是计算机视觉中的一个重要任务,目标是自动识别图像中的对象类别。通过卷积神经网络(CNN)等深度学习技术,我们可以构建高效的图像分类系统,广泛应用于自动驾驶、医疗影像诊断、监控分析等领域。本文将介绍如何构建一个基于人工智能的图像分类系统,包括环境

第10章 中断和动态时钟显示

第10章 中断和动态时钟显示 从本章开始,按照书籍的划分,第10章开始就进入保护模式(Protected Mode)部分了,感觉从这里开始难度突然就增加了。 书中介绍了为什么有中断(Interrupt)的设计,中断的几种方式:外部硬件中断、内部中断和软中断。通过中断做了一个会走的时钟和屏幕上输入字符的程序。 我自己理解中断的一些作用: 为了更好的利用处理器的性能。协同快速和慢速设备一起工作

安卓链接正常显示,ios#符被转义%23导致链接访问404

原因分析: url中含有特殊字符 中文未编码 都有可能导致URL转换失败,所以需要对url编码处理  如下: guard let allowUrl = webUrl.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else {return} 后面发现当url中有#号时,会被误伤转义为%23,导致链接无法访问

C#实战|大乐透选号器[6]:实现实时显示已选择的红蓝球数量

哈喽,你好啊,我是雷工。 关于大乐透选号器在前面已经记录了5篇笔记,这是第6篇; 接下来实现实时显示当前选中红球数量,蓝球数量; 以下为练习笔记。 01 效果演示 当选择和取消选择红球或蓝球时,在对应的位置显示实时已选择的红球、蓝球的数量; 02 标签名称 分别设置Label标签名称为:lblRedCount、lblBlueCount

JavaSE——封装、继承和多态

1. 封装 1.1 概念      面向对象程序三大特性:封装、继承、多态 。而类和对象阶段,主要研究的就是封装特性。何为封装呢?简单来说就是套壳屏蔽细节 。     比如:对于电脑这样一个复杂的设备,提供给用户的就只是:开关机、通过键盘输入,显示器, USB 插孔等,让用户来和计算机进行交互,完成日常事务。但实际上:电脑真正工作的却是CPU 、显卡、内存等一些硬件元件。

lvgl8.3.6 控件垂直布局 label控件在image控件的下方显示

在使用 LVGL 8.3.6 创建一个垂直布局,其中 label 控件位于 image 控件下方,你可以使用 lv_obj_set_flex_flow 来设置布局为垂直,并确保 label 控件在 image 控件后添加。这里是如何步骤性地实现它的一个基本示例: 创建父容器:首先创建一个容器对象,该对象将作为布局的基础。设置容器为垂直布局:使用 lv_obj_set_flex_flow 设置容器

C# dateTimePicker 显示年月日,时分秒

dateTimePicker默认只显示日期,如果需要显示年月日,时分秒,只需要以下两步: 1.dateTimePicker1.Format = DateTimePickerFormat.Time 2.dateTimePicker1.CustomFormat = yyyy-MM-dd HH:mm:ss Tips:  a. dateTimePicker1.ShowUpDown = t

哈希表的封装和位图

文章目录 2 封装2.1 基础框架2.2 迭代器(1)2.3 迭代器(2) 3. 位图3.1 问题引入3.2 左移和右移?3.3 位图的实现3.4 位图的题目3.5 位图的应用 2 封装 2.1 基础框架 文章 有了前面map和set封装的经验,容易写出下面的代码 // UnorderedSet.h#pragma once#include "HashTable.h"

Verybot之OpenCV应用一:安装与图像采集测试

在Verybot上安装OpenCV是很简单的,只需要执行:         sudo apt-get update         sudo apt-get install libopencv-dev         sudo apt-get install python-opencv         下面就对安装好的OpenCV进行一下测试,编写一个通过USB摄像头采