怎样用JSP或者SERVELET把存放在服务器文件夹下的多幅图片合成一幅显示到浏览器页面?

qdltl 2008-03-20 03:01:09
我在服务器的某个文件夹下存放了几个文件,希望合成一幅后输出到页面。从网上看了一些例子,还是没找到合适的解决办法。
...全文
172 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
qdltl 2008-03-20
  • 打赏
  • 举报
回复
自己顶一下!
qdltl 2008-03-20
  • 打赏
  • 举报
回复
我有个思路是,用SERVELET。用Image读入图片,然后在Graphics中合成,然后用流输出到页面。有两个问题,我还没弄明白:1、Graphics可以不可以在SERVELET中使用?2、如何将Graphics中的图片输出到流。

请高手给鉴定一下可行性。


这里有一个APPLET合成图像的例子,供参考。我想知道怎么在JSP中实现。

下面的程序对两个图像进行合成并显示来模拟图像的淡入淡出.程序运行后,每按一次向上键,前景图像就增强一点,每按一次向下键,前景图像就减弱一点.

首先你要了解图像数据.

每个象素点的信息由一个整数表达.整数共32个二进制位,从左向右,分成四个部分,每部分都是8位.

第一部分: Alpha 信息.控制图像显示的强度.下面的程序就是通过调整这个数值控制图像的淡入淡出.

第二部分:红色数据.

第三部分:绿色数据.

第四部分:蓝色数据.

程序使用的方法是:先画背景图像,再在上面画带Alpha数据的前景图像,通过调整Alpha值使前景图像淡入 淡出.

import java.applet.*;

import java.awt.*;

import java.awt.image.*;

public class alpha extends Applet

{

Image background, foreground;//背景图像和前景图像

Image foreground_new;//依据前景图像生成的带Alpha通道的新图像

MediaTracker mt;

int foreground_alpha=175;//前景图像的起始Alpha值

int foreground_data[];//用来生成新图像的内存数据

PixelGrabber pg;

int transparancy;//前景图像的全透明点的像素值.只要前景图像的某个点是这个值,它就全透明

public void init()

{

background=getImage(getCodeBase(),"mama.gif");

foreground=getImage(getCodeBase(),"baba.gif");

mt=new MediaTracker(this);

mt.addImage(background,1);

mt.addImage(foreground,2);

try{mt.waitForAll();} // 等待所有图片的数据都被正确载入

catch(InterruptedException e){ }

foreground_data=new int[foreground.getWidth(this) * foreground.getHeight(this)];//初始化

//下面把前景图片的数据载入数组

pg=new PixelGrabber(foreground,0,0,foreground.getWidth(this),foreground.getHeight(this),foreground_data,0,foreground.getWidth(this));

try{pg.grabPixels();}

catch(InterruptedException e){ }

for (int i=0;i<(foreground.getWidth(this) * foreground.getHeight(this));i++)

foreground_data[i]=foreground_data[i]&0x00ffffff;//把所有的象素的Alpha值置为0

//下面我把图像左上角的点的值作为透明值.假如图像中哪个点的值和左上角的点的值一样,

//这个点就全透明--背景100%出现.我用这个比较简单的办法把前景图像中我不想要的部分去掉

transparancy=foreground_data[0];

}

public void paint(Graphics g)

{

g.drawImage(background,0,0,this);

}

public boolean keyDown(Event e, int key)

{

if (key==Event.UP && foreground_alpha<255)//依据按键改变Alpha值

foreground_alpha++;

if (key==Event.DOWN && foreground_alpha>0)

foreground_alpha--;

showStatus(String.valueOf(foreground_alpha));//在状态栏显示Alpha值

for (int i=0;i<(foreground.getWidth(this) * foreground.getHeight(this));i++)//逐点处理

{

foreground_data[i]=foreground_data[i] & 0x00ffffff;//置此点为全透明

if (foreground_data[i]!=transparancy)//假如这个点的值和全透明点不同

foreground_data[i]=foreground_data[i] | (foreground_alpha<<24);//给它Alpha值

}

foreground_new=createImage(new MemoryImageSource(foreground.getWidth(this),foreground.getHeight(this),foreground_data,0,foreground.getWidth(this)));//生成前景图象

mt.addImage(foreground_new,3);

try{mt.waitForID(3);}

catch(InterruptedException e2){ }

getGraphics().drawImage(background,0,0,this);//先画背景

getGraphics().drawImage(foreground_new,100,100,this);//再画前景

return true;

}

}

下面是HTML文件:

<APPLET CODE="alpha.class"WIDTH=300 HEIGHT=300></APPLET>
qdltl 2008-03-20
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 DiligencyMan 的回复:]
用ImageMagick吧,你上网搜索下,这个是专门对图片进行处理的!
[/Quote]

看了半天,也没看懂该怎么用法。还望高手赐教。
qdltl 2008-03-20
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 beijixuem 的回复:]
关注中!为什么把多幅图片合成一幅图片呀?不能在同一个页面显示多张图片吗?
[/Quote]

用户需要将这张合成的图片Email给他的客户。
beijixuem 2008-03-20
  • 打赏
  • 举报
回复
关注中!为什么把多幅图片合成一幅图片呀?不能在同一个页面显示多张图片吗?
DiligencyMan 2008-03-20
  • 打赏
  • 举报
回复
用ImageMagick吧,你上网搜索下,这个是专门对图片进行处理的!
qdltl 2008-03-20
  • 打赏
  • 举报
回复
看来只能想别的办法了。结贴!

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧