En el trabajo, encontré la necesidad de obtener la base64 de la imagen a través de la URL de la imagen. Al principio, utilicé el método en línea a través de Toolkit. Aunque el código de implementación es relativamente corto, ocasionalmente encuentro la situación de que la imagen se convierte incorrectamente a base64 bit. No sé por qué.
Después de eso, me conecté en línea y busqué una manera de convertir el flujo binario de la imagen en base64. Ambos métodos son efectivos para la prueba profesional. De vez en cuando aparecen a través de Toolkit. Después de cambiar a base64, se muestra el problema de la visualización incompleta. Por lo tanto, se recomienda realizar la conversión descargando la conversión de flujo binario.
Adjunte el siguiente código:
import java.awt.image.BufferedImage; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import javax.imageio.ImageIO; import javax.swing.ImageIcon; import java.awt.Graphics; import java.awt.GraphicsConfiguration; import java.awt.GraphicsDevice; import java.awt.GraphicsEnvironment; import java.awt.HeadlessException; import java.awt.Image; import java.awt.Toolkit; import java.awt.Transparency; import java.net.HttpURLConnection; import java.net.URL; ImageUtils de clase pública { Cadena estática pública getBase64ByImgUrl (URL de cadena) { Sufijo de cadena = url.substring (url.lastIndexOf (".") + 1); tratar { URL URL = nueva URL (url); ByteArrayOutputStream baos = nuevo ByteArrayOutputStream (); Imagen imagen = Toolkit.getDefaultToolkit (). GetImage (urls); BufferedImage biOut = toBufferedImage (imagen); ImageIO.write (biOut, sufijo, baos); Cadena base64Str = Base64Util.encode (baos.toByteArray ()); volver base64Str; } catch (Excepción e) { regreso ""; } } Public BufferedImage toBufferedImage (Imagen de imagen) { if (image instanceof BufferedImage) { imagen de retorno (BufferedImage); } // Este código garantiza que se carguen todos los píxeles de la imagen. imagen = nueva ImageIcon (imagen) .getImage (); BufferedImage bimage = null; GraphicsEnvironment ge = GraphicsEnvironment .getLocalGraphicsEnvironment (); tratar { int transparencia = Transparencia.OPAQUE; GraphicsDevice gs = ge.getDefaultScreenDevice (); GraphicsConfiguration gc = gs.getDefaultConfiguration (); bimage = gc.createCompatibleImage (image.getWidth (null), image.getHeight (nulo), transparencia); } catch (HeadlessException e) { // El sistema no tiene pantalla } if (bimage == null) { // Crea una imagen almacenada usando el modelo de color predeterminado int type = BufferedImage.TYPE_INT_RGB; bimage = new BufferedImage (image.getWidth (null), image.getHeight (nulo), tipo); } // Copiar imagen a imagen almacenada Gráficos g = bimage.createGraphics (); // Pintar la imagen en la imagen almacenada g.drawImage (imagen, 0, 0, nulo); g.dispose (); bimage de retorno; } / ** * Obtenga la cadena base64 de la imagen a través de la url de la imagen * @param imgUrl url de imagen * @return devuelve la cadena de imagen base64 * / Cadena estática pública image2Base64 (String imgUrl) { URL url = nulo; InputStream es = nulo; ByteArrayOutputStream outStream = nulo; HttpURLConnection httpUrl = nulo; tratar{ url = nueva URL (imgUrl); httpUrl = (HttpURLConnection) url.openConnection (); httpUrl.connect (); httpUrl.getInputStream (); es = httpUrl.getInputStream (); outStream = nuevo ByteArrayOutputStream (); // Crear una cadena de búfer byte [] buffer = nuevo byte [1024]; // La longitud de la cadena leída cada vez, si es -1, significa que todo es leído int len = 0; // Use una secuencia de entrada para leer datos del búfer while ((len = is.read (buffer))! = -1) { // Use la secuencia de salida para escribir datos en el búfer, el parámetro del medio representa dónde comenzar a leer y len representa la duración de la lectura outStream.write (buffer, 0, len); } // Base64 que codifica la matriz de bytes return Base64Util.encode (outStream.toByteArray ()); } catch (Excepción e) { e.printStackTrace (); } finalmente{ if (es! = nulo) { tratar { está cerca(); } catch (IOException e) { e.printStackTrace (); } } if (outStream! = nulo) { tratar { outStream.close (); } catch (IOException e) { e.printStackTrace (); } } if (httpUrl! = nulo) { httpUrl.disconnect (); } } return imgUrl; } }
Donde
El método getBase64ByImgUrl se obtiene a través de Toolkit. En cuanto a por qué no hay comentarios, porque no entiendo el principio, lo copié.
El método image2Base64 es mediante la descarga de una secuencia binaria, que por supuesto se copia. Está escrito para resumir. La próxima vez que encuentre el mismo problema, no tiene que verificarlo en todas partes.
Adjunte el código Base64Util:
1 import java.io.ByteArrayOutputStream; 2 import java.io.File; 3 import java.io.IOException; 4 import java.util.regex.Matcher; 5 import java.util.regex.Pattern; 6 6 7 import javax.imageio.stream.FileImageInputStream; 8 9 import sun.misc.BASE64Decoder; 10 import sun.misc.BASE64Encoder; 11 12 clase pública Base64Util { 13 / ** 14 * Cadena para representar 15 * @param base64Str 16 * @ retorno 17 * / 18 decodificación de byte estático público [] (String base64Str) { 19 bytes [] b = nulo; 20 decodificador BASE64Decoder = nuevo BASE64Decoder (); 21 prueba { 22 b = decoder.decodeBuffer (replaceEnter (base64Str)); 23} catch (IOException e) { 24 e.printStackTrace (); 25} 26 retorno b; 27} 28 29 / ** 30 * Imagen a cuerda 31 * @param imagen 32 * @ retorno 33 * / 34 codificación de cadena estática pública (byte [] imagen) { 35 Decodificador BASE64Encoder = nuevo BASE64Encoder (); 36 return replaceEnter (decoder.encode (imagen)); 37} 38 39 codificación pública de String estática (String uri) { 40 Codificador BASE64Encoder = nuevo BASE64Encoder (); 41 return replaceEnter (encoder.encode (uri.getBytes ())); 42} 43 44 / ** 45 * 46 * ruta de imagen @path 47 * @return 48 * / 49 50 byte estático público [] imageTobyte (ruta de cadena) { 51 bytes [] datos = nulo; 52 FileImageInputStream input = nulo; 53 probar { 54 input = nuevo FileImageInputStream (nuevo archivo (ruta)); 55 ByteArrayOutputStream salida = nuevo ByteArrayOutputStream (); 56 byte [] buf = nuevo byte [1024]; 57 int numBytesRead = 0; 58 while ((numBytesRead = input.read (buf))! = -1) { 59 output.write (buf, 0, numBytesRead); 60} 61 datos = output.toByteArray (); 62 output.close (); 63 input.close (); 64 65} catch (Excepción e) { 66 e.printStackTrace (); 67} 68 69 datos de retorno; 70} 71 72 73 74 Public static String replaceEnter (String str) { 75 String reg = "[\ n- \ r]"; 76 Patrón p = Pattern.compile (reg); 77 coincidencias m = p.matcher (str); 78 devuelven m.replaceAll (""); 79} 80 81 82}
En el trabajo, encontré la necesidad de obtener la base64 de la imagen a través de la URL de la imagen. Al principio, utilicé el método en línea a través de Toolkit. Aunque el código de implementación es relativamente corto, ocasionalmente encuentro la situación de que la imagen se convierte incorrectamente a base64 bit. No sé por qué.
Después de eso, me conecté en línea y busqué una manera de convertir el flujo binario de la imagen en base64. Ambos métodos son efectivos para la prueba profesional. De vez en cuando aparecen a través de Toolkit. Después de cambiar a base64, se muestra el problema de la visualización incompleta. Por lo tanto, se recomienda realizar la conversión descargando la conversión de flujo binario.
Adjunte el siguiente código:
import java.awt.image.BufferedImage; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import javax.imageio.ImageIO; import javax.swing.ImageIcon; import java.awt.Graphics; import java.awt.GraphicsConfiguration; import java.awt.GraphicsDevice; import java.awt.GraphicsEnvironment; import java.awt.HeadlessException; import java.awt.Image; import java.awt.Toolkit; import java.awt.Transparency; import java.net.HttpURLConnection; import java.net.URL; ImageUtils de clase pública { Cadena estática pública getBase64ByImgUrl (URL de cadena) { Sufijo de cadena = url.substring (url.lastIndexOf (".") + 1); tratar { URL URL = nueva URL (url); ByteArrayOutputStream baos = nuevo ByteArrayOutputStream (); Imagen imagen = Toolkit.getDefaultToolkit (). GetImage (urls); BufferedImage biOut = toBufferedImage (imagen); ImageIO.write (biOut, sufijo, baos); Cadena base64Str = Base64Util.encode (baos.toByteArray ()); volver base64Str; } catch (Excepción e) { regreso ""; } } Public BufferedImage toBufferedImage (Imagen de imagen) { if (image instanceof BufferedImage) { imagen de retorno (BufferedImage); } // Este código garantiza que se carguen todos los píxeles de la imagen. imagen = nueva ImageIcon (imagen) .getImage (); BufferedImage bimage = null; GraphicsEnvironment ge = GraphicsEnvironment .getLocalGraphicsEnvironment (); tratar { int transparencia = Transparencia.OPAQUE; GraphicsDevice gs = ge.getDefaultScreenDevice (); GraphicsConfiguration gc = gs.getDefaultConfiguration (); bimage = gc.createCompatibleImage (image.getWidth (null), image.getHeight (nulo), transparencia); } catch (HeadlessException e) { // El sistema no tiene pantalla } if (bimage == null) { // Crea una imagen almacenada usando el modelo de color predeterminado int type = BufferedImage.TYPE_INT_RGB; bimage = new BufferedImage (image.getWidth (null), image.getHeight (nulo), tipo); } // Copiar imagen a imagen almacenada Gráficos g = bimage.createGraphics (); // Pintar la imagen en la imagen almacenada g.drawImage (imagen, 0, 0, nulo); g.dispose (); bimage de retorno; } / ** * Obtenga la cadena base64 de la imagen a través de la url de la imagen * @param imgUrl url de imagen * @return devuelve la cadena de imagen base64 * / Cadena estática pública image2Base64 (String imgUrl) { URL url = nulo; InputStream es = nulo; ByteArrayOutputStream outStream = nulo; HttpURLConnection httpUrl = nulo; tratar{ url = nueva URL (imgUrl); httpUrl = (HttpURLConnection) url.openConnection (); httpUrl.connect (); httpUrl.getInputStream (); es = httpUrl.getInputStream (); outStream = nuevo ByteArrayOutputStream (); // Crear una cadena de búfer byte [] buffer = nuevo byte [1024]; // La longitud de la cadena leída cada vez, si es -1, significa que todo es leído int len = 0; // Use una secuencia de entrada para leer datos del búfer while ((len = is.read (buffer))! = -1) { // Use la secuencia de salida para escribir datos en el búfer, el parámetro del medio representa dónde comenzar a leer y len representa la duración de la lectura outStream.write (buffer, 0, len); } // Base64 que codifica la matriz de bytes return Base64Util.encode (outStream.toByteArray ()); } catch (Excepción e) { e.printStackTrace (); } finalmente{ if (es! = nulo) { tratar { está cerca(); } catch (IOException e) { e.printStackTrace (); } } if (outStream! = nulo) { tratar { outStream.close (); } catch (IOException e) { e.printStackTrace (); } } if (httpUrl! = nulo) { httpUrl.disconnect (); } } return imgUrl; } }
Donde
El método getBase64ByImgUrl se obtiene a través de Toolkit. En cuanto a por qué no hay comentarios, porque no entiendo el principio, lo copié.
El método image2Base64 es mediante la descarga de una secuencia binaria, que por supuesto se copia. Está escrito para resumir. La próxima vez que encuentre el mismo problema, no tiene que verificarlo en todas partes.
Adjunte el código Base64Util:
1 import java.io.ByteArrayOutputStream; 2 import java.io.File; 3 import java.io.IOException; 4 import java.util.regex.Matcher; 5 import java.util.regex.Pattern; 6 6 7 import javax.imageio.stream.FileImageInputStream; 8 9 import sun.misc.BASE64Decoder; 10 import sun.misc.BASE64Encoder; 11 12 clase pública Base64Util { 13 / ** 14 * Cadena para representar 15 * @param base64Str 16 * @ retorno 17 * / 18 decodificación de byte estático público [] (String base64Str) { 19 bytes [] b = nulo; 20 decodificador BASE64Decoder = nuevo BASE64Decoder (); 21 prueba { 22 b = decoder.decodeBuffer (replaceEnter (base64Str)); 23} catch (IOException e) { 24 e.printStackTrace (); 25} 26 retorno b; 27} 28 29 / ** 30 * Imagen a cuerda 31 * @param imagen 32 * @ retorno 33 * / 34 codificación de cadena estática pública (byte [] imagen) { 35 Decodificador BASE64Encoder = nuevo BASE64Encoder (); 36 return replaceEnter (decoder.encode (imagen)); 37} 38 39 codificación pública de String estática (String uri) { 40 Codificador BASE64Encoder = nuevo BASE64Encoder (); 41 return replaceEnter (encoder.encode (uri.getBytes ())); 42} 43 44 / ** 45 * 46 * ruta de imagen @path 47 * @return 48 * / 49 50 byte estático público [] imageTobyte (ruta de cadena) { 51 bytes [] datos = nulo; 52 FileImageInputStream input = nulo; 53 probar { 54 input = nuevo FileImageInputStream (nuevo archivo (ruta)); 55 ByteArrayOutputStream salida = nuevo ByteArrayOutputStream (); 56 byte [] buf = nuevo byte [1024]; 57 int numBytesRead = 0; 58 while ((numBytesRead = input.read (buf))! = -1) { 59 output.write (buf, 0, numBytesRead); 60} 61 datos = output.toByteArray (); 62 output.close (); 63 input.close (); 64 65} catch (Excepción e) { 66 e.printStackTrace (); 67} 68 69 datos de retorno; 70} 71 72 73 74 Public static String replaceEnter (String str) { 75 String reg = "[\ n- \ r]"; 76 Patrón p = Pattern.compile (reg); 77 coincidencias m = p.matcher (str); 78 devuelven m.replaceAll (""); 79} 80 81 82}