2012-02-21 53 views
3

我有這樣的代碼,我想從URL中讀取的圖像:在java中將圖像嵌入到HTML中?

public class question_insert { 
public static String latex(String tex) throws IOException { 

    String urltext = "http://chart.apis.google.com/chart?cht=tx&chl="+tex; 

    URL url = new URL(urltext); 
    BufferedReader in = new BufferedReader(new InputStreamReader(url 
      .openStream())); 
    String inputLine; 

    while ((inputLine = in.readLine()) != null) { 
     // Process each line. 
     System.out.println(inputLine.toString()); 

    } 
    in.close(); 

    return inputLine;} 

但是我所得到的是不可讀的代碼。該網址只給出一個圖像試試這個:

http://chart.apis.google.com/chart?cht=tx&chl=2+2%20\frac{3}{4}

我應該怎麼做嵌入圖像轉換爲HTML?

+0

你是什麼意思的HTML格式不可讀的代碼和圖像?你從頁面獲得的數據是一個PNG文件 - 所以保存它。 – user219882 2012-02-21 13:53:38

+0

我想從網址中保存字符串。 – Navdroid 2012-02-21 14:01:44

+0

你期望你的結果看起來像什麼? – 2012-02-21 14:06:27

回答

5

好了,我不知道這是否是你想要的,因爲似乎沒有人做。但是,如果你想獲得這個輸出

<img style="-webkit-user-select: none" 
src="http://chart.apis.google.com/chart?cht=tx&chl=2+2%20\frac{3}{4}" /> 

,你將不得不使用此代碼

public static String latex(String tex) { 
    String url = "http://chart.apis.google.com/chart?cht=tx&chl=" + tex; 
    return "<img style=\"-webkit-user-select: none\" src=\"" + url + "\"/>"; 
} 

,可能還逃避像\一些字符在tex參數。

7

首先它不清楚你的意思是什麼圖像的Html格式?你可以Base64對它的二進制數據進行編碼,但那是你真正想要的嗎?

您如何期望輸出由URL返回到文本控制檯(即System.out)的PNG圖片?

其次,即使您將圖像作爲PNG文件存儲在磁盤上,檢索圖像的方式也不起作用,因爲Reader和其衍生工具(如BufferedReader)用於讀取字符數據。從Reader API

用於讀取字符流的抽象類

您需要讀取二進制(字節)的數據,所以你需要用BufferedInputStream


堅持經過一番思考,我意識到將圖像嵌入HTML是您真正想要的:

public static void main(String[] args) throws Exception { 
    String urltext = "http://chart.apis.google.com/chart?cht=tx&chl=2+2%20\\frac{3}{4}"; 
    URL url = new URL(urltext); 
    BufferedInputStream bis = new BufferedInputStream(url.openStream()); 
    byte[] imageBytes = new byte[0]; 
    for(byte[] ba = new byte[bis.available()]; 
     bis.read(ba) != -1;) { 
     byte[] baTmp = new byte[imageBytes.length + ba.length]; 
     System.arraycopy(imageBytes, 0, baTmp, 0, imageBytes.length); 
     System.arraycopy(ba, 0, baTmp, imageBytes.length, ba.length); 
     imageBytes = baTmp; 
    } 
    System.out.println("<img src='data:image/png;base64," + DatatypeConverter.printBase64Binary(imageBytes) + "'>"); 
} 

結果是:

<img src='data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABsAAAAhCAIAAACnV0fJAAAABmJLR0QA/wD/AP+gvaeTAAAC/klEQVRIiaWWv0vzQBjHr2ltsGDEyf+giAg5iIO4iiJC8cciQhaLk9IOGpcOii5ugj/qZoeWgqtFXJxrBSnUQTAianTJEJBcjeRCwr3D+caY1ijpd7rnc8lzz/PkuYdECCEgrDDGlmXF43GWZV0YC+0un8/f3993dXU9PT0JgpDL5T43SChdXV0JgnB5eUkIqVarPM+XSiW6xYQLkGEYlmVfXl4AAENDQwCAer3eUYyEENM06aJSqUAIq9UqNcN7JIQYhlGr1RYWFg4ODlwYMmuqer3++vra3d0ty7JlWZ1m7UrX9eHh4XQ67Y8RY9xsNh3H8QXSll9fX5fLZbrmOK6vr+/m5sYwDOD24+HhoaqqmqYpijI1NZXJZIL5xsaGqqqpVIrjOJpoJBL5ynpvb+/8/JzGTD/c/v5+ACeEZLPZ7e1tur67u+N5PpfLUTNimmYqlZqZmVleXqZnTExM2LZdqVTm5uZa+cXFRTQatSxra2vLMAyGYWRZhhBubm7G43EAANB1HUIIIdR1nR6STqd5nn9+fm7LXZMQYpomQshtTKoYx3Hr6+u0wDQWTdMSiUR/f39b7h0KLMt6zfbd8/j4KAhCNpv9I29VhHyfZouLi6qqnp6efhalHW82m/64/iuRSHybZsViESF0dHTkc+flCKGxsbGfPEqS9JX12dnZ0tISxtiXRStHP8u2beCWKZPJuK/t7Oy8v78H8AABQoiiKJIkaZpGz3l7exNFMYD/8mVs2xZFUZZlbzmSyWS5XG7LT05OWsuHMXbbKAYAmJ2d9T2RTCYDuE/FYrHRaOzu7n7av2YRLEVRRkdHvX3a0cQFABQKBd+16chjPp8fGRmJxb41dXiPDw8PCKHJyUkfD+nRcZzj4+O1tbXWrZAeS6XS9PS077JS+SfFX2QYxvz8/MDAADVrtVpvb+/g4KAoihDCkN3jvcvj4+MrKyv0UhNCQv5J9fT0eM1oNOqSjrqn0Wisrq7qun57eytJEsYYhKujK8dxPj4+XJOG+Q+Ygl+7nqaLKQAAAABJRU5ErkJggg=='> 

是不是很棒?一切爲了你!

+0

我是新手,我只是試圖從url中讀取這個 我在這裏沒有顯示圖像。 – Navdroid 2012-02-21 13:54:46

+0

你又想做什麼?最好在人力方面 – 2012-02-21 13:57:13

+0

@Navdroid但你期望讀什麼?文本?你得到一個圖像 - 二進制數據。難怪它不可讀。 – user219882 2012-02-21 13:59:47

2

爲了讓你的形象,你應該嘗試使用的ImageIO API這樣

try { 
    URL url = new URL(urltext); 
    BufferedImage img = ImageIO.read(url); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 
+0

當然,這是一個很好的答案,但你怎麼能顯示這個圖像使用html?我的意思是在格式 – Navdroid 2012-02-21 14:05:00

+0

@Navdroid你能告訴我們在人力方面什麼是你試圖實現的結果?什麼是格式? – 2012-02-21 14:09:33

0

http://chart.apis.google.com/chart?cht=tx&chl=2+2%20 \壓裂{3} {4}

注意,該網址是錯誤的。這將顯示22 3/4而不是預期的2 + 2 3/4。包含特殊字符的請求參數需要進行URL編碼,如下所示。

http://chart.apis.google.com/chart?cht=tx&chl=2%2B2%20%5Cfrac%7B3%7D%7B4%7D

您可以URLEncoder#encode()實現這一目標。

String chl = "2+2 \\frac{3}{4}"; 
String url = "http://chart.apis.google.com/chart?cht=tx&chl=" + URLEncoder.encode(chl, "UTF-8"); 

回到你的功能需求:

我應該怎麼做嵌入圖像轉換爲HTML?

如果你唯一的功能需求是由HTML <img>元素在一個HTML/JSP頁面來顯示圖像爲可用提到的URL後面,那麼你需要使用JSTL<c:url>標籤包含URL編碼請求參數特殊字符。

<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 
... 
<c:url var="url" value="http://chart.apis.google.com/chart"> 
    <c:param name="cht" value="tx" /> 
    <c:param name="chl" value="2+2 \\frac{3}{4}" /> 
</c:url> 

然後,你可以參考它${url}(如在<c:url>var屬性聲明)在HTML <img>元素的src屬性:

<img src="${url}" /> 

從URL作爲閱讀的二進制圖像流字符流和存儲在字符串中,就像您最初嘗試的那樣完全沒有意義。例如,您也不會在記事本中打開圖像文件。