Delphi中使用调色板创建渐变色位图
//创建调色板函数,R,G,B颜色分量,0-1之间取值
1 FUNCTION MaxGradientPalette(CONST RedFactor, GreenFactor, BlueFactor: Single): hPalette;
2 VAR
3 i : INTEGER;
4 LogicalPalette: TMaxLogPalette;
5 BEGIN
6 ASSERT (RedFactor <= 1); // values must be 0 to 1
7 ASSERT (GreenFactor <= 1);
8 ASSERT (BlueFactor <= 1);
9
10 LogicalPalette.palVersion := PaletteVersion;
11 LogicalPalette.palNumEntries := 256;
12 FOR i := 0 TO 255 DO
13 BEGIN
14 LogicalPalette.palPalEntry[i].peRed := Round(i * RedFactor);
15 LogicalPalette.palPalEntry[i].peGreen := Round(i * GreenFactor);
16 LogicalPalette.palPalEntry[i].peBlue := Round(i * BlueFactor);
17 LogicalPalette.palPalEntry[i].peFlags := PC_RESERVED;
18 END;
19 RESULT := CreatePalette(pLogPalette(@LogicalPalette)^);
20 END;
21
2 VAR
3 i : INTEGER;
4 LogicalPalette: TMaxLogPalette;
5 BEGIN
6 ASSERT (RedFactor <= 1); // values must be 0 to 1
7 ASSERT (GreenFactor <= 1);
8 ASSERT (BlueFactor <= 1);
9
10 LogicalPalette.palVersion := PaletteVersion;
11 LogicalPalette.palNumEntries := 256;
12 FOR i := 0 TO 255 DO
13 BEGIN
14 LogicalPalette.palPalEntry[i].peRed := Round(i * RedFactor);
15 LogicalPalette.palPalEntry[i].peGreen := Round(i * GreenFactor);
16 LogicalPalette.palPalEntry[i].peBlue := Round(i * BlueFactor);
17 LogicalPalette.palPalEntry[i].peFlags := PC_RESERVED;
18 END;
19 RESULT := CreatePalette(pLogPalette(@LogicalPalette)^);
20 END;
21
创建使用调色板的位图
1 procedure GradientBitmap(var ShowBitMap:TBitmap;CONST RedFactor, GreenFactor, BlueFactor: Single);
2 CONST
3 BitmapSize = 256;
4 VAR
5 i : INTEGER;
6 index : INTEGER;
7 j : INTEGER;
8 Row : pByteArray;
9 begin
10 ShowBitMap.PixelFormat := pf8bit;
11 ShowBitMap.Height := BitmapSize;
12 ShowBitMap.Width := BitmapSize;
13 // 1. Create palette first.
14 ShowBitMap.Palette:= MaxGradientPalette(RedFactor, GreenFactor, BlueFactor);
15
16 // 2. Assign Scanline value;
17 FOR j := 0 TO BitmapSize-1 DO
18 BEGIN
19 Row := ShowBitMap.Scanline[j];
20 FOR i := 0 TO BitmapSize-1 DO
21 BEGIN
22 index := (i+j) DIV 2;
23 Row[i] := index;
24 END
25 END;
26 end;
27
2 CONST
3 BitmapSize = 256;
4 VAR
5 i : INTEGER;
6 index : INTEGER;
7 j : INTEGER;
8 Row : pByteArray;
9 begin
10 ShowBitMap.PixelFormat := pf8bit;
11 ShowBitMap.Height := BitmapSize;
12 ShowBitMap.Width := BitmapSize;
13 // 1. Create palette first.
14 ShowBitMap.Palette:= MaxGradientPalette(RedFactor, GreenFactor, BlueFactor);
15
16 // 2. Assign Scanline value;
17 FOR j := 0 TO BitmapSize-1 DO
18 BEGIN
19 Row := ShowBitMap.Scanline[j];
20 FOR i := 0 TO BitmapSize-1 DO
21 BEGIN
22 index := (i+j) DIV 2;
23 Row[i] := index;
24 END
25 END;
26 end;
27
使用调色板位图,显示在Picture上面
1 procedure TFormPf8bit.Button4Click(Sender: TObject);
2 var
3 bitmap1:TBitmap;
4 begin
5 bitmap1:=TBitmap.Create;
6 GradientBitmap( bitmap1,0.5,0.2,1.0);
7 ImageShow.Picture.Graphic:=bitmap1;
8 bitmap1.Free;
9 end;
10
2 var
3 bitmap1:TBitmap;
4 begin
5 bitmap1:=TBitmap.Create;
6 GradientBitmap( bitmap1,0.5,0.2,1.0);
7 ImageShow.Picture.Graphic:=bitmap1;
8 bitmap1.Free;
9 end;
10
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 本地部署DeepSeek后,没有好看的交互界面怎么行!
· DeepSeek 解答了困扰我五年的技术问题。时代确实变了!
· 趁着过年的时候手搓了一个低代码框架
· 推荐一个DeepSeek 大模型的免费 API 项目!兼容OpenAI接口!