社区
GAME,图形处理/多媒体
帖子详情
开发文字水印出了点问题,请大家帮个忙呀
chinahuman
2005-03-29 08:32:59
最近在研究文字水印,因为要实现透明度,并且实现文字精细,所以先在一个画板上画出来了这个文字,再把它和原来的图片进行Alpha融合,但是因为文字精细的时候,它的周围的一些颜色就不会等于我预设地透明色,这时候融合后的字周围就会有白色(我设的透明色)的一些残余,感觉好影响效果呀,不知道大家作这样的东西的时候,是怎么实现的?
...全文
194
16
打赏
收藏
开发文字水印出了点问题,请大家帮个忙呀
最近在研究文字水印,因为要实现透明度,并且实现文字精细,所以先在一个画板上画出来了这个文字,再把它和原来的图片进行Alpha融合,但是因为文字精细的时候,它的周围的一些颜色就不会等于我预设地透明色,这时候融合后的字周围就会有白色(我设的透明色)的一些残余,感觉好影响效果呀,不知道大家作这样的东西的时候,是怎么实现的?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
16 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
ehom
2005-04-01
打赏
举报
回复
正确思路我不是已经说了两遍了?
chinahuman
2005-04-01
打赏
举报
回复
ehom(?!) :那这个正确的思路应该是什么样子的呢?
ehom
2005-04-01
打赏
举报
回复
你的思路就错了,本来根本就不存在这个所谓的问题。
你这其实是两次Alpha混合,"所以先在一个画板上画出来了这个文字",这一步相对于就把32位图的Alpha通道丢失了,后面根本就无法还原。
就算要分成两步来做,第一步输出的文字图层也应该是32位色的位图。文字区域只有一种颜色,包括边缘。不同的只是Alpha通道的值。
ehom
2005-04-01
打赏
举报
回复
上面不是已经告诉你答案了吗?
chinahuman
2005-03-31
打赏
举报
回复
我仔细看了一下,周围的白色残余是因为源上面就有一些融合,也就是因为要抗锯齿,所以旁边有一些看起来和背景色差不多,但是事实上不是背景色的,这时候,要把它也处理掉,要怎么办呢?
tycoonXP
2005-03-31
打赏
举报
回复
谁又做过真正的水印程序,给个例子.
chinahuman
2005-03-31
打赏
举报
回复
谢谢,晚上回去后试一下:)
ehom
2005-03-30
打赏
举报
回复
很简单,在32位色图像的基础上来实现Alpha混合。这样就有了0-255的梯度。
你那所谓的透明色其实也就是等同于另外记录了Alpha值,只不过只有0和255两种选择。
S.F.
2005-03-30
打赏
举报
回复
不是吧,你......
chijingde
2005-03-30
打赏
举报
回复
顶一下随飞:)
S.F.
2005-03-30
打赏
举报
回复
哦,错了句代码;公司显示器太差,眼都花了
//不是黑色则进行处理,因为黑色要作为透明色
if (p2[x1 * 3] <> 0) or (p2[x1 * 3 + 1] = 0) or (p2[x1 * 3 + 2] = 0) then
这句是错的,修改为下面这样
//不是黑色则进行处理,因为黑色要作为透明色
if (p2[x1 * 3] <> 0) or (p2[x1 * 3 + 1] <> 0) or (p2[x1 * 3 + 2] <> 0) then
每个里面都有这句要改
S.F.
2005-03-30
打赏
举报
回复
不要用半透明,要用混合算法;具体可以看我刚写的例子;放3个image, 分别为image1,src,dest ,src保存的图象要比dest小点,因为没有做范围判断,会画到dest上,dest则会从image1取一个背景.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;
type
TForm1 = class(TForm)
src: TImage;
dest: TImage;
Button1: TButton;
Button2: TButton;
Button3: TButton;
Button4: TButton;
Image1: TImage;
Button5: TButton;
procedure Button3Click(Sender: TObject);
procedure Button5Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1 : TForm1;
implementation
uses Math;
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject); //图像混合Additive-Blending
var
x1, y1 : integer;
P1, p2 : pbyteArray;
begin
src.Picture.Bitmap.PixelFormat := pf24bit;
dest.Picture.Bitmap.PixelFormat := pf24bit;
for y1 := 0 to src.Picture.Bitmap.Height - 1 do
begin
p1 := dest.Picture.Bitmap.ScanLine[y1];
p2 := src.Picture.Bitmap.ScanLine[y1];
for x1 := 0 to src.Picture.Bitmap.Width - 1 do
begin
// p[x * 3] := b; //蓝b
// P[x * 3 + 1] := g; //绿g
// P[x * 3 + 2] := r; //红r
//不是黑色则进行处理,因为黑色要作为透明色
if (p2[x1 * 3] <> 0) or (p2[x1 * 3 + 1] = 0) or (p2[x1 * 3 + 2] = 0) then
begin
p1[x1 * 3] := Min(255, p1[x1 * 3] + p2[x1 * 3]);
p1[x1 * 3 + 1] := Min(255, p1[x1 * 3 + 1] + p2[x1 * 3 + 1]);
p1[x1 * 3 + 2] := Min(255, p1[x1 * 3 + 2] + p2[x1 * 3 + 2]);
end;
end;
end;
end;
procedure TForm1.Button2Click(Sender: TObject); //半透明
var
x1, y1 : integer;
P1, p2 : pbyteArray;
begin
src.Picture.Bitmap.PixelFormat := pf24bit;
dest.Picture.Bitmap.PixelFormat := pf24bit;
for y1 := 0 to src.Picture.Bitmap.Height - 1 do
begin
p1 := dest.Picture.Bitmap.ScanLine[y1];
p2 := src.Picture.Bitmap.ScanLine[y1];
for x1 := 0 to src.Picture.Bitmap.Width - 1 do
begin
// p[x * 3] := b; //蓝b
// P[x * 3 + 1] := g; //绿g
// P[x * 3 + 2] := r; //红r
(*
r,g,b 为最后取得的颜色值;r1,g1,b1是上层的颜色值;r2,g2,b2是下层颜色值
r = r1/2 + r2/2;
g = g1/2 + g2/2;
b = b1/2 + b2/2;
以上为50%透明。若要使用不同的透明度用以下算法(ALPHA=透明度):
(50%以下)
r = r1 - r1/ALPHA + r2/ALPHA;
g = g1 - g1/ALPHA + g2/ALPHA;
b = b1 - b1/ALPHA + b2/ALPHA;
(50%以上)
r = r1/ALPHA + r2 - r2/ALPHA;
g = g1/ALPHA + g2 - g2/ALPHA;
b = b1/ALPHA + b2 - b2/ALPHA;
*)
//不是黑色则进行处理,因为黑色要作为透明色
if (p2[x1 * 3] <> 0) or (p2[x1 * 3 + 1] = 0) or (p2[x1 * 3 + 2] = 0) then
begin
//50%
p1[x1 * 3] := Min(255, (p1[x1 * 3] div 2) + (p2[x1 * 3] div 2));
p1[x1 * 3 + 1] := Min(255, (p1[x1 * 3 + 1] div 2) + (p2[x1 * 3 + 1] div
2));
p1[x1 * 3 + 2] := Min(255, (p1[x1 * 3 + 2] div 2) + (p2[x1 * 3 + 2] div
2));
end;
end;
end;
end;
procedure TForm1.Button4Click(Sender: TObject); //图像混合Subtractive-Blending
var
x1, y1 : integer;
P1, p2 : pbyteArray;
begin
src.Picture.Bitmap.PixelFormat := pf24bit;
dest.Picture.Bitmap.PixelFormat := pf24bit;
for y1 := 0 to src.Picture.Bitmap.Height - 1 do
begin
p1 := dest.Picture.Bitmap.ScanLine[y1];
p2 := src.Picture.Bitmap.ScanLine[y1];
for x1 := 0 to src.Picture.Bitmap.Width - 1 do
begin
// p[x * 3] := b; //蓝b
// P[x * 3 + 1] := g; //绿g
// P[x * 3 + 2] := r; //红r
//不是黑色则进行处理,因为黑色要作为透明色
if (p2[x1 * 3] <> 0) or (p2[x1 * 3 + 1] = 0) or (p2[x1 * 3 + 2] = 0) then
begin
p1[x1 * 3] := Max(0, p1[x1 * 3] - p2[x1 * 3]);
p1[x1 * 3 + 1] := Max(0, p1[x1 * 3 + 1] - p2[x1 * 3 + 1]);
p1[x1 * 3 + 2] := Max(0, p1[x1 * 3 + 2] - p2[x1 * 3 + 2]);
end;
end;
end;
end;
procedure TForm1.Button5Click(Sender: TObject);
begin
dest.Picture.Graphic.Assign(image1.Picture.Graphic);
end;
procedure TForm1.Button3Click(Sender: TObject); //混合+透明
var
x1, y1 : integer;
P1, p2 : pbyteArray;
begin
src.Picture.Bitmap.PixelFormat := pf24bit;
dest.Picture.Bitmap.PixelFormat := pf24bit;
for y1 := 0 to src.Picture.Bitmap.Height - 1 do
begin
p1 := dest.Picture.Bitmap.ScanLine[y1];
p2 := src.Picture.Bitmap.ScanLine[y1];
for x1 := 0 to src.Picture.Bitmap.Width - 1 do
begin
// p[x * 3] := b; //蓝b
// P[x * 3 + 1] := g; //绿g
// P[x * 3 + 2] := r; //红r
//不是黑色则进行处理,因为黑色要作为透明色
if (p2[x1 * 3] <> 0) or (p2[x1 * 3 + 1] = 0) or (p2[x1 * 3 + 2] = 0) then
begin
p1[x1 * 3] := Min(255, p1[x1 * 3] + p2[x1 * 3]);
p1[x1 * 3 + 1] := Min(255, p1[x1 * 3 + 1] + p2[x1 * 3 + 1]);
p1[x1 * 3 + 2] := Min(255, p1[x1 * 3 + 2] + p2[x1 * 3 + 2]);
//50%
p1[x1 * 3] := Min(255, (p1[x1 * 3] div 2) + (p2[x1 * 3] div 2));
p1[x1 * 3 + 1] := Min(255, (p1[x1 * 3 + 1] div 2) + (p2[x1 * 3 + 1] div
2));
p1[x1 * 3 + 2] := Min(255, (p1[x1 * 3 + 2] div 2) + (p2[x1 * 3 + 2] div
2));
end;
end;
end;
end;
end.
采用混合算法后你不用担心黑边问题了。
chinahuman
2005-03-29
打赏
举报
回复
我也不想这样说,只是大家都是这么叫.
我要的是图片的Alpha融合,有没有人能够帮我?
leeshine
2005-03-29
打赏
举报
回复
constantine(飘遥的安吉儿) 说的对,数字水印技术不是这样的,这是听我一个念数学的朋友说的!
加水印与提水印都要通过软件来实现,用来防伪,防复制,保护版权的,算法挺复杂的.
你有这方面的资料可以提供给我吗,一起研究一下吧!
chinahuman
2005-03-29
打赏
举报
回复
我已经找了好几天了,可是都找不到效果好的.都有这样的问题,不知道你能不能提供一下思路或是源码.
constantine
2005-03-29
打赏
举报
回复
图片的融合网上都有代码
你这个不算水印吧,以前学的水印是看不到,要用提取技术才能得到,用来防伪的之类的
FFMpeg视频
开发
与应用基础——使用FFMpeg工具与SDK
FFMpeg是当今为的面向音视频
开发
的开源工程,广泛应用于多种音视频的客户端、播放器和...使用FFMpeg提供的工具和SDK,可以完成音视频的编码、解码、转码、封装、解封装、转封装、视频
水印
和视频缩放等多种需求的
开发
。
OpenGL.ES在Android上的简单实践:17-
水印
录制(认识Android的EGL)
距离上一个主题有一段时间了,最近都在
忙
工作,因为需要在Android上写C++,所以就复习了一些NDK的知识。打算之后也会整理并写下这一块的博客,把一些复杂的code记录在案方便学习(其中包括webrtc,简单的ffmpeg,AAC...
勇敢跨越,从0到1
开发
一个属于自己的App
开始只是想走通整个
开发
流程,实现从0到1的
开发
过程,现在完成了却又遇到另一个
问题
,养服务器的
问题
! 最开始买服务器的时候,买的是最低配的 1核 1GB 1M,年费是330,是有首单优惠的。后来不够用了,升级到 1核 2...
转自 方倍工作室微信公众平台
开发
LNMP一键安装包是一个用Linux Shell编写的可以为CentOS/RadHat/Fedora、Debian/Ubuntu/Raspbian/Deepin VPS或独立主机安装LNMP(Nginx/MySQL/PHP)、LNMPA(Nginx/MySQL/PHP/Apache)、LAMP(Apache/MySQL/PHP)生产...
(转)dedecms代码详解 很全面
dedecms代码研究(1)开篇dedecms 相信大家一定都知道这个cms 系统,功能比较强大,有比较完善的内容发布,还有内容静态化系统,还有就是它有自己独特的标签系统和模板系统。而模板系统也是其他cms系统比较难模仿的...
GAME,图形处理/多媒体
1,183
社区成员
14,336
社区内容
发帖
与我相关
我的任务
GAME,图形处理/多媒体
Delphi GAME,图形处理/多媒体
复制链接
扫一扫
分享
社区描述
Delphi GAME,图形处理/多媒体
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章