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 
复制代码

 创建使用调色板的位图

复制代码
 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 
复制代码

 使用调色板位图,显示在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 
复制代码

 

posted on   流浪猫  阅读(1580)  评论(1编辑  收藏  举报

编辑推荐:
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
阅读排行:
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 本地部署DeepSeek后,没有好看的交互界面怎么行!
· DeepSeek 解答了困扰我五年的技术问题。时代确实变了!
· 趁着过年的时候手搓了一个低代码框架
· 推荐一个DeepSeek 大模型的免费 API 项目!兼容OpenAI接口!

导航

< 2008年10月 >
28 29 30 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31 1
2 3 4 5 6 7 8
点击右上角即可分享
微信分享提示