
2007-8-8 14:00
wps2000
问问各位大佬!图像半透明处理的问题
我有很多图片需要批量缩放然后添加Logo(本来看起来需要半透明添加上去的)导入到网站中去的,而且这是一个长期的过程,因此我希望做一个有界面的东西来完成这个工作,用户可以选择指定文件夹,Logo标志等,因此,我用Java做了。大致的东西都搞定了,就是半透明效果在Java中貌似没有什么好的方法实现。。。。我想问问各位大佬,Java中那个类的方法对应于PHP gd中的[b]imagesetpixel 这个函数![/b]
无赖中我使用PHP模拟了一遍按像素画的过程,貌似可以对每个像素的颜色设置透明度之后画上去,在PHP中基本上是成功的([color=red]有些问题,见下文[/color])
如下的代码是我的想法的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($liuyifei, null, 100);[/php]
绘图的效果如下:
[color=red]出现的一点问题是: 透明度设置 255 的确我就没了(全透了),但是各位可以测试一下,透明度 150不如 100透明的厉害[/color]
[color=#ff0000][/color]
[color=#ff0000]还忘各位指点一下,在Java中怎么把一个BufferedImage半透明后画到另一个BufferdImage上去?或者Java中有类似于imagesetpixel之类的方法么(setRGB不能指定透明度了)[/color]
[[i] 本帖最后由 wps2000 于 2007-8-8 14:17 编辑 [/i]]
2007-8-8 14:40
wps2000
搞了个循环测试(alpha值以步长为10,从0循环到255,把所有处理后的图片直接写到磁盘让我看),终于搞懂了,原来alpha值只有7bit,0 - 127)
不过Java的那个谁知道
PS:phpe怎么挂了这么久了?难道也没备案?
[[i] 本帖最后由 wps2000 于 2007-8-8 14:58 编辑 [/i]]
2007-8-13 10:41
wps2000
在Haohappy的指点下,终于搞定了,好不容易看到了java.awt.AlphaComposite这一节,一个一个测试,终于发现SRC_OVER就是我要的效果啦
终于搞出了第一个有实用目的GUI,不过使用NETBEABs写的代码真的很难看。。。。。
2007-8-13 14:56
Haohappy
呵呵,这跟用哪个IDE写没有关系的,看你用Swing还是Swt来写,一般Swt的会漂亮一些。不过Swing的加上一些美化界面的包,界面也是挺漂亮的。
2007-8-13 15:22
wps2000
不过貌似Java自带的哪几种图像处理的库实在不敢恭维
[php]
hints = new java.awt.RenderingHints(java.awt.RenderingHints.KEY_ALPHA_INTERPOLATION, java.awt.RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY);
hints.put(java.awt.RenderingHints.KEY_INTERPOLATION, java.awt.RenderingHints.VALUE_INTERPOLATION_BICUBIC);
hints.put(java.awt.RenderingHints.KEY_ANTIALIASING, java.awt.RenderingHints.VALUE_ANTIALIAS_ON);
hints.put(java.awt.RenderingHints.KEY_COLOR_RENDERING, java.awt.RenderingHints.VALUE_COLOR_RENDER_QUALITY);
hints.put(java.awt.RenderingHints.KEY_RENDERING, java.awt.RenderingHints.VALUE_RENDER_QUALITY);
hints.put(java.awt.RenderingHints.KEY_DITHERING, java.awt.RenderingHints.VALUE_DITHER_ENABLE);
[/php]
质量都已经提高到这份上了(有些值看不懂,因此还不知道是不是最高质量),弄出来的效果和原图还是有相当的差距的(特别是人的脸上,感觉渐变效果有些下降,仔细的看还是差了许多)
本来下了swt的,不过那个designer也太贵了,也没找到破解的,只好用NetBeans。第一次使用可视化的工具做,而且做的也蛮急的,一个晚上,因此代码巨难看,组件全部是内部类
2007-8-14 00:13
Haohappy
你可以用Eclipse的VE啊。。现在应该已经挺强大了吧。
页:
[1]
Powered by Discuz! Archiver 5.5.0
© 2001-2006 Comsenz Inc.