GDI+学习及代码总结之-----坐标变换、矩阵变换及色彩变换

使用GDI+绘制旋转的图形及图片  如果要绘制半透明的图片,请使用.png格式(用photoshop即可轻松制作并处理)一、首先介绍Graphics的两个函数,RotateTransform:将整个坐标系逆时针旋转一定角度TranslateTransform:将整个坐标系偏移到某个位置本例要实现的功能是在指定位置上旋转图片,首先需要将整个坐标系偏移到指定位置,在进行坐标系的旋转,在函数使用上应先旋转在偏移(与我 阅读详情

坐标变换、矩阵变换

在Graphics类中,有几个函数实现了简单的坐标变换

[cpp]  view plain copy
  1. Graphics::TranslateTransform(dx, dy, order)//平移坐标系  
  2. Graphics::RotateTransform(angle, order)//旋转坐标系  
  3. Graphics::ScaleTransform(sx, sy, order)//缩放坐标系  
这里有个order参数着重讲一下,它是指矩阵的乘法顺序,是左乘还是右乘;

除了这几个基本函数以外,还可以使用矩阵来变换坐标系,使用

[cpp]  view plain copy
  1. Graphics::SetTransform(matrix)  
来进行设置,但目前还用不太到矩阵变换,所以就先不仔细写笔记了,如果想具体了解,看《精通GDI+编程》第六章

色彩变换

GDI+提供了Image类和Bitmap类来保存、维护图片的信息。对于色彩的存储,Image类和Bitmap类使用一个32位的数值来保存。红、绿、蓝及透明度各占8位,每一个色彩分量的取值范围是0-255。透明度为0表示完全透明,为255时,色彩完全可见。对透明度的的支持是GDI+的一大特色,但同时也为色彩的运算增加了一定的难度。

一、色彩信息的矩阵表示

四阶表示

由于一个色彩信息包含R、G、B、Alpha信息,所以,我们必然要使用一个4阶色彩变换矩阵来修改色彩的每一个分量值:


注意:对于色彩变换矩阵,这里的色彩顺序是R、G、B、A而不是A、R、G、B!!!

如果想将色彩(0,255,0,255)更改为半透明时,可以使用下面的的矩阵运算来表示:

为什么使用五阶矩阵

上面使用四阶矩阵完全可以改变图片的RGBA值了,但考虑一种情况,如果我们只想在原有的R色上增加一些分量呢?
这时,我们就得再多加一阶来表示平移变换。所以,一个既包含线性变换,又包含平移变换的组合变换,称为仿射变换。使用四阶的色彩变换矩阵来修改色彩,只能够对色彩的每一个分量值进行乘(除)运算,如果要对这些分量值进行加减法的运算(平移变换),只能通过五阶矩阵来完成。
考虑下面这个变换:
1、红色分量值更改为原来的2倍;
2、绿色分量增加100;
则使用4阶矩阵的乘法无法实现,所以,应该在四阶色彩变换矩阵上增加一个“哑元坐标”,来实现所列的矩阵运算。

这个矩阵中,分量值用的是100,但在实际应用中,并没有100这个数,而是用下面的分量饱和度的方法来表示的。
色彩饱和度,是指某色彩占总饱和度(255)的分量,比如一个像素的红色(R值)值为A,那么A/255的值就称为红色分量饱和度。上面的100分量,它的饱和度就是100/255=0.39

所以,假设有一个像素的色彩值为(0.2,0.0,0.7,1)---注意用了色彩饱和度表示,在实际运算中,就是这么表示的。如果想达到对红色分量饱和度扩大2倍,并且分别将3种基准色的饱和度都加上0.2,则引入的色彩矩阵应该是:

GDI+的色彩变换矩阵(ColorMatrix)

在上面的所有讲解之后,大家也应该看出来了,色彩变换矩阵的表示形式,肯定是五阶的那种,所以大家看一下,在默认情况下,色彩变换矩阵的形式:

所以跟上面的讲解一样:
1、对角线上的数值,相当于对RGB分量进行乘法操作。
2、修改最后一行上的数值,相当于对RGB分量的饱和度进行加(减)运算。
GDI+对色彩变换矩阵的修改是通过ImageAttributes对象的SetColorMatrix函数进行的,其调用方法如下:

[cpp]  view plain copy
  1. Status SetColorMatrix(  
  2.   const ColorMatrix* colorMatrix,  
  3.   ColorMatrixFlags mode,  
  4.   ColorAdjustType type  
  5. );  

参数说明:
colorMatrix:[in]色彩变换矩阵,数据类型为ColorMatrix,下面具体讲;
mode:[in]修改的标记,ColorMatrixFlags枚举类,它的值可以是以下3个

[cpp]  view plain copy
  1. enum ColorMatrixFlags{  
  2.   ColorMatrixFlagsDefault   = 0,//修改所有的颜色值,包括灰度;  
  3.   ColorMatrixFlagsSkipGrays = 1,//修改所有的颜色值,但不包括灰度;  
  4.   ColorMatrixFlagsAltGray   = 2//对灰度和颜色使用不同的色彩变换矩阵进行修改;  
  5. };  
type:[in]使用色彩矩阵调整的对象;
着重讲下colorMatrix
先看下定义:
[cpp]  view plain copy
  1. struct ColorMatrix{  
  2.   REAL  m[5][5];//5*5数组  
  3. };  
所以我们在定义ColorMatrix时,应当这样赋值
[cpp]  view plain copy
  1. ColorMatrix colorMatrix={  
  2.     1.0f,0.0f,0.0f,0.0f,0.0f,  
  3.     0.0f,2.0f,0.0f,0.0f,0.0f, //将绿色调调整为原来的2倍  
  4.     0.0f,0.0f,1.0f,0.0f,0.0f,  
  5.     0.0f,0.0f,0.0f,1.0f,0.0f,  
  6.     0.0f,0.2f,0.0f,0.0f,1.0f//在将绿色,在原有绿色调的基础上增加0.2饱和度  
  7. };  
就是上面这个转换矩阵,看个例子
[cpp]  view plain copy
  1. Image image(L"wlh.bmp");  
  2. ImageAttributes imageAttributes;  
  3. UINT width=image.GetWidth();  
  4. UINT height=image.GetHeight();  
  5.   
  6. ColorMatrix colorMatrix={  
  7.     1.0f,0.0f,0.0f,0.0f,0.0f,  
  8.     0.0f,1.0f,0.0f,0.0f,0.0f,  
  9.     0.0f,0.0f,1.0f,0.0f,0.0f,  
  10.     0.0f,0.0f,0.0f,1.0f,0.0f,  
  11.     0.0f,0.2f,0.0f,0.0f,1.0f  
  12. };  
  13. imageAttributes.SetColorMatrix(&colorMatrix,ColorMatrixFlagsDefault,ColorAdjustTypeBitmap);  
  14.   
  15. graphics.DrawImage(&image,RectF(0,0,width,height));  
  16. graphics.TranslateTransform(width+10,0);  
  17. graphics.DrawImage(&image,Rect(0,0,width,height),0,0,width,height,UnitPixel,&imageAttributes);  

二、色彩几种运算方式 (平移、缩放、旋转、投射)

色彩的平移运算

色彩的平移运算,实际上就是色彩的加法运算。其实就是在色彩变换矩阵的最后一行加上某个值;

图中的灰色部分就是参与色彩平移运算的4个矩阵元素。
我们看个例子,(图片中红色分量增加0.2饱和度)

[cpp]  view plain copy
  1. Image image(L"wlh.bmp");  
  2. ImageAttributes imageAttributes;  
  3. UINT width=image.GetWidth();  
  4. UINT height=image.GetHeight();  
  5.   
  6. ColorMatrix colorMatrix={  
  7.     1.0f,0.0f,0.0f,0.0f,0.0f,  
  8.     0.0f,1.0f,0.0f,0.0f,0.0f,  
  9.     0.0f,0.0f,1.0f,0.0f,0.0f,  
  10.     0.0f,0.0f,0.0f,1.0f,0.0f,  
  11.     0.2f,0.0f,0.0f,0.0f,1.0f  
  12. };  
  13. imageAttributes.SetColorMatrix(&colorMatrix,ColorMatrixFlagsDefault,ColorAdjustTypeBitmap);  
  14.   
  15. graphics.DrawImage(&image,RectF(0,0,width,height));  
  16. graphics.TranslateTransform(width+10,0);  
  17. graphics.DrawImage(&image,Rect(0,0,width,height),0,0,width,height,UnitPixel,&imageAttributes);  

我们看右边的图像是怎么变过来的,由于图片是由一个个像素组成的,所以用每个像素的饱和度组成数组,来乘转换矩阵,结果就是转换后的当前点的颜色值, 值得说明的是,颜色的饱和度最大为1,当运算后的值超过1时,截取小数部分做为色彩分量饱和度(书上是这么写的P284,但试验之后,并不是); 看下面这个转换例子:

色彩的缩放运算

色彩的缩放运算其实就是色彩的乘法运算。在色彩矩阵对角线上的分别代表R、G、B、A的几个值,将其分别乘以指定的值。这就是所谓的缩放变换。

再重复一遍:值得说明的是,颜色的饱和度最大为1,当运算后的值超过1时,截取小数部分做为色彩分量饱和度(书上是这么写的P284,但试验之后,并不是);

看个例子吧:(将蓝色分量扩大两倍)

[cpp]  view plain copy
  1. Image image(L"wlh.bmp");  
  2. ImageAttributes imageAttributes;  
  3. UINT width=image.GetWidth();  
  4. UINT height=image.GetHeight();  
  5.   
  6. ColorMatrix colorMatrix={  
  7.     1.0f,0.0f,0.0f,0.0f,0.0f,  
  8.     0.0f,1.0f,0.0f,0.0f,0.0f,  
  9.     0.0f,0.0f,2.0f,0.0f,0.0f,//B分量变为2倍  
  10.     0.0f,0.0f,0.0f,1.0f,0.0f,  
  11.     0.0f,0.0f,0.0f,0.0f,1.0f  
  12. };  
  13. imageAttributes.SetColorMatrix(&colorMatrix,ColorMatrixFlagsDefault,ColorAdjustTypeBitmap);  
  14.   
  15. graphics.DrawImage(&image,RectF(0,0,width,height));  
  16. graphics.TranslateTransform(width+10,0);  
  17. graphics.DrawImage(&image,Rect(0,0,width,height),0,0,width,height,UnitPixel,&imageAttributes);  

缩放变换的特殊应用(通道输出)

由于在色彩变换矩阵中,对角线上的数的取值范围是从0-1的,所以当取0时,这个色彩就完全不显示,所以当我们R、G都取0,而独有B取1时,就只显示了蓝色,所形成的图像也就是我们通常说的蓝色通道;看下几个通道输出的效果图:

示例:(只演示绿色通道输出)

[cpp]  view plain copy
  1. Image image(L"wlh.bmp");  
  2. ImageAttributes imageAttributes;  
  3. UINT width=image.GetWidth();  
  4. UINT height=image.GetHeight();  
  5.   
  6. ColorMatrix colorMatrix={  
  7.     0.0f,0.0f,0.0f,0.0f,0.0f,  
  8.     0.0f,1.0f,0.0f,0.0f,0.0f,  
  9.     0.0f,0.0f,0.0f,0.0f,0.0f,  
  10.     0.0f,0.0f,0.0f,1.0f,0.0f,  
  11.     0.0f,0.0f,0.0f,0.0f,1.0f  
  12. };  
  13. //绘制原图  
  14. graphics.DrawImage(&image,RectF(0,0,width,height));  
  15. //绘制变换后的图像  
  16. graphics.TranslateTransform(width+10,0);  
  17. imageAttributes.SetColorMatrix(&colorMatrix,ColorMatrixFlagsDefault,ColorAdjustTypeBitmap);  
  18. graphics.DrawImage(&image,Rect(0,0,width,height),0,0,width,height,UnitPixel,&imageAttributes);  

色彩的旋转运算

RGB色是如何旋转的呢,首先用R、G、B三色建立立体坐标系:

所以,我们可以把一个色彩值看成三维空间里的一个点,色彩值的三个分量可以看成该点的坐标(三维坐标)。我们先不考虑,在三个维度综合情况下是怎么旋转的,我们先看看,在某个轴做为Z轴,在另两个轴形成的平面上旋转的情况,下图分析了,在将蓝色轴做为Z轴,仅在红—绿平面上旋转a度的情况:


这里我们分别讲解下为什么最终的R=原R*cosa-原G*sina;
在图中,我们可以看到,在旋转后,原R在R轴的分量变为:原R*cosa,但原G分量在旋转后,在R轴上也有了分量,但分量落在了负轴上,所以我们要减去这部分分量,所以最终的结果是最终的R=原R*cosa-原G*sina;

下面就看下书上关于几种旋转计算及结果矩阵,(注意:这几个图只标记了原X轴色彩分量的旋转,没有把Y轴色彩分量的旋转标记出来)

构造一个“红色绕着蓝色旋转”的色彩变换矩阵

构造一下“绿色绕着红色旋转”的色彩变换矩阵


构造一下“蓝色绕着红色旋转”的色彩变换矩阵


示例:(红色向蓝色旋转60度)
注意:为了演示如何清除色彩矩阵,这里颠倒了变换图像与原图的显示顺序;注意加上头文件<math.h>

[cpp]  view plain copy
  1. Image image(L"wlh.bmp");  
  2. ImageAttributes imageAttributes;  
  3. UINT width=image.GetWidth();  
  4. UINT height=image.GetHeight();  
  5. //红色绕蓝色旋转  
  6. ColorMatrix colorMatrix={  
  7.     cos(60.0f),sin(60.0f),0.0f,0.0f,0.0f,  
  8.     -sin(60.0f),cos(60.0f),0.0f,0.0f,0.0f,  
  9.     0.0f,0.0f,1.0f,0.0f,0.0f,  
  10.     0.0f,0.0f,0.0f,1.0f,0.0f,  
  11.     0.0f,0.0f,0.0f,0.0f,1.0f  
  12. };  
  13. imageAttributes.SetColorMatrix(&colorMatrix,ColorMatrixFlagsDefault,ColorAdjustTypeBitmap);  
  14. graphics.DrawImage(&image,Rect(0,0,width,height),0,0,width,height,UnitPixel,&imageAttributes);  
  15. //输出原图  
  16. graphics.TranslateTransform(width+10,0);  
  17. imageAttributes.ClearColorMatrix(ColorAdjustTypeBitmap);//清除色彩变换  
  18. graphics.DrawImage(&image,RectF(0,0,width,height));  

色彩的投射运算

上面我们对对角线上的值进行了修改,对最后一行的值进行了修改,但对其它位置的值还没有修改。这里指的位置,看下图阴影部分;

对这些值进行修改时,修改所使用的增加值来自于其它色彩分量的信息。
看下具体的运算方式:

注意:最终结果的0.5=0.2*1+1*0.3,可见红色分量在原有红色分量的基础上,增加了绿色分量值的0.3倍;利用其它色彩分量的倍数来更改自己色彩分量的值,这种运算就叫投射运算。

示例:(红色分量在原有基础上增加上绿色分量的40%)

[cpp]  view plain copy
  1. Image image(L"wlh.bmp");  
  2. ImageAttributes imageAttributes;  
  3. UINT width=image.GetWidth();  
  4. UINT height=image.GetHeight();  
  5.   
  6. ColorMatrix colorMatrix={  
  7.     1.0f,0.0f,0.0f,0.0f,0.0f,  
  8.     0.0f,1.0f,0.0f,0.0f,0.0f,  
  9.     0.4f,0.0f,1.0f,0.0f,0.0f,//增加绿色分量值的0.4倍  
  10.     0.0f,0.0f,0.0f,1.0f,0.0f,  
  11.     0.0f,0.0f,0.0f,0.0f,1.0f  
  12. };  
  13. //绘制原图  
  14. graphics.DrawImage(&image,RectF(0,0,width,height));  
  15. //绘制变换后的图  
  16. graphics.TranslateTransform(width+10,0);  
  17. imageAttributes.SetColorMatrix(&colorMatrix,ColorMatrixFlagsDefault,ColorAdjustTypeBitmap);  
  18. graphics.DrawImage(&image,Rect(0,0,width,height),0,0,width,height,UnitPixel,&imageAttributes);  

三、色彩映射 (色彩替换)

色彩映射,说白了,就是对图片原有的颜色进行替换,比如将原来的蓝色替换成红色。在制作电视时,背景通常都是蓝色的,目的是为了方便后期视频的深加工。如果需要更改背景或者进行视频合成,只需要将蓝色背景抠去,保留主要画面就行了。

GDI+中使用ColorMap结构体就能实现将指定颜色替换成其它颜色。ImageAttributes类的SetRemapTable(设置重映射表)可以将这个数据结构应用到图像中,SetRemapTable函数的调用格式为:

[cpp]  view plain copy
  1. Status SetRemapTable(  
  2.   UINT mapSize,  
  3.   const ColorMap* map,  
  4.   ColorAdjustType type  
  5. );  
ColorMap的定义格式如下:
[cpp]  view plain copy
  1. struct ColorMap{  
  2.   Color  oldColor;  
  3.   Color  newColor;  
  4. };  
参数说明:
mapSize:
[in]ColorMap数组大小;
map:[in]ColorMap数组,表示一种或多种色彩替换的对应关系,如果数组中定义了多个替换关系,那么所有被定义要替换的颜色都将被替换掉。
type:[in]表示在什么对象上进行色彩替换。

示例:(将原图中的背景,全部替换成纯红色 ---注意背景由两种颜色组成 )
[cpp]  view plain copy
  1. Image image(L"wlh.bmp");  
  2. ImageAttributes imageAttributes;  
  3. UINT width=image.GetWidth();  
  4. UINT height=image.GetHeight();  
  5.   
  6. ColorMap colorMap[2];  
  7. colorMap[0].oldColor=Color(255,0,0,255);  
  8. colorMap[0].newColor=Color(255,255,0,0);  
  9. colorMap[1].oldColor=Color(255,0,145,247);  
  10. colorMap[1].newColor=Color(255,255,0,0);  
  11.   
  12. imageAttributes.SetRemapTable(2,colorMap,ColorAdjustTypeBitmap);  
  13. graphics.DrawImage(&image,RectF(0,0,width,height));  
  14. //绘制变换后的图  
  15. graphics.TranslateTransform(width+10,0);  
  16. graphics.DrawImage(&image,Rect(0,0,width,height),0,0,width,height,UnitPixel,&imageAttributes);  





Windows 2D 绘图技术演进:从 GDI 到 Direct2D 的实战对比 本文深入探讨了Windows平台上2D绘图技术的演进历程,从经典的GDI到面向对象的GDI+,再到硬件加速的Direct2D。通过详细的代码示例和性能对比,分析了各技术的核心特性、适用场景及实战应用,为开发者提供技术选型指南。特别强调了Direct2D在现代图形应用中的性能优势及其与GPU加速的深度整合。 阅读详情

相关推荐

WPF面试题:WPF图形变形使用技巧

在 WPF (Windows Presentation Foundation) 中,图形变形通常是通过使用 Transform 对象来实现的。

琅嬛福地 951

C# Graphics旋转和TranslateTransform及RotateTransform用法

C# Graphics旋转有两个主要函数TranslateTransform(int x,int y)及RotateTransform(int angle); x,y参数代表旋转变换中心(意味着使用这个函数会将屏幕原点由左上角变为设定的x,y)。如图示意,如果想将自己绘制的椭圆以中心旋转,可以将参数x,y设置为原来椭圆中心,此时坐标原点会移到到之前的(x,y),不要忘记这一点; angle代表

qianlinjun的博客 3万+

VC6可直接打开编译的MFC轻量CAD绘图源码(含完整工程与资源文件)

这个源码包是专为Visual C++ 6.0环境准备的轻量级CAD绘图程序,结构完整、开箱即用。包含标准MFC四层框架:主窗口(MainFrm)、子窗口(ChildFrm)、文档类(ECADDoc)和视图类(ECADView),所有头文件(.h)与实现文件(.cpp)齐全,配套资源文件如Toolbar.bmp、ECAD.ico、ECADDoc.ico、resource.h也都已集成。工程文件ECAD.dsw和ECAD.dsp可直接在VC6中加载,无需额外配置即可成功编译生成ECAD.exe。包内还提供调试支

flink9streamer的博客 236

C# Graphics类的用法

Graphics.RotateTransform;

haier123888的博客 7528

WinForm定制控件:实现360、QQ风格窗体与控件

WinForm框架为开发者提供了一套完整的界面元素,如按钮、文本框、列表框等,使得创建桌面软件变得简单直观。开发者可以利用WinForm快速实现需求并部署应用程序,适合快速开发各种业务软件。GDI+(Graphics Device Interface Plus)是Windows操作系统中用于处理图形的API,它在GDI(Graphics Device Interface)的基础上进行了大量的扩展和完善。GDI+提供了更为丰富的图形对象,支持图像处理、字体渲染、颜色管理以及二维矢量图形等功能。

weixin_31620365的博客 832

C# Graphics旋转与变换[可运行源码]

本文详细介绍了C#中Graphics类的两个主要旋转函数TranslateTransform和RotateTransform的用法。TranslateTransform用于设置旋转变换中心,将屏幕原点移动到指定坐标;RotateTransform则用于设置旋转角度,顺时针方向旋转。文章还提供了以椭圆中心旋转的具体步骤,包括如何调整坐标原点及绘制椭圆时的注意事项。通过示例代码和图示,帮助开发者更好地理解和应用这两种变换方法。

GDI+ 之变换

坐标变换、矩阵变换 在Graphics类中,有几个函数实现了简单的坐标变换 [cpp] view plaincopy Graphics::TranslateTransform(dx, dy, order)//平移坐标系   Graphics::RotateTransform(angle, order)//旋转坐标系   Graphi

乱码涅磐的专栏 896

pandas,构造MultiIndex的四种方法:from_tuples、from_arrays、from_product、from_frame

1、from_tuples:通过 “元组对” 构造MultiIndex """ 一对元组,为一个索引 """ tuples = [(1, 'red'), (1, 'blue'), (2, 'red'), (2, 'blue')] pd.MultiIndex.from_tuples(tuples, names=('number', 'color')) 2、from_arrays:通过 “列表元素的组合” 构造MultiIndex """ 列中表的元素,按位置 对应组合,形成索引 """ arrays

jieru_liu的博客 5387

GDI+编程小结

GDI+(Graphics Device Interface Plus图形设备接口加)是Windows XP和Windows Server 2003操作系统的子系统,也是.NET框架的重要组成部分,负责在屏幕和打印机上绘制图形图像和显示信息。 GDI+不但在功能上比GDI 要强大很多,而且在代码编写方面也更简单,因此会很快成为Windows图形图像程序开发的首选。 一、...

积累点滴,保持自我 5873

STM32CubeMx + FatFs 实战:SD卡DMA传输中断回调问题深度解析

本文深度解析了在STM32CubeMx环境下,结合FatFs文件系统并使用DMA进行SD卡读写时,程序可能出现的“卡死”问题。核心原因在于HAL库的弱函数回调机制未被正确处理,导致DMA传输完成中断后,状态机锁死。文章提供了两种实战修复方案:直接修改HAL库文件或在用户代码中重写回调函数,并给出了关键的配置检查点与调试技巧,帮助开发者彻底解决SD卡DMA传输中断回调失效的难题。

weixin_29176179的博客 330

晶圆测试(wafer sort)全流程解析:从探针卡到良率统计的实战指南

本文详细解析了晶圆测试(wafer sort)的全流程,从探针卡选型到良率统计的实战指南。涵盖了12英寸先进制程产线的关键技术,包括探针卡系统、测试程序开发、产线自动化集成及数据分析,特别聚焦多站点并行测试的时序优化和接触阻抗异常排查,帮助工程师提升测试效率与准确性。

weixin_29279153的博客 731

第5章,[标签 Win32] :GDI 的其他方面的分类

Windows 程序设计

2401_82825368的博客 419

将外部电磁近场数据导入 ANSYS HFSS

本博客介绍了如何将电磁近场数据导入 ANSYS HFSS。用户可能需要导入字段,无论是通过分析计算、测量、由其他工具生成还是从提供商处接收的字段,并将其用作实际激励来执行不同类型的分析。以下是导入过程的简要概述,视频链接中提供了完整的演示。为了定义简单基元近场源,HFSS 使用两种外部数据文件。首先,实际位置/字段数据以 .nfd 格式存储。其次,Ansys Near field Descriptor 文件(.and 文件)存储 .nfd 数据的一般几何信息和路径。

jkh920184196的博客 2323

Windows程序设计:GDI结构和设备内容

.dml {border:2px solid green;width:300px;background-color:#eeeeee;margin:0 0 0 0}.ddm {background-color:#cccccc;margin-left:0mm} 目录: 1.GDI的结构 2.设备内容         

albon arith 1889

数学建模入门——数据预处理(全)

介绍了数据预处理的入门知识

n04j04h06的博客 4347

MTK-Android12开机应用自启需求-自定义原生Launcher3 主界面布局图标

MTK平台 Android12 版本 上实现 开机应用自启需求-自定义原生Launcher3 主界面布局图标。添加一个属性定义即可,如下:这里自定义一个属性目的是为了在加载Launcher3启动时候从属性获取需要自启动应用的包名,可以扩展动态替换 自启动包名。这里有两种方案,要么在Launcher3里面实现,要么在系统服务里面在开机时候启动第三方一次。这里强烈建议在Launcher3中去实现,体验效果更好。// 第一步:定义属性,// 第二步:在onCreate 方法中获取属性并启动应用。

十年饮冰,难凉热血 1376

GDI+编程说明及小结

原文地址:http://blog.youkuaiyun.com/byxdaz/article/details/5972759 GDI+(Graphics Device Interface Plus图形设备接口加)是Windows XP和Windows Server 2003操作系统的子系统,也是.NET框架的重要组成部分,负责在屏幕和打印机上绘制图形图像和显示信息。 GDI+不但在功能上比GDI 要强...

weixin_33919941的博客 876

ICC2: place阶段的clock network delay

设置了set_clock_latency之后,即便没长tree,也会有反标值,显示为clock network delay(ideal)和设置的clock latency值,需要注意的是同时设置set_clock_latency和set_clock_latency -source,clock network delay(ideal)值是二者叠加的。我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧?

m0_61544122的博客 316

RuView release-manager Agent 解析:基于 Claude Code 智能体定义的 AI 集群发布协调设计

本文以 RuView 仓库中的智能体定义文件 [.claude/agents/github/release-manager.md](https://link.gitcode.com/i/8b35d36825cdcb26eb79eab3cde13419) 为主体,完整解析一个面向 GitHub 的自动化发布协调 Agent 的设计:包括其 frontmatter 工具声明、基于 ReasoningB

gitblog_00628的博客 342

EML 全面实践指南:把 SAP RAP 业务对象玩出工程化的稳定与优雅

本文面向掌握ABAP基础、正在实施RAP的开发者,深入讲解EML(Entity Manipulation Language)的核心用法。文章围绕READ ENTITIES、MODIFY ENTITIES、COMMIT ENTITIES三大语句,详细解析其语义、类型体系、事务机制及工程实践。重点内容包括:字段裁剪、派生类型、草稿控制、批量更新、事务缓冲与保存序列等关键技术点,并配合真实案例代码。旨在帮助开发者在SAP ABAP On-Premise和BTP环境中构建可维护、可演进的业务对象访问层,同时避免常见

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 329

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

VC++开发轻量级PDF阅读器:从文件解析到GDI渲染的实战指南

PDF作为一种跨平台的文档格式,其核心在于文件结构解析与页面渲染技术。理解PDF的物理与逻辑结构,包括交叉引用表(xref)、页面树(Pages)和内容流(Content Stream)的解析原理,是实现自定义阅读器的基础。通过解码Flate压缩算法处理内容流,并利用图形状态机管理坐标变换与资源,可以将PDF指令转换为可视化输出。在Windows平台,GDI(Graphics Device Interface)提供了高效的本地图形渲染能力,结合FreeType库处理字体轮廓,能够实现精准的文本与图形绘制。这

weixin_30231327的博客 227

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

如何快速上手mini3d:从编译到第一个3D立方体渲染

mini3d是一个仅用700行代码实现的3D软件渲染器,它无需依赖任何第三方库,通过单个文件mini3d.c即可实现完整的固定管线渲染功能。本教程将帮助你快速从编译到成功渲染第一个3D立方体,体验软件渲染的魅力。 ## 准备工作:获取项目源码 首先需要将mini3d项目克隆到本地,打开终端执行以下命令: ```bash git clone https://gitcode.com/gh_mir

gitblog_00027的博客 1033

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

✨【MFC课程设计】实战篇:手把手绘制古典青花瓷花瓶 | 图形图像处理进阶

本文详细介绍了基于MFC框架的青花瓷花瓶课程设计项目。项目采用经典的文档-视图架构,通过贝塞尔曲线生成花瓶轮廓,运用GDI+实现路径绘制与填充,并整合Phong光照模型提升渲染效果。核心内容包括:Z-Buffer深度测试、3D变换矩阵、光照计算等图形学关键技术实现,以及旋转曲面生成算法。设计亮点在于将传统文化与现代计算机图形学相结合,构建了模块化、可扩展的系统架构。项目不仅完成了静态花瓶绘制,还实现了交互式参数调整功能,为后续性能优化和功能扩展奠定了基础,展现了图形学在艺术创作中的应用潜力。

玖笙的博客 1344
上一篇: GDI+学习及代码总结之------区域
下一篇: GDI+学习及代码总结之------图像的基本处理
htt9931
博客等级 码龄24年 43粉丝 14原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值