AGG第四课 局限性

1前言

AGG渲染抗锯齿图像的边界,似乎永远是模糊边界,经研究,是由于使用亚像素精度反走样,边界会有半个像素的模糊。导致多个图像重叠的边界出现颜色一样的问题。正如,作者所言,不要以为采用AGG,就能够解决一切的问题,正所谓道高一丈,魔高一尺。任何的设计都是折中的方案,对于问题,只能够采取规避的方式解决。后续将会持续关注AGG的局限性。

重叠区域的边界着色问题

代码展示   

 void TestBlackBorden()

  {

   agg::rendering_buffer &rbuf = rbuf_window();

   agg::pixfmt_bgr24 pixf(rbuf);

 

   typedef agg::renderer_base<agg::pixfmt_bgr24> renderer_base_type;

   renderer_base_type renb(pixf);

 

   typedef agg::renderer_scanline_aa_solid<renderer_base_type>renderder_scanline_type;

   renderder_scanline_type rensl(renb);

 

   agg::rasterizer_scanline_aa<> ras;

   agg::scanline_u8 sl;

   ras.reset();

 

   ras.add_path(agg::ellipse(100,150,100,100));

   agg::render_scanlines_aa_solid(ras,sl,renb,agg::rgba8(255,0,0));

   ras.add_path(agg::ellipse(200,100,100,100));

   agg::render_scanlines_aa_solid(ras,sl,renb,agg::rgba8(0,255,0));  

   ras.add_path(agg::ellipse(200,200,100,100));

   agg::render_scanlines_aa_solid(ras,sl,renb,agg::rgba8(0,0,255));  

  }

问题描述

三个实心圆形成三个环,并且每个圆有重叠的部分,可以看到重叠的边界出现了黑色的弧线。

按照正常的逻辑,边界不是红色,就是蓝色,或者绿色。实际上出现了混合的颜色,抗锯齿的效果采用混合颜色的方式,将底层的颜色和覆盖的颜色进行了混合(alpha-blending,实际上就会显示混合后的颜色。

 

如下是作者的描述:

I only flipped your image horizontally. Itshows how the colortriplets are

placed and explains this effect. But youare right, these"black borders"

will be seen on any device. To get rid ofthem you need to use gamma

correction. Seeexamples/gamma_correction.cpp.

 

按照作者的思路进行了gamma的设置,当然不排除设置的错误,没有理解gamma_correction这个例子。

开发者回应:

For my display a gamma of 2.5 looks good. Ithink I will add someuser

defined gamma option to my application. Bytime i will have to delve

into this topic more deeply.






     本文转自fengyuzaitu 51CTO博客,原文链接:http://blog.51cto.com/fengyuzaitu/1961152,如需转载请自行联系原作者

### 自动生成 MSSQL 的 INSERT 语句方法 在 MSSQL 中,可以通过编写脚本来自动生成针对指定表的 `INSERT` 语句。以下是实现这一目标的具体方式: #### 方法一:使用 T-SQL 脚本生成 可以利用系统视图和动态 SQL 来构建所需的 `INSERT` 语句。以下是一个完整的示例代码片段,用于根据给定的表名生成对应的 `INSERT INTO ... VALUES (...)` 形式的语句。 ```sql DECLARE @TableName NVARCHAR(128) = 'YourTableName'; -- 替换为目标表名 DECLARE @ColumnList NVARCHAR(MAX); DECLARE @ValueList NVARCHAR(MAX); DECLARE @Sql NVARCHAR(MAX); -- 获取列名列表并拼接成字符串 SELECT @ColumnList = STRING_AGG(QUOTENAME(COLUMN_NAME), ', ') FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = @TableName; -- 构建占位符 (?,?,?) 并拼接成字符串 WITH CTE AS ( SELECT COLUMN_NAME, ROW_NUMBER() OVER (ORDER BY ORDINAL_POSITION) AS RowNum FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = @TableName ) SELECT @ValueList = STRING_AGG(CONCAT('@Param', RowNum), ', ') FROM CTE; -- 动态生成 SQL 插入模板 SET @Sql = CONCAT( 'INSERT INTO ', QUOTENAME(@TableName), '(', @ColumnList, ') ', 'VALUES(', @ValueList, ');' ); PRINT @Sql; ``` 此脚本会输出类似于以下形式的 `INSERT` 语句: ```sql INSERT INTO YourTableName([Col1], [Col2], [Col3]) VALUES (@Param1, @Param2, @Param3); ``` #### 方法二:借助第三方工具 除了手动编写的脚本外,还可以考虑一些成熟的数据库管理工具来完成这项工作。例如: - **SQL Server Management Studio (SSMS)** 提供导出数据的功能,在导出过程中可以选择仅导出 `INSERT` 语句。 - **Redgate SQL Compare/SQL Data Compare** 是商业软件,能够快速比较两个数据库之间的差异,并生成同步所需的所有脚本,其中包括 `INSERT` 语句。 这些工具有助于简化复杂场景下的操作流程,尤其适用于大规模迁移或备份需求。 #### 注意事项 当处理敏感信息时需格外小心,确保不会无意间暴露机密数据。另外需要注意的是某些特殊类型的字段(如 BLOB 或 XML)可能无法简单地转换为标准文本表示法,因此需要额外逻辑支持其正确映射。
05-06
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值