Recientemente, necesito procesamiento de compresión de imágenes para hacer proyectos. La mayoría de los métodos que busqué en línea usan la clase jpegimageEncoder en el paquete com.sun.image.codec.jpeg.*. Después de introducir este paquete, he reportado errores. Varios Google Baidu han probado varios métodos, incluido manualmente RT.jar en JRE, y cambiando las indicaciones de API restringidas de acceso desde el error al advertencia en Eclipse, etc. Sin embargo, estos no son buenos, porque más tarde descubrí que no hay com.sun.image.* En Rt.jar en Java-7-openjdk-amd64. Parece que esta clase se ha eliminado por completo en Java7, al menos no tengo versión. Luego busqué una solución alternativa para usar la clase ImageIO para el procesamiento, el código es el siguiente:
Se puede comprimir a cualquier tamaño, alta definición después de la compresión, sin deformación (espacio en blanco), el nombre del sufijo se puede cambiar y la resolución de compresión se puede modificar.
Tal vez algunos amigos también necesitan esto. Consulte ello. Si tiene alguna pregunta, ¡por favor dame alguna evidencia!
paquete cn.com.images; import java.awt.graphics; import java.awt.image; import java.awt.image.bufferedImage; import java.io.file; import java.io.ioException; import java.math.bigdecimal; import java.math.mathContext; import java.util.arrayList; import javax.imageio.imageio; /*** * Operación en imágenes * * @author chenzheng_java * @since 2011/7/29 * */public class ImageHelper {private static imageHelper imageHelper = null; public static imageHelper getImageHelper () {if (imageHelper == null) {imageHelper = new imageHelper (); } return imageHelper; } / *** * Escala la imagen a la escala especificada * * @param SourceImagePath * Dirección de origen * @param DestinationPath * de la imagen después de cambiar la escala de tamaño * @param * escala *, como 1.2 * / public static void scaleImage (String SourceImagePath, cadena de destino, doble escala, formato de cadena) {Archivo de archivo = nuevo archivo (SourceImagePath); BufferedImage BufferedImage; intente {bufferedImage = imageIO.read (archivo); int width = bufferedImage.getWidth (); int hight = bufferedImage.getheight (); ancho = parsedobletoint (escala de ancho *); altura = parsedobletoint (escala de altura *); Imagen imagen = bufferedImage.getScaledInstance (ancho, altura, image.scale_smooth); BufferedImage outputImage = new BufferedImage (ancho, altura, bufferedimage.type_int_rgb); Graphics Graphics = OutputImage.getGraphics (); Graphics.DrawImage (imagen, 0, 0, nulo); Graphics.Dispose (); ImageIO.Write (salida, formato, nuevo archivo (DestinationPath)); } catch (ioException e) {System.out.println ("El error ocurrió al comprimir la imagen"); E.PrintStackTrace (); }} / **** Escala la imagen a la altura o ancho especificado* @param SourceImagePath Dirección de fuente de imagen* @param DestinationPath de la imagen después de comprimir la imagen* @param ancho de ancho ancho* @param altura escala altura* @param automático para mantener automáticamente la altura original y la relación de ancho de la imagen* @param format format format como jpg* / pública estatic void void (voids (void de staticpars (void de statatwhar (scalmage (scalmage (scalmage (Valomage (statmage (static SourceImagePath, String DestinationPath, Int Width, Int Height, Boolean Auto, Format de cadena) {try {file file = new File (SourceImagePath); BufferedImage BufferedImage = NULL; bufferedimage = imageIO.read (archivo); if (auto) {ArrayList <Integer> paramsArrayList = getAUTOWIdThandHeight (BufferedImage, ancho, altura); width = paramsArrayList.get (0); altura = paramsArrayList.get (1); System.out.println ("Auto-Adjust the Scale, Width ="+Width+"SCALEIMAGEWITHPARAMS Método errado al comprimir imágenes"); E.PrintStackTrace (); }} / ** * Convierta datos de doble tipo a int, principio de redondeo * * @param SourceDouble * @return * / private static int resultado = (int) SourCedOuble; resultado de retorno; } / ***** @param BufferedImage El objeto de imagen se escalará* @param width_scale ancho a escala a* @param Height_scale Height a escala a escala a* @return una colección, el primer elemento es ancho y el segundo elemento es la altura* / private Static ArrayList <Integer> getAutowidThandHeight (bufferedimage Bufferedimage, int widh_scale. ArrayList <Integer> ArrayList = new ArrayList <Integer> (); int width = bufferedImage.getWidth (); int hight = bufferedImage.getheight (); Double scale_w = getDot2Decimal (width_scale, width); System.out.println ("getAutowidThandHeightScale_W ="+scale_w); doble escala_h = getDot2Decimal (altura_scale, altura); if (scale_w <scale_h) {arrayList.Add (parsedoubbleToint (scale_w*width)); ArrayList.Add (parsedoubletoint (escala_w*altura)); } else {arrayList.Add (parsedoubletoint (scale_h*width)); arrayList.Add (parsedoubletoint (escala_h*altura)); } return ArrayList; }/*** * Devuelve la representación de los tres puntos decimales de los dos números A/B * @param a * @param b * @return */public static double getDot2Decimal (int a, int b) {bigDecimal bigDecimal_1 = new BigDecimal (a); BigDecimal bigDecimal_2 = new BigDecimal (b); BigDecimal bigDecimal_result = bigDecimal_1.Divide (bigDecimal_2, new MathContext (4)); Double double1 = new Double (BigDecimal_Result.ToString ()); System.out.println ("El doble después de la división es:"+double1); devolver doble1; }}