2013-03-26 70 views
3

我正在讀取servlet中的兩個圖像,並且需要同時顯示兩個圖像。 當前,只顯示一個圖像(首先寫入一個圖像)。無法寫入其他圖像。 我沒有收到任何錯誤。將多個圖像寫入到servlet中的outputStream中

我的servlet代碼是這樣的:

BufferedImage buffImageA = ImageIO.read(getServletContext().getResourceAsStream("/images/3520276097315A.jpg")); 
    BufferedImage buffImageB = ImageIO.read(getServletContext().getResourceAsStream("/images/3520276097315B.jpg")); 

    logger.logDebug("Images has been read"); 

    watermark(buffImageA,ApplicationConfig.WATERMARK_TEXT); 
    watermark(buffImageB,ApplicationConfig.WATERMARK_TEXT); 

    byte[] resultDataA = encodeJPEG(buffImageA, 100); 
    byte[] resultDataB = encodeJPEG(buffImageB, 100); 

    byte[] combinedImage = new byte[resultDataA.length+resultDataB.length]; 

    for(int i=0; i<resultDataA.length ;i++){ 
     combinedImage[i] = resultDataA[i]; 
    } 

    for(int i=resultDataA.length; i<resultDataB.length ;i++){ 
     combinedImage[i] = resultDataB[i]; 
    } 

    response.setContentType("image/jpeg"); 

    response.setContentLength(resultDataA.length + resultDataB.length); 
    OutputStream os = response.getOutputStream(); 
    os.write(combinedImage); 
    os.close(); 

//水印過程到這裏

private void watermark(BufferedImage original, String watermarkText) { 

} 

private byte[] encodeJPEG(BufferedImage image, int quality) throws IOException { 
     ByteArrayOutputStream baos = new ByteArrayOutputStream((int) ((float) image.getWidth() * image.getHeight()/4)); 
     JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(baos); 
     JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(image); 
     quality = Math.max(0, Math.min(quality, 100)); 
     param.setQuality((float) quality/100.0f, false); 
     encoder.setJPEGEncodeParam(param); 
     encoder.encode(image); 
     byte[] result = baos.toByteArray(); 
     baos.close(); 
     return result; 
    } 

我一直在使用ImageIO.write寫的形象嘗試,但未能得到什麼希望。

回答

2

你的第二個for迴路必須是這樣的:

for(int i=resultDataA.length; i<resultDataB.length+resultDataA.length ;i++){ 
    combinedImage[i] = resultDataB[i-resultDataA.length]; 
} 

編輯:

這是一個編譯,可運行例如緊挨什麼你期待:

import java.awt.image.BufferedImage; 
import java.io.ByteArrayInputStream; 
import java.io.ByteArrayOutputStream; 
import java.io.File; 
import java.io.IOException; 
import java.io.InputStream; 
import javax.imageio.ImageIO; 
import java.awt.Graphics; 

public class Essai2 { 

    public static void main(String[] args) { 

     try { 

      byte[] imageInByte; 
      BufferedImage originalImage1 = ImageIO.read(new File("essai1.jpg")); 
      BufferedImage originalImage2 = ImageIO.read(new File("essai2.jpg")); 

      // convert BufferedImage to byte array 
      ByteArrayOutputStream baos1 = new ByteArrayOutputStream(); 
      ByteArrayOutputStream baos2 = new ByteArrayOutputStream(); 
      ImageIO.write(originalImage1, "jpg", baos1); 
      ImageIO.write(originalImage2, "jpg", baos2); 
      baos1.flush(); 
      baos2.flush(); 
      byte[] ba1 = baos1.toByteArray(); 
      byte[] ba2 = baos2.toByteArray(); 
      imageInByte = new byte[ba1.length + ba2.length]; 
      //System.out.println(new String(imageInByte)); 
      System.arraycopy(ba1, 0, imageInByte, 0, ba1.length); 
      //System.out.println(new String(imageInByte)); 
      System.arraycopy(ba2, 0, imageInByte, ba1.length, ba2.length); 
      //System.out.println(new String(imageInByte)); 
      baos1.close(); 
      baos2.close(); 

      // convert byte array back to BufferedImage 
      InputStream in = new ByteArrayInputStream(imageInByte); 

      int w = Math.max(originalImage1.getWidth(), originalImage2.getWidth()); 
      //int h = Math.max(originalImage1.getHeight(), originalImage2.getHeight()); 
      int h = originalImage1.getHeight() + originalImage2.getHeight(); 
      BufferedImage bImageFromConvert = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB); 
      //BufferedImage bImageFromConvert = new BufferedImage(w, h, BufferedImage.TYPE_4BYTE_ABGR); 

      //BufferedImage bImageFromConvert = ImageIO.read(in); 

      Graphics g = bImageFromConvert.getGraphics(); 
      g.drawImage(originalImage1, 0, 0, null); 
      g.drawImage(originalImage2, 0, originalImage1.getHeight(), null); 

      ImageIO.write(bImageFromConvert, "jpg", new File("result.jpg")); 

     } catch (IOException e) { 
      System.out.println(e.getMessage()); 
     } 
    } 
} 

essai1.jpg:

enter image description here

essai2.jpg:

enter image description here

result.jpg:

enter image description here

我還沒有找到的那一刻爲什麼有第三種顏色添加到result.jpg 。但我認爲這個例子可以幫助你,我將盡快修復我的代碼。

EDIT2:

變化:

BufferedImage bImageFromConvert = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB); 

要:

BufferedImage bImageFromConvert = new BufferedImage(w, h, originalImage1.getType()); 

,它會正常工作。

result.jpg:

enter image description here

+0

它具有相同的效果。 – usman 2013-03-26 09:56:42

+0

我想知道我是否可以像上面的代碼一樣追加兩張圖片。我認爲它沒有顯示,因爲在字節寫入第一個圖像文件結尾發生時,它馬上終止寫入過程並關閉流? – usman 2013-03-26 11:18:51

+0

感謝您的幫助。但是仍然有問題爲什麼不能直接從OutputStream寫入。文件問題是ENd嗎? – usman 2013-03-27 07:11:58

相關問題