水印的生成,起初我只是把它看成一个图片合成的简单过程,充其量也就是再加个追加文字。一开始,我写了一个demo,其实功能而言基本和后面重写的这个没有太大差异,但是因为目的性极强,完全忽略了代码上的可靠性,当时甚至更多的只是关注如何实现透明度的控制。

不过当功能的实现这个槛过了以后,我就反过来关注起给图片加水印的另外一些细节,比如水印的组成,位置等与水印本身同样重要的部分。

从选择水印图片、文字以及位置到最终生成,这个操作过程其实不过就是几次点击。而在生成水印图片之前,操作的部分没有严格的顺序,既不存在先选择位置,还是先选择水印内容的前后之分,代码的执行都在点击了“保存”以后才真正开始,因此,为了将水印相关的各个部分的耦合性降到最低,我作了以下考虑。

由于水印的部分可以是文字,可以是图片,不管怎么样,我们把它看做水印的CONTENT;另外,不管是什么类型的CONTENT,都有一个具体的位置信息。而我们在操作水印生成的过程的时候,选择位置和水印图片或文字的时候都是独立不相约束的,所以就有了最初的两个独立的对象:

    ·位置对象
    ·水印对象

1.位置
    原来我考虑的水印位置只有根据ContentAlignment定位以及平铺的形式,但是后来同事提了个建议说是否可以自己定义水印出现的位置,所以就有了AlignedPosition与CustomedPosition的两个WatermarkPosition的子类。

Watermark Maker Classes I:  Brief Intro, WatermarkPosition

从上面的图可以看出,AlignedPosition有两个子类:SingleAlignedPosition、RepeatAlignedPosition。这两个类就是之前我提到的以ContentAlignment定位的和以平铺形式分布的水印位置对象。

另外,由于平铺的水印的位置不止一个,所以这里引入了一个IMultiPosition。

代码:

WatermarkPosition.cs
1Watermark Maker Classes I:  Brief Intro, WatermarkPositionpublic abstract class WatermarkPosition
2}

AlignedPosition.cs
 1Watermark Maker Classes I:  Brief Intro, WatermarkPositionpublic abstract class AlignedPosition : WatermarkPosition
 2}

SingleAlignedPosition.cs
 1Watermark Maker Classes I:  Brief Intro, WatermarkPositionpublic class SingleAlignedPosition : AlignedPosition
 2}

RepeatAlignedPosition.cs
 1Watermark Maker Classes I:  Brief Intro, WatermarkPositionpublic class RepeatAlignedPosition : AlignedPosition, IMultiPosition
 2}

CustomedPosition.cs
 1Watermark Maker Classes I:  Brief Intro, WatermarkPositionpublic class CustomedPosition : WatermarkPosition
 2}

下篇:水印类

分类:

技术点:

相关文章: