1.200åc/c++/java/c#读åpngå¾ç
2.我做了个chatPPT(含源码和prompt)
3.Linux USB 驱动开发实例(一)——USB摄像头驱动实现源码分析
4.UGUI源码阅读之Mask
5.源码解析,图片图片Glide加载GIF图的接口接口原理竟然这么简单
200åc/c++/java/c#读åpngå¾ç
æ²¡å¿ è¦é£ä¹éº»ç¦.åªè¦ä½¿ç¨GDI+åºéé¢çBitmap对象åGraphics对象就å¯ä»¥äºãWindowsXP以ä¸çOSé½æä¾GDI+å¾å½¢æ¥å£äºï¼ä»çåè½æ¯GDIæ¥å£æ´å¼ºå¤§ï¼ä½¿ç¨æ´æ¹ä¾¿ãå»ºè®®ä½ å¯ä»¥æ¥æ¥GDIï¼çç¨æ³ãè¿éç»ä½ 个æç®åçCï¼çä¾åï¼
System.Drawing.Bitmap bmp = new Bitmap("1.png");//å建Bitmap对象
System.Drawing.Color c = bmp.GetPixel(0, 0);//è·å¾å¾åä¸ï¼0,0ï¼ç¹çåç´ å¼
int a = c.A;//该åç´ çAlphaééå¼
int r = c.R;//该åç´ ç红è²ééå¼
int g = c.G;//该åç´ ç绿è²ééå¼
int b = c.B;//该åç´ çèè²éé
é£å»ºè®®ä½ ä¸ç½æ¥ä¸æ¥PNGæ ¼å¼çæ åï¼å°±ç¥éPNGæ件éçæ°æ®æåäºãä½PNGæ¯å缩è¿çï¼æä»¥ä½ è¿å¾æ解åç®æ³æè¡ã
pngçåå¨æ ¼å¼ï¼
å ³é®æ°æ®åä¸æ4个æ åæ°æ®åï¼
æ件头æ°æ®åIHDR(header chunk)ï¼å å«æå¾ååºæ¬ä¿¡æ¯ï¼ä½ä¸ºç¬¬ä¸ä¸ªæ°æ®ååºç°å¹¶åªåºç°ä¸æ¬¡ã
è°è²æ¿æ°æ®åPLTE(palette chunk)ï¼å¿ é¡»æ¾å¨å¾åæ°æ®åä¹åã
å¾åæ°æ®åIDAT(image data chunk)ï¼åå¨å®é å¾åæ°æ®ãPNGæ°æ®å 许å å«å¤ä¸ªè¿ç»çå¾åæ°æ®åã
å¾åç»ææ°æ®IEND(image trailer chunk)ï¼æ¾å¨æ件尾é¨ï¼è¡¨ç¤ºPNGæ°æ®æµç»æã
å¨ç¬¬äºä¸ªæ°æ®åä¸å å«äºè°è²æ¿æ°æ®åãå¯æ¯ï¼å½æ们å»è§£æpngæ¶ï¼å´æªæ¾å°è°è²æ¿ã并ä¸æ们åç°pngçåå¨æ¨¡å¼æ¯ç¹éµé¢è²å¼å ä¸ä½çé¿å°æ³ééå¼ææçï¼è¿ç§åå¨æ¨¡å¼æ ¹æ¬ä¸éè¦è°è²æ¿çåå¨ãåºäºè¿ç§åå¨æ¨¡å¼ï¼pngçä½æ·±æä½æ¯ä½ç彩ï¼å¨æ们çå°çå¾åè¿æ¸¡ä¸ä¼å¾å润ï¼å 为æ¯ä¸ªç¹é½å¯ä»¥æ¯ä¸åçè²å½©ä»¥åä¸åçéæå¼ãèè¿ç§æ¨¡å¼ä¹æ¯æ们æ常使ç¨ã大家æç解ä¸çpng模å¼ãè³äº"png"åé¢çââå¯è§ä¹åä½æ·±å¹¶æ å ³ç³»ï¼è³äºä¸ºä»ä¹å«ï¼æä¹æ²¡ææ¾å°å ·ä½ççæ¡ã
pngæºæ°æ®ä¸æ è°è²ççåå¨ï¼èå¨æ åæ°æ®åç第äºåä¸ï¼å´æ¾ç¤ºäºè°è²æ¿æ°æ®åãå³ç¶åå¨ï¼è¯å®æ¯ææä¹çï¼å¯è§pngæå¦å¤ä¸ç§åå¨æ¨¡å¼--带è²ççpng8模å¼ãpng8æç¹ç±»ä¼¼äºGIFï¼å å«äºä¸ä¸ªè°è²æ¿ï¼å¹¶å¨è°è²æ¿ä¸æä¸ä¸ªéæé¢è²å¼ï¼è¿ç§æ¨¡å¼å¨è®¡ç®æºçåå¨ä¸ï¼æ¯ä¸ªç¹éµåå¨çæ¯è²çç´¢å¼ã并ä¸æ é¿å°æ³åéæä½ãæ以ï¼png8å¨é¢è²ä½æ·±ä¸ï¼å¯ä»¥ä½äºä½;ä¹å¯ä»¥ä½¿ç¨æ´æ¢è²ççææ¯æ¥å¤çä¸äºç¬ç¹çææ;ä½æ¯ç±äºæ¯ä¸ªç¹éµæ²¡æé¿å°æ³å®ä¹ï¼è¾¹ç¼ä¼åGIFä¸æ ·åå¨é¯é½¿ç°åã
好å讲çæç¹ä¹±ï¼æ»ç»ä¸ä¸åºå«å§ï¼
png8åpngçæ ¹æ¬åºå«ï¼ä¸æ¯é¢è²ä½çåºå«ï¼èæ¯åå¨æ¹å¼ä¸å;
png8 è²çç´¢å¼ãè°è²æ¿ä¸ä¸ä½éæå¼ãä¸æ¯æé¿å°æ³ééçåéæï¼åå¨æ ¼å¼ä¸æ¯ä¸ªåç´ æ éæ度çæ°æ®åå®ä¹;
png æ è°è²æ¿ãæ¯æé¿å°æ³ééçåéæãæ¯ä¸ªç¹éµé½æéæ度çå®ä¹ï¼æä½ä½ç彩è²;
ç¹æ§
æ¯æè²è°è²æ¿ææ¯ä»¥äº§çå°ä½ç§¯æ件
æé«æ¯æä½ç彩è²å¾å以åä½ç°åº¦å¾åã
æ¯æé¿å°æ³ééçåéæç¹æ§ã
æ¯æå¾å亮度çgammaæ ¡æ£ä¿¡æ¯ã
æ¯æåå¨éå ææ¬ä¿¡æ¯ï¼ä»¥ä¿çå¾åå称ãä½è ãçæãåä½æ¶é´ã注éçä¿¡æ¯ã
使ç¨æ æå缩
æ¸è¿æ¾ç¤ºåæµå¼è¯»åï¼éåå¨ç½ç»ä¼ è¾ä¸å¿«éæ¾ç¤ºé¢è§ææååå±ç¤ºå ¨è²ã
使ç¨CRC循ç¯åä½ç¼ç é²æ¢æ件åºéã
ææ°çPNGæ åå 许å¨ä¸ä¸ªæ件å åå¨å¤å¹ å¾åã
çãæ使ç¨æ æå缩åå¤å¹ å¾åãæºå¤æçå¦ï¼
/index.php?diff=prev&oldid=
çä¸é¢W3Cçç½ç«ä»ç»ãä½ å°±ç¥éæå¤å¤æäºãä¸ç¨åºå½æ°ï¼æè§å¾ä½ çæ³æ³å¤ªä¸ç°å®ã对ä¸BMPè¿æ ·æ ¼å¼è¿å¯ä»¥ï¼å¯¹äºPNGï¼ä¸è¡ã
http://www.w3.org/TR//REC-PNG-/
我做了个chatPPT(含源码和prompt)
实现了一个基于AI的chatPPT工具,此工具能够根据输入的源码源码话题或句子自动生成PPT,包括润色标题、图片图片选择主题颜色以及生成所有插图。接口接口工具原理涉及openAI的源码源码分销订货平台源码GPT 3.5 TURBO接口、Dalle2以及Python-pptx库。图片图片
GPT 3.5 TURBO接口用于生成PPT结构文本,接口接口包括PPT标题、源码源码页面标题和内容等,图片图片同时根据文本内容选择适合的接口接口情感主题色彩。Dalle2则将生成的源码源码文本转化为相应的,Python-pptx库则负责构建PPTX文件。图片图片
实现这个工具的接口接口关键在于制定合适的提示语,让AI理解用户需求并生成符合预期的源码源码PPT。实现过程相对简单,但需要考虑科学上网、openAI接口费用(生成一个PPT费用约在0.1~0.2美元,主要成本来自接口)以及输出篇幅的soulclash源码限制。
使用时需要注意以下几点:
1、确保网络环境稳定,以便顺利使用工具。
2、openAI接口使用需付费,费用主要依据生成数量,一般生成一个PPT的费用在0.1~0.2美元左右。
3、由于AI接口限制输出最多个token,输出篇幅可能会受限。为解决这一问题,建议将用户输入内容分为多个部分,每次生成四个左右的主题,将这些主题的回复拼合,最终生成完整的PPT。虽然这样会增加成本,但可以有效解决输出限制问题。
工具源码已提供,cfCDN源码有兴趣的读者可自行下载和优化,以满足更多个性化需求。
Linux USB 驱动开发实例(一)——USB摄像头驱动实现源码分析
Linux下的USB摄像头驱动实现源码分析,主要通过四个部分完成:设备模块的初始化与卸载、上层软件接口模块、数据传输模块以及USB CORE的支持。
一、初始化设备模块
模块初始化和卸载通过调用`module_init`和`module_exit`函数实现,关键数据结构为USB驱动结构,支持即插即用功能,通过`spca5xx_probe`和`spca5xx_disconnect`函数。
二、上层软件接口模块
基于V4L协议规范,通过`file_operations`数据结构实现设备关键系统调用,功能包括:Open打开初始化、Close关闭、Read读取数据、Mmap内存映射、SmartPublisher源码Ioctl获取文件信息等。Open功能初始化解码器模块,Read功能主要将数据从内核空间传至进程用户空间。
三、数据传输模块
采用tasklet实现同步快速数据传递,通过软件解码模块在`spcadecode.c`上解压缩图形数据流,如yyuyv、yuvy、jpeg、jpeg至RGB格式。解码算法依赖于硬件压缩算法,最终需DSP芯片实现。
四、USB CORE的支持
使用系统实现的USB CORE层提供函数接口,如`usb_control_msg`、`usb_sndctrlpipe`等,实现对USB端点寄存器的读写操作。
总结,uisp源码本Linux USB摄像头驱动源码分析覆盖了驱动的初始化、上层接口实现、数据传输及USB CORE支持,涉及C/C++、Linux、Nginx等技术点。学习资料包括视频教程、技术路线图、文档等,通过私信获取。课程包含C/C++、Linux、Nginx等后端服务器架构开发技术,为学习者提供全面指导。
UGUI源码阅读之Mask
Mask主要基于模版测试来进行裁剪,因此先来了解一下unity中的模版测试。
Unity Shader中的模版测试配置代码大致如上
模版测试的伪代码大概如上
传统的渲染管线中,模版测试和深度测试一般发生在片元着色器(Fragment Shader)之后,但是现在又出现了Early Fragment Test,可以在片元着色器之前进行。
Mask直接继承了UIBehaviour类,同时继承了ICanvasRaycastFilter和IMaterialModifier接口。
Mask主要通过GetModifiedMaterial修改graphic的Material。大致流程:
1.获取当前Mask的层stencilDepth
2.StencilMaterial.Add修改baseMaterial的模板测试相关配置,并将其缓存
3.StencilMaterial.Add设置一个unmaskMaterial,用于最后将模板值还原
MaskableGraphic通过MaskUtilities.GetStencilDepth计算父节点的Mask层数,然后StencilMaterial.Add修改模板测试的配置。
通过Frame Debugger看看具体每个batch都做了什么。先看第一个,是Mask1的m_MaskMaterial,关注Stencil相关的数值,白色圆内的stencil buffer的值设置为1
这个是Mask2的m_MaskMaterial,根据stencil的计算公式,Ref & ReadMask=1,Comp=Equal,只有stencil buffer & ReadMask=1的像素可以通过模板测试,即第一个白色圆内的像素,然后Pass=Replace,会将通过的像素写入模板值(Ref & WriteMask=3),即两圆相交部分模板值为3
这个是RawImage的Material,只有模板值等于3的像素可以通过模板测试,所以只有两个圆相交的部分可以写入buffer,其他部分舍弃,通过或者失败都不改变模板值
这是Mask2的unmaskMaterial,将两个圆相交部分的模板值设置为1,也就是还原Mask2之前的stencil buffer
这是Mask1的unmaskMaterial,将第一个圆内的模板值设置为0,还有成最初的stencil buffer
可以看到Mask会产生比较严重的overdraw。
2.drawcall和合批
每添加一个mask,一般会增加2个drawcall(加上mask会阻断mask外和mask内的合批造成的额外drawcall),一个用于设置遮罩用的stencil buffer,一个用于还原stencil buffer。
如图,同一个Mask下放置两个使用相同的RawImage,通过Profiler可以看到两个RawImage可以进行合批
如图,两个RawImage使用相同的,它们处于不同的Mask之下,但是只要m_StencilValue相等,两个RawImage还是可以进行合批。同时可以看到Mask1和Mask1 (1),Mask2和Mask2 (1)也进行了合批,说明stencilDepth相等的Mask符合合批规则也可以进行合批。
StencilMaterial.Add会将修改后的材质球缓存在m_List中,因此调用StencilMaterial.Add在相同参数情况下将获得同一个材质球。
源码解析,Glide加载GIF图的原理竟然这么简单
在探讨之前,让我们明确一点:Android的ImageView实际上并不支持直接加载GIF动图,因为ImageView基于Canvas绘制,而Canvas仅支持drawBitmap一次绘制一张。那么,Glide是如何巧妙地让ImageView展现出GIF动画的呢?
让我们从Glide的源码入手,今天的主角是GifDrawable。这个类虽然有大约行代码,但理解其工作原理并非无迹可寻。首先,我们注意到一个开始播放第一帧的方法,这可能是入口点。
代码结构中,当GIF有多帧时,会订阅特定事件。关键在于观察三句代码:一是递增帧位置,表明采用无限轮播算法;二是加载资源回调,通过Target接口来触发;三是消息传递,用Handler进行控制。
在加载资源的回调中,我们看到消息机制在发挥作用。当接收到消息,会根据what参数进行处理。在handleMessage中,处理了延迟消息和清理消息。延迟消息会获取新帧数据并绘制到ImageView,同时清除旧帧,接着进入下一个帧的加载和清除过程。
总结来说,Glide加载GIF的原理相当直观:GIF被解析为一系列,通过无限轮播,每次新帧的加载都触发一次请求。在完成绘制后,旧帧会被清除,然后继续下一轮的加载。整个过程通过Handler的消息传递机制驱动循环播放。以上内容摘自Android轮子哥的分享。