国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

使用Servlet動(dòng)態(tài)生成圖片

2019-11-18 16:09:17
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

  在Web應(yīng)用中,經(jīng)常需要?jiǎng)討B(tài)生成圖片,比如實(shí)時(shí)股市行情,各種統(tǒng)計(jì)圖等等,這種情況下,圖片只能在服務(wù)器內(nèi)存中動(dòng)態(tài)生成并發(fā)送給用戶(hù),然后在瀏覽器中顯示出來(lái)。

本質(zhì)上,瀏覽器向服務(wù)器請(qǐng)求靜態(tài)圖片如jpeg時(shí),服務(wù)器返回的仍然是標(biāo)準(zhǔn)的http響應(yīng),只不過(guò)http頭的contentType不是text/Html,而是image/jpeg而已,因此,我們?cè)赟ervlet中只要設(shè)置好contentType,然后發(fā)送圖像的數(shù)據(jù)流,瀏覽器就能正確解析并顯示出圖片。

java中,java.awt和java.awt.image包提供了基本的繪制圖像的能力,我們可以在內(nèi)存中繪制好需要的圖形,然后編碼成jpeg或其他圖像格式,最后發(fā)送相應(yīng)給瀏覽器即可。下面是使用Servlet動(dòng)態(tài)創(chuàng)建圖像的詳細(xì)步驟:

1.創(chuàng)建BufferedImage對(duì)象,該對(duì)象存在內(nèi)存中,負(fù)責(zé)保存繪制的圖像;
2.創(chuàng)建Graphics2D對(duì)象,該對(duì)象負(fù)責(zé)繪制所需的圖像;
3.當(dāng)繪制完成后,調(diào)用com.sun.image.codec.jpeg包的JPEG編碼器對(duì)其編碼;
4.最后將編碼后的數(shù)據(jù)輸出至HttPResponse即可。

注意com.sun.image.codec.jpeg包位于JDK目錄的rt.jar包中,它不是公開(kāi)的API,需要將rt.jar復(fù)制到web應(yīng)用程序的WEB-INF/lib下。

我們先創(chuàng)建一個(gè)最簡(jiǎn)單的Servlet:

public class CreateImageServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException
    {
        response.setContentType("image/jpeg");
    }
}

我們首先設(shè)置了response的contentType為image/jpeg,這樣瀏覽器就可以正確識(shí)別。

然后,創(chuàng)建一個(gè)大小為100x100的BufferedImage對(duì)象,準(zhǔn)備繪圖:

int width = 100;
int height = 100;
BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);

接著,BufferedImage對(duì)象中獲取Graphics2D對(duì)象并繪圖:

Graphics2D g = bi.createGraphics(); // 創(chuàng)建Graphics2D對(duì)象
// 填充背景為白色:
g.setBackground(Color.BLUE);
g.clearRect(0, 0, width, height);
// 設(shè)置前景色:
g.setColor(Color.RED);
// 開(kāi)始繪圖:
g.drawLine(0, 0, 99, 99); // 繪制一條直線(xiàn)
// 繪圖完成,釋放資源:
g.dispose();
bi.flush();

然后,對(duì)BufferedImage進(jìn)行JPEG編碼:

JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(bi);
param.setQuality(1.0f, false);
encoder.setJPEGEncodeParam(param);
try {
    encoder.encode(bi);
}
catch(IOException ioe) {
    ioe.printStackTrace();
}

編碼后的JPEG圖像直接輸出到了out對(duì)象中,我們只要傳入response. getOutputStream()就可以直接輸出到HttpResponse中。

下面是完整的代碼:

package com.crackj2ee.web.util;

import java.io.*;
import java.awt.*;
import java.awt.image.*;

import javax.servlet.*;
import javax.servlet.http.*;

import com.sun.image.codec.jpeg.*;

/**
 * @author Liao Xue Feng
 */
public class CreateImageServlet extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException
    {
        response.setContentType("image/jpeg");
        createImage(response.getOutputStream());
    }

    private void createImage(OutputStream out) {
        int width = 100;
        int height = 100;
        BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
        Graphics2D g = bi.createGraphics();
        // set background:
        g.setBackground(Color.BLUE);
        g.clearRect(0, 0, width, height);
        // set fore color:
        g.setColor(Color.RED);
        // start draw:
        g.drawLine(0, 0, 99, 199);
        // end draw:
        g.dispose();
        bi.flush();
        // encode:
        JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
        JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(bi);
        param.setQuality(1.0f, false);
        encoder.setJPEGEncodeParam(param);
        try {
            encoder.encode(bi);
        }
        catch(IOException ioe) {
            ioe.printStackTrace();
        }
    }
}

最后將這個(gè)Servlet編譯,注冊(cè)到web.xml中,映射路徑為/CreateImage,寫(xiě)一個(gè)簡(jiǎn)單的index.html測(cè)試:

<html><head></head>
<body>
<img src="CreateImage">
</body></html>

如能正確顯示,大功告成!

(出處:http://www.survivalescaperooms.com)



發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 衡水市| 玉树县| 新化县| 新密市| 井冈山市| 玛曲县| 得荣县| 芦溪县| 安丘市| 修水县| 桐城市| 余干县| 醴陵市| 东源县| 合肥市| 靖江市| 南陵县| 新昌县| 玉屏| 天水市| 镇雄县| 思南县| 沂源县| 呼图壁县| 三都| 黑河市| 宜兴市| 南汇区| 友谊县| 连平县| 淅川县| 华坪县| 清丰县| 黄梅县| 安吉县| 夏河县| 左贡县| 同江市| 庆安县| 永吉县| 五常市|