PDA

View Full Version : [JAVA] -Immagine da array di byte


spillo491
13-09-2007, 14:21
Come si fa a creare in java un immagine a partire da un array di byte ? E a salvarla poi su un file ?
grazie

isAlreadyInUse
13-09-2007, 14:23
Pensi di creare una cptcha?

spillo491
13-09-2007, 14:26
esatto

andbin
13-09-2007, 14:27
Come si fa a creare in java un immagine a partire da un array di byte ? E a salvarla poi su un file ?Dovresti specificare meglio: array di byte che contiene cosa?

isAlreadyInUse
13-09-2007, 14:29
Perche risolvere 2 volte lo stesso problema?


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<HTML>
<HEAD>
<%@ page
language="java"
contentType="text/html; charset=ISO-8859-1"
%>
<META http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<META name="GENERATOR" content="IBM WebSphere Studio">
<TITLE></TITLE>
</HEAD>
<BODY>
<br><br><br><br>
<%
String c= (String)session.getAttribute(nl.captcha.servlet.Constants.SIMPLE_CAPCHA_SESSION_KEY) ;
String parm = (String) request.getParameter("captchafield");

out.println(parm + " ? " + c + ":");

if (c != null && parm != null) {
if (c.equals(parm)) {
out.println("<b>true</b>");
}else {
out.println("<b>false</b>");
}
}
%>
<table>
<tr>
<td><img src="Captcha.jpg">
</td>
<td valign="top">
<form>
<br><input type="text" name="captchafield"><br>
<INPUT type="submit" name="submit">
</form>
</td>
</tr>
</table>
</BODY>
</HTML>


e questo è il web.xml


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN" "http://java.sun.com/j2ee/dtds/web-app_2_2.dtd">
<web-app id="WebApp">
<display-name>captcha</display-name>
<servlet>
<servlet-name>SimpleCaptcha</servlet-name>
<display-name>SimpleCaptcha</display-name>
<servlet-class>nl.captcha.servlet.SimpleCaptcha</servlet-class>
</servlet>

<servlet-name>Captcha</servlet-name>
<display-name>Captcha</display-name>
<servlet-class>nl.captcha.servlet.CaptchaServlet</servlet-class>
<servlet>
<servlet-name>Captcha</servlet-name>
<display-name>Captcha</display-name>
<servlet-class>nl.captcha.servlet.CaptchaServlet</servlet-class>

<!--border around captcha. Legal values are yes or no. Defaults to yes Other values will be ignored-->
<init-param>
<param-name>cap.border</param-name>
<param-value>yes</param-value>
</init-param>
<!--color of the border. Legal values are r,g,b(and optional alpaha) or white,black,etc. Other values will be ignored-->
<init-param>
<param-name>cap.border.c</param-name>
<param-value>black</param-value>
</init-param>
<!--thickness of the border around captcha. Legal values are > 0 other values will be ignored. Defaults to one-->
<init-param>
<param-name>cap.border.th</param-name>
<param-value>1</param-value>
</init-param>

<init-param>
<param-name>cap.obscurificator</param-name>
<!--<param-value>nl.captcha.obscurity.imp.ShadowGimpyImp</param-value>-->
<!--<param-value>nl.captcha.obscurity.imp.WaterRiple</param-value>-->
<param-value>nl.captcha.sandbox.TestGimpyImp</param-value>
</init-param>

<init-param>
<param-name>cap.cap.producer</param-name>
<param-value>nl.captcha.obscurity.DefaultCaptchaIml</param-value>
</init-param>


<init-param>
<param-name>cap.word.imp</param-name>
<param-value>nl.captcha.text.imp.DefaultWordRenderer</param-value>
</init-param>

<init-param>
<param-name>cap.text.producer</param-name>
<!--<param-value>nl.captcha.sandbox.ChineseTextProducer</param-value>-->
<param-value>nl.captcha.text.imp.FiveLetterFirstNameTextCreator</param-value>
</init-param>
<init-param>
<param-name>cap.char.arr</param-name>
<param-value>2,3,4,6,7,8,a,b,c,d,e,f,g,h,k,o,r,s,t,x,y</param-value>
</init-param>
<!--if default captcha producer is slelected this value represents the amount of chars that are supplied in the captcha. values below 2 are not exepted when omitted defaults to 5-->
<init-param>
<param-name>cap.char.arr.l</param-name>
<param-value>6</param-value>
</init-param>
<init-param>
<param-name>cap.font.arr</param-name>

<param-value>Arial,Helvetica,Courier,TimesRoman</param-value>

</init-param>
<init-param>
<param-name>cap.font.size</param-name>
<param-value>40</param-value>
</init-param>

<init-param>
<param-name>cap.font.color</param-name>
<param-value>166,31,255</param-value>
</init-param>


<init-param>
<param-name>cap.bg.imp</param-name>
<param-value>nl.captcha.obscurity.imp.DefaultBackgroundImp</param-value>
</init-param>

<!--values can be either red,yellow,blue,cya etc or r,g,b,alpha value-->

<init-param>
<param-name>cap.background.c.to</param-name>
<param-value>255,255,255</param-value>
</init-param>

<init-param>
<param-name>cap.background.c.from</param-name>
<param-value>75,75,255</param-value>
</init-param>


<init-param>
<param-name>cap.noise.imp</param-name>
<param-value>nl.captcha.obscurity.imp.DefaultNoiseImp</param-value>
</init-param>

<init-param>
<param-name>cap.noise.c</param-name>
<param-value>166,31,255</param-value>
</init-param>

</servlet>


<servlet-mapping>
<servlet-name>SimpleCaptcha</servlet-name>
<url-pattern>/SimpleCaptcha.jpg</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>Captcha</servlet-name>
<url-pattern>/Captcha.jpg</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>

spillo491
13-09-2007, 14:35
isAlreadyInUse ti ringrazio ma io devo generare l'immagine tramite una action e poi passarla a una JSP.
Ho una cosa di questo tipo nella Action


byte[] captchaChallengeAsJpeg = null;

// L'output stream che ci serve per renderizzare l'immagine Captcha in una JPEG
// RENDERING = generazione di un'immagine a partire da una descrizione matematica
// di una scena tridimensionale
ByteArrayOutputStream jpegOutputStream = new ByteArrayOutputStream();

try {
// Prendiamo l'id di sessione che utilizzeremo per generare l'immagine captcha.
// Lo stesso id sarà utilizzato per validare la risposta
String captchaId = request.getSession().getId();
BufferedImage challenge = CaptchaServiceSingleton.getInstance().getImageChallengeForID(captchaId, request.getLocale());

// L'encoder JPEG
JPEGImageEncoder jpegEncoder = JPEGCodec.createJPEGEncoder(jpegOutputStream);
jpegEncoder.encode(challenge);
}
catch (IllegalArgumentException e) {
return mapping.findForward( "error" );
}
catch (CaptchaServiceException e) {
return mapping.findForward( "error" );
}

// ho un array di byte
captchaChallengeAsJpeg = jpegOutputStream.toByteArray();

isAlreadyInUse
13-09-2007, 14:46
Se usi Struts e vuoi qualcosa di gia fatto dai un occhio a questo
http://forge.octo.com/jcaptcha/confluence/display/general/Struts+integration

PGI-Bis
13-09-2007, 14:54
Se l'array di byte contiene i dati dell'immagine in formato Jpeg per salvare l'immagine su file... salvi l'array di byte. Per intenderci, è già un file jpg, solo che è in memoria anzichè su disco.

Per ottenere un'immagine Java dall'array di byte (sempre contenente i dati in formato jpg) fai l'inverso di quello che avresti dovuto fare per ottenere l'array di byte:

BufferedImage image = ImageIO.read(new ByteArrayInputStream(data));

spillo491
13-09-2007, 14:58
Quindi image è la mia immagine in JPEG ?
Se volessi salvarla su file ?

PGI-Bis
13-09-2007, 15:05
Se vuoi salvare un BufferedImage basta dire (ad esempio):

ImageIO.write(image, "jpg", new File("c:\\immagine.jpg"));

Il metodo write rilascia un'eccezione di IO nel caso in cui qualcosa vada storto.

Tieni comunque conto che l'array di byte:

captchaChallengeAsJpeg

è già il contenuto di un "file jpg". Quindi puoi saltare la conversione-riconversione e scrivere direttamente su un file il contenuto di captchaChallengeAsJpeg.

ByteBuffer data = ByteBuffer.wrap(captchaChallengeAsJpeg);
FileChannel out = new FileOutputStream("c:\\immagine.jpg").getChannel();
try {
while(data.hasRemaining()) { out.write(data); }
} finally {
out.close();
}

PS: quando fai:

BufferedImage image = ImageIO.read(new ByteArrayInputStream(iByteJpg));

"image" non è propriamente la tua immagine jpg ma è l'immagine Java che risulta dall'interpretazione dei byte che, incindentalmente, sono quelli di un'immagine jpg. A parte questo "incidente", non c'è una correlazione tra il formato jpeg e BufferedImage. Tant'è che iByteJpg potrebbe benissimo essere in formato png, bmp o gif.

spillo491
13-09-2007, 16:26
Ok grazie a tutti ora sono riuscito a salvare l'immagine su file ma non riesco a visualizzarla nella pagina JSP

Uso questo comando dove sbaglio ?

<html:img src="C:\\captcha.jpg"/>

Dove sbaglio ?

isAlreadyInUse
13-09-2007, 16:48
Dovresti usare un percorso relativo

spillo491
13-09-2007, 19:16
No effettivamente l'immagine era in c: ma il sistema inseriva un

/nomeapplicazione

quindi avevo nell'html /nomeapplicazionec:\\capatcha.jpg

che chiaramente non funzionava.
Grazie

spillo491
14-09-2007, 15:46
Un ultimo problema (spero) da risolvere :

Ho la LoginAction e la CaptchaAction in cui verifico la correttezza della stringa inserita. Come faccio a passare alla CaptchaAction l'idutente ? :doh:
Nel mio caso l'idutente è una proprieta dell'actionform LoginForm