标题: 问问各位大佬!图像半透明处理的问题
wps2000
新手上路
Rank: 1



UID 34
精华 0
积分 0
帖子 73
翻译 0
原创 0
阅读权限 10
注册 2007-5-20
状态 离线
发表于 2007-8-8 14:00  资料  短消息  加为好友 
问问各位大佬!图像半透明处理的问题

我有很多图片需要批量缩放然后添加Logo(本来看起来需要半透明添加上去的)导入到网站中去的,而且这是一个长期的过程,因此我希望做一个有界面的东西来完成这个工作,用户可以选择指定文件夹,Logo标志等,因此,我用Java做了。大致的东西都搞定了,就是半透明效果在Java中貌似没有什么好的方法实现。。。。我想问问各位大佬,Java中那个类的方法对应于PHP gd中的imagesetpixel 这个函数!

无赖中我使用PHP模拟了一遍按像素画的过程,貌似可以对每个像素的颜色设置透明度之后画上去,在PHP中基本上是成功的(有些问题,见下文

如下的代码是我的想法的PHP实现:RGB只用了24bit,而都所谓32位真彩色,因此我猜测alpha设在 25 ~ 32 bit,所以下面的代码中直接通过位移操作来设置alpha通道

PHP代码如下:

<?php
$liuyifei 
imagecreatefromjpeg('D:\lyf.jpg');
$wo imagecreatefromjpeg('D:\wo.jpg');

//把我以透明度 $alpha 画到刘亦菲图片的 $offsetX, $offsetY上
$offsetX 500;
$offsetY 300;
$alpha 80;


$wo_Width imagesx($wo);
$wo_Height imagesy($wo);

for (
$i 0$i $wo_Height$i ++)
{
//图片的行循环
for ($j 0;$j $wo_Width$j++)
{
  
//图片了列循环
  
$colorAtWo imagecolorat($wo$j$i);
  
//$colorAtLiuYIfei = imagecolorat($liuyifei, $offsetY + $j, $offsetX + $i);
  //添加透明度
  
$colorAtWoNew = ($colorAtWo $alpha << 24);
  
imagesetpixel($liuyifei$j $offsetX$i $offsetY$colorAtWoNew);
}
}
header('Content-Type: image/jpeg');
imagejpeg($liuyifeinull100);


绘图的效果如下:

出现的一点问题是: 透明度设置 255 的确我就没了(全透了),但是各位可以测试一下,透明度 150不如 100透明的厉害

还忘各位指点一下,在Java中怎么把一个BufferedImage半透明后画到另一个BufferdImage上去?或者Java中有类似于imagesetpixel之类的方法么(setRGB不能指定透明度了)

[ 本帖最后由 wps2000 于 2007-8-8 14:17 编辑 ]



 附件: 您所在的用户组无法下载或查看附件




顶部
wps2000
新手上路
Rank: 1



UID 34
精华 0
积分 0
帖子 73
翻译 0
原创 0
阅读权限 10
注册 2007-5-20
状态 离线
发表于 2007-8-8 14:40  资料  短消息  加为好友 
搞了个循环测试(alpha值以步长为10,从0循环到255,把所有处理后的图片直接写到磁盘让我看),终于搞懂了,原来alpha值只有7bit,0 - 127)

不过Java的那个谁知道

PS:phpe怎么挂了这么久了?难道也没备案?

[ 本帖最后由 wps2000 于 2007-8-8 14:58 编辑 ]





顶部
wps2000
新手上路
Rank: 1



UID 34
精华 0
积分 0
帖子 73
翻译 0
原创 0
阅读权限 10
注册 2007-5-20
状态 离线
发表于 2007-8-13 10:41  资料  短消息  加为好友 
在Haohappy的指点下,终于搞定了,好不容易看到了java.awt.AlphaComposite这一节,一个一个测试,终于发现SRC_OVER就是我要的效果啦

终于搞出了第一个有实用目的GUI,不过使用NETBEABs写的代码真的很难看。。。。。





顶部
Haohappy
超级版主
Rank: 8Rank: 8
PHPEye站长


UID 2
精华 11
积分 110
帖子 283
翻译 6
原创 1
阅读权限 150
注册 2007-5-2
状态 离线
发表于 2007-8-13 14:56  资料  短消息  加为好友  添加 haohappy 为MSN好友 通过MSN和 haohappy 交谈
呵呵,这跟用哪个IDE写没有关系的,看你用Swing还是Swt来写,一般Swt的会漂亮一些。不过Swing的加上一些美化界面的包,界面也是挺漂亮的。





互助共享,共同成长。
顶部
wps2000
新手上路
Rank: 1



UID 34
精华 0
积分 0
帖子 73
翻译 0
原创 0
阅读权限 10
注册 2007-5-20
状态 离线
发表于 2007-8-13 15:22  资料  短消息  加为好友 
不过貌似Java自带的哪几种图像处理的库实在不敢恭维

PHP代码如下:
hints = new java.awt.RenderingHints(java.awt.RenderingHints.KEY_ALPHA_INTERPOLATIONjava.awt.RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY);
                
hints.put(java.awt.RenderingHints.KEY_INTERPOLATIONjava.awt.RenderingHints.VALUE_INTERPOLATION_BICUBIC);
                
hints.put(java.awt.RenderingHints.KEY_ANTIALIASINGjava.awt.RenderingHints.VALUE_ANTIALIAS_ON);
                
hints.put(java.awt.RenderingHints.KEY_COLOR_RENDERINGjava.awt.RenderingHints.VALUE_COLOR_RENDER_QUALITY);
                
hints.put(java.awt.RenderingHints.KEY_RENDERINGjava.awt.RenderingHints.VALUE_RENDER_QUALITY);
                
hints.put(java.awt.RenderingHints.KEY_DITHERINGjava.awt.RenderingHints.VALUE_DITHER_ENABLE);


质量都已经提高到这份上了(有些值看不懂,因此还不知道是不是最高质量),弄出来的效果和原图还是有相当的差距的(特别是人的脸上,感觉渐变效果有些下降,仔细的看还是差了许多)

本来下了swt的,不过那个designer也太贵了,也没找到破解的,只好用NetBeans。第一次使用可视化的工具做,而且做的也蛮急的,一个晚上,因此代码巨难看,组件全部是内部类





顶部
Haohappy
超级版主
Rank: 8Rank: 8
PHPEye站长


UID 2
精华 11
积分 110
帖子 283
翻译 6
原创 1
阅读权限 150
注册 2007-5-2
状态 离线
发表于 2007-8-14 00:13  资料  短消息  加为好友  添加 haohappy 为MSN好友 通过MSN和 haohappy 交谈
你可以用Eclipse的VE啊。。现在应该已经挺强大了吧。





互助共享,共同成长。
顶部
 


PHPEye开源社区


当前时区 GMT+8, 现在时间是 2008-12-5 09:09

    Powered by Discuz! 5.5.0  © 2001-2007 Comsenz Inc.
Processed in 0.035818 second(s), 6 queries , Gzip enabled

清除 Cookies - 联系我们 - PHPEye开源社区 - Archiver