Comment convertir un tableau d'octets à tampon d'image
J'ai un serveur de code java qui obtient un tableau d'octets à partir du client. Afin de faire un peu de traitement d'image, j'ai besoin de convertir le tableau d'octets en une BufferedImage
. J'ai un code qui est censé le faire ici:
public void processImage(byte[] data) {
ByteArrayInputStream stream = new ByteArrayInputStream(data);
BufferedImage bufferedImage;
bufferedImage = ImageIO.read(stream);
//bufferedImage is null
//...
}
Mais cela ne fonctionne pas; bufferedImage est null. Selon le ImageIO documentation:
Si pas enregistré
ImageReader
prétend être capable de lire les flux résultant,null
est retourné.
Comment dois-je dire à la ImageReader
ce type d'image, il est. Par exemple, si je sais que l'image JPEG (qui est, dans mon cas), que suis-je censé faire?
EDIT: Merci pour la suggestion que le fichier est probablement pas au format JPEG. C'est le code côté client que j'ai qui envoie les données en tant que Chaîne de caractères sur le serveur:
import org.json.JSONObject;
//Client-side code that sends image to server as String
public void sendImage() {
FileInputStream inputStream = new FileInputStream(new File("myImage.jpg"));
ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
byte[] b = new byte[1024];
while ((bytesRead = inputStream.read(b)) != -1) {
byteStream.write(b,0,bytesRead);
}
byte[] byteArray = byteStream.toByteArray();
JSONObject jsonObject = new JSONObject();
jsonObject.put("data",new String(byteArray));
//... more code here that sends jsonObject in HTTP post body
}
Et c'est du côté serveur, le code qui appelle la processImage() fonction:
//Server-side code that calls processImage() function
public void handleRequest(String jsonData) {
JSONObject jsonObject = new JSONObject(jsonData);
processImage(jsonObject.getString("data").getBytes());
}
Êtes-vous sûr que le tableau d'octets a de bonnes données? Avez-vous essayé de faire un simple test avec un programme qui lit une image, le convertit en un tableau d'octets, puis la convertit en tableau d'octets de l'image.
ImageIO reconnaît un bon JPEG à l'aide du code que vous avez posté. Ainsi, les plus susceptibles de l'image n'est pas au format JPEG. Le moyen facile de test, est de vider le tableau de données sur le disque, et voir à quoi il ressemble. Essayez de l'ouvrir dans un autre logiciel ou dans un éditeur hexadécimal. Peut-être le tableau de données contient les décodé pixels à partir d'un fichier JPEG?
Merci, j'ai ajouté plus de code dans l'espoir de mieux expliquer ce que mon code est fait
"j'ai ajouté plus de code.." Pourquoi? J'ai suggéré un SSCCE - un assez spécifique & autre chose.
OriginalL'auteur baekacaek | 2013-11-16
Vous devez vous connecter pour publier un commentaire.
L'explication la plus probable est que le tableau d'octets n'est pas contenir une image JPEG. (Par exemple, si vous avez essayé de le télécharger, vous pouvez disposer d'un document HTML donne une erreur de diagnostic.) Si c'est le cas, vous aurez besoin de trouver quelle en est la cause et la corriger.
Toutefois, si vous "savez" que le tableau d'octets contient une image avec un format donné, vous pourriez faire quelque chose comme ceci:
ImageIO.getImageReadersByFormatName
ouImageIO.getImageReadersByMIMEType
pour obtenir unIterator<ImageReader>
.ImageReader
de laIterator
.MemoryCacheImageInputStream
l'enveloppant d'unByteArrayInputStream
pour les types.ImageReader.setInput
pour connecter le lecteur à l'ImageInputStream
.ImageReader.read
pour obtenir leBufferedImage
.Le tableau d'octets ne pouvait pas être transformé en une Chaîne de caractères sans les corrompre. Donc en fin de compte, les données ont été corrompues et ne contiennent pas d'une image JPEG.
Ouais ... j'ai vu qu'avant.
new String(byte[])
etc sont à perte lorsque les octets n'étaient pas correctement codée des données de caractère dans la première place.OriginalL'auteur Stephen C