旋转文本图像叠加控件

分享于 

11分钟阅读

Web开发

  繁體

Sample Image - RotatedTextImageControl.png

介绍

你是否希望能够在网页上显示旋转的文本? 你是否曾经从图形设计师那里发现了一个网站设计,以便意识到每个按钮。 你是否希望在网站所提供的所有图像上覆盖相同的文本- 比如 版权信息?

我只是想要创建一些图片,只是为了做一些基本的文本覆盖。 所以我创建了这个项目。

背景

尽管不需要使用户对虚拟目录位置具有写访问权限,但它却使项目更容易使用,这并不重要。 用于 RotateTextImage 控件,它需要一个名为 HaleyRotateText.aspx ( 或者任何你设置为 AspxFile web应用程序中的控件的属性。 iPhone 7 还没出来,我们已经在iPhone上获取细节 8,或者不管是想到下一步。 AspxFile 属性的属性应设置为从包含页的路径到 HaleyRotateText.aspx 文件的位置的relative 网页路径。 如果该页位于同一个目录中,则如果aspnet_wp流程在( 通常 ASPNET ) 下运行的用户,则该文件将自动创建。 如果出于安全原因,你将需要创建具有以下内容的文件。


<%@ Page language="c#" AutoEventWireup="false" 



          Inherits="Haley.RotateText.Control.RotateText" %>



为了便于安装,演示程序包含了源代码的构建版本。 所以下载了演示文件后,将文件解压缩到新目录并在IIS中创建一个新的虚拟目录。 运行演示就应该像运行 Test.aspx 或者 Test2.aspx 那样简单。 构建源代码,只需将源代码解压到VS2003中的新目录,然后点击 build build。 如果你经常使用它,将两个项目添加到相同的解决方案中可能会很有帮助。

使用代码

代码逻辑上可以分为 4部分:

  • 提供要创建的图像定义的对象。
  • 映像生成。
  • 用于传送图像的APS.NET 控件和页面
  • 高速缓存

定义对象

  • RotatedTextDefn - 图像需求的主要定义。
  • 边框 - 提供 4个边框的基本封装,用于描述 padding,边距,边框等。
  • 角部 - 提供高度和宽度的基本封装,以描述角点 rectangle的大小与实际角点的距离。
  • ScalingDefn - 提供如何剪切和缩放图像不同部分的封装。
  • BorderTypeConverter - 类型转换器 边框 对象。
  • CornerTypeConverter - 类型转换器 角部 对象。
  • ScalingDefnTypeConverter - 类型转换器 ScalingDefn 对象。

基本类仅仅是一组值属性的封闭。 要启用属性网格的可以展开特性,需要使用 TypeConverters。 要使可以扩展的属性网格工作并不像你想象的那样容易。 这里有 2,现在看起来像简单的步骤:

需要使用以下属性标记每个属性:


[NotifyParentProperty(true), 


 RefreshProperties(RefreshProperties.All),


 DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]



每个可以扩展对象都需要有一个继承自 ExpandableObjectConverter 类型转换器重写 2方法,如下所示:


public override PropertyDescriptorCollection 


 GetProperties(ITypeDescriptorContext context, 


 object value, Attribute[] attributes)


{


 // return the list of properties ordering as we want


 string [] names = {"TopBorder", "BottomBorder", 


 "LeftBorder", "RightBorder", 


 "TopLeft", "TopRight", 


 "BottomRight", "BottomLeft"};


 PropertyDescriptorCollection pdc = 


 TypeDescriptor.GetProperties


 (value,attributes).Sort(names);


 return pdc;


}



public override object ConvertTo(ITypeDescriptorContext context, 


 CultureInfo culture, object value, Type destType) 


{


 if (destType == typeof(string) && value is ScalingDefn) 


 {


 ScalingDefn sd = (ScalingDefn)value;


 return "Expand for values";


 }


 if(destType == typeof(InstanceDescriptor))


 {


 // Create an instance descriptor for the type so that it


 // can be recreated from a list of properties


 System.Reflection.ConstructorInfo constructor;


 constructor = typeof(ScalingDefn).GetConstructor


 (new Type[] {typeof(Corner),typeof(Corner),


 typeof(Corner),typeof(Corner), typeof(int),


 typeof(int),typeof(int),typeof(int)});


 ScalingDefn sd = (ScalingDefn)value;


 return new InstanceDescriptor(constructor,


 new Object[] {sd.TopLeft, sd.TopRight, 


 sd.BottomRight, sd.BottomLeft, 


 sd.TopBorder, sd.BottomBorder, 


 sd.LeftBorder, sd.RightBorder});


 }


 return base.ConvertTo(context, culture, value, destType);


}



映像生成

图像生成是由 ImageGenerator 类。它需要一个 RotatedTextDefn 并将一个图像作为 位图 对象或者 字节 [ ] PNG图像数据。可以将图像生成分为 2个基本部分:

  • 创建 background 映像
  • 文本的叠加
创建 background 映像

可以通过多种方式创建 background 映像:

  • 最基本的是直接 background 颜色。
  • 接下来是提供一个可以缩放的background 图像。
  • 最复杂的是提供一个 background 图像和 ScalingDefn 描述如何提取和缩放图像的不同部分。

缩放定义定义了 3组区域,如下所示:

  • 未缩放的4 个角点。
  • 沿边之间的边拉伸的4 个边框。
  • 在图像的其他部分被复制之前,最大 rectangle 不被图像的其它部分重叠,并且在整个背景中延伸。

background的大小是由 高度宽度 属性或者如果这些属性为空,那么我们计算它需要什么大小来适应旋转文本和指定的padding。

覆盖文本

为了在正确的位置覆盖文本,我们需要创建 4个转换:

  • 一个旋转文本。
  • 一个将旋转文本移动到图像中正确的位置。
  • 一个用于处理由于 padding 和对齐规范而引起的偏移。
  • 一个处理居中或者右段落对齐的文本的方法。

控件&图像页

控件只是定义对象和生成器的简单包装,允许它轻松地从web窗体中删除。 图像页是一个细aspx页,它流 字节 [ ] 当图像数据接收到请求时,返回到客户端。 控制部分更详细地介绍了控件的工作原理。

高速缓存

项目中使用的缓存类型有 2种。

  • 将图像缓存为 字节 [ ] 数据- 在aspnet_wp重新启动之前,这是永久性的。
  • 高速缓存 RotatedTextDefn 对象- 2分钟后的超时。

iPhone 7 还没出来,我们已经在iPhone上获取细节 8,或者不管是想到下一步。 ImageCache 对象处理两个对象。自定义控件将图像缓存为 字节 [ ] 第一次执行控件的控件有 CacheName 属性集。从随后开始,对具有该属性的图像的任何请求 CacheName 将直接从内存缓存中提供,没有生成开销。 在代码中生成的图像可以写入缓存,在应用程序启动时,然后由具有它们的控件的实例访问。 CacheName 属性集。控件缓存 RotatedTextDefn 它是为了提供功能,它编写了一个 IMG 标记到如下所示的页面:


<img id="Rotatetextimage3" 


 src= "./HaleyRotateText.aspx?Defn=7525ea7f-440c-4672-86fa-65353672c30b


 &CacheName=Image1"/>



当服务器处理这里请求时,首先检查一个图像是否存在于缓存中的缓存中。 CacheName=Image1 如果不使用 QueryString 中提供的guid,它将从缓存中检索定义,然后将它的添加到图像缓存。 如果 CacheName 未指定,所生成的图像将不会存储,因这里下次需要重新生成。

缓存可以提供 2个目的,它可以提高站点的速度,但也可以使站点的behind 负载平衡。 在启动时在 global.asax 中创建和缓存映像会在这个过程中。 对于大量的图像而言,不用实用,这对于制表符。按钮。样式等等都是很好的。

高级图像创建

为了能够创建更高级的图像,通过代码可以通过代码创建一个图像 位图 或者 字节 [ ] 并将它的设置为另一个定义的输入。 创建图像时,生成器以这里顺序查看 3属性以确定用于 background的内容: BackgroundImageBitmap , BackgroundImageBytes , BackgroundImageFile 演示中包含的Test.aspx 给出了这里示例的一个示例。

未来的增强功能

  • 将映像缓存到磁盘以减少内存开销。
  • 改变图片输出格式的选项- 目前它们都是PNG格式的。
  • 透明度- IE 目前不支持PNG透明度,它们是授权,以及使用gif的调色板大小问题。

历史记录

  • 08 2003年08月 - 初始版本

控制  图像  文本  TEX  覆盖  rotate  
相关文章