Este artículo describe la clase de herramienta de procesamiento de imágenes WeChat implementada por Java. Compártelo para su referencia, como sigue:
Ahora, hay menos imágenes y artículos afuera. Leí el código de copia pero no puedo usarlo. Utilizo el paquete JAR correspondiente para procesarlo, y muchos se escalan en proporción, lo que no puede cumplir con las expectativas que quiero: esta clase de herramientas es una clase basada en Java basada en RGB escrita en impresoras WeChat antes.
paquete com.zjpz.util; import java.awt.color; import java.awt.graphics; import java.awt.graphics2d; import java.awt.renderinghints; import java.awt.geom.affinetransform; import java.awt.image.bufferedimage; import java.awtattattattatt.colormage; java.awt.image.writableraster; import java.io.file; import java.io.ioException; import javax.imageio.imageio; import org.slf4j.logger; import org.slf4j.loggerFactory;/** * WeChat Image Process Tool * * @author Zhuang.y * */pública Classicureol {Protectureol { logger = loggerFactory.getLogger (pictureTool.class); public static void main (string [] args) lanza ioexception {fileone = new File ("c: //1.jpg"); BufferedImage imageFirst = imageIO.read (fileOne); int border = 0; ImageFirst = Crop (ImageFirst, 0,10,297,300); Archivo outFile = nuevo archivo ("d: //2.jpg"); ImageIO.Write (ImageFirst, "JPG", OutFile); // Escribir imagen}/ *** X Píxel de coordenada de imagen combinada vertical*/ Private final Static int y_width = 645; / *** El píxel de coordenadas y de la imagen estándar, 920, es una foto general, 1099 es una foto de sello*/ Private Final Static int y_height = 920; / *** Crop X coordina los píxeles andentados*/ Private Final Static int x_retract = 50; / *** Crop Y coordina los píxeles andentados*/ Private Final Static int y_retract = 50; / ** * El borde de imagen predeterminado del sistema es 20 */ Public final static int border = 20; / *** Imagen sintética horizontal*/ public static void xpic (string primero, string segundo, string out) {try {/* 1 lea la primera imagen*/ fileeNee = new File (primero); BufferedImage imageFirst = imageIO.read (fileOne); int width = imageFirst.getWidth (); // Image width int hight = imageFirst.getheight (); // Image Height int [] imagearrayFirst = new int [width * height]; // read rgb de la imagen imageArrayFirst = imageFirst.getRgb (0, 0, width, altura, imageArrayFirst, 0, width); /* 1 Haga lo mismo para la segunda imagen*/ archivo filetwo = nuevo archivo (segundo); BufferedImage ImageEcond = ImageIO.Read (fileTWO); int widthtwo = ImageEcond.getWidth (); // Image Width int highttwo = ImageEcond.getheight (); // Image Height int [] imagearRaysecond = new int [widthtwo * tighttwo]; imageRaysecond = ImageEcond.getRgb (0, 0, Widthtwo, HeightTwo, ImageReSeSecond, 0, widthtwo); int h = altura; if (altura <HeightTwo) {H = HeightTwo; } // Generar una nueva imagen BufferedImage ImageReSult = new BufferedImage (Width + WidthTwo, H, BufferedImage.Type_int_rgb); ImageResult.setRgb (0, 0, ancho, altura, ImageArrayFirst, 0, width); // establecer rgb imageresUlt.setRgb (ancho, 0, widthtwo, highttwo, imagearRaysecond, 0, widthtwo); // establecer el archivo de archivo rgb en la mitad correcta = nuevo archivo (out); ImageIO.Write (ImageSult, "JPG", OutFile); // Escribir una imagen} Catch (Exception e) {logger.error ("La imagen de síntesis horizontal fue error ...", e); }} / *** Imagen de síntesis vertical** @param primero* Pon la ruta de imagen arriba* @param segundo* Pon la ruta de imagen a continuación* @param out* Directorio de salida de archivo* @param borde* border reservado* / public static boolean ypic (String first, String Second, String Out, int border) {boolean ISOK = true; intente { /* 1 Lea la primera imagen* / file FileOne = nuevo archivo (primero); BufferedImage imageFirst = imageIO.read (fileOne); int width = imageFirst.getWidth (); // Image width int hight = imageFirst.getheight (); // imagen de imagen/* 2 Haga lo mismo para la segunda imagen*/ archivo filetwo = nuevo archivo (segundo); BufferedImage ImageEcond = ImageIO.Read (fileTWO); int widthtwo = ImageEcond.getWidth (); // Image Width int highttwo = ImageCond.getheight (); // Image Height/ * 1 Lea la primera imagen Begin */ int t_height = y_Height - Hightwo; // La imagen es una imagen horizontal, gire 90 grados en sentido antihorario y escala por igual si (ancho> altura) {imageFirst = rotateImageleft90 (ImageFirst); } // escalado igual imageFirst = resize (imageFirst, y_width, t_height); // tamaño de la imagen después del ancho de escala = imageFirst.getWidth (); // Image Width Height = ImageFirst.getheight (); // La altura de la imagen // Después de la escala de radica igual, la imagen aún es demasiado grande. Recortar la imagen boolean a_w, a_h = false; if ((a_w = (width> y_width)) || (a_h = (altura> t_height))) {// iniciar posición x, y coordinar int s_w = 0, s_h = 0; // Al recortar las coordenadas X, el atributo de sangría x_retract if (a_w) {int temp = width - y_width; if (temp> x_retract) {temp = x_retract; } else {temp = 0; } s_w = s_w + temp; } // Al recortar coordenadas y, el atributo de sangría y_retract if (a_h) {int temp = height - t_height; if (temp> y_retract) {temp = y_retract; } else {temp = 0; } s_h = s_h + temp; } ImageFirst = Crop (ImageFirst, S_W, S_H, Y_WIDTH, T_HEight); ancho = imageFirst.getWidth (); altura = imageFirst.getheight (); } int [] imagearrayFirst = new int [(width - border) * altura]; // leer rgb imagearrayfirst = imageFirst.getRgb (borde, 0, (ancho - borde), altura, imagearReAnfirst, 0, (ancho - borde)); / * 2DO El mismo proceso para la segunda imagen Begin */ int [] imagearRaysecond = new int [widthtwo * highttwo]; imageRaysecond = ImageEcond.getRgb (0, 0, Widthtwo, HeightTwo, ImageReSeSecond, 0, widthtwo); int w = ancho; if (width <widthtwo) {w = widthtwo; } // altura de imagen int h = altura + alturaTwo; // Generar una nueva imagen BufferedImage ImageReSult = new BufferedImage (W, H, BufferedImage.Type_int_Rgb); // Resuelve el fondo negro, el tipo de tipo_int_rgb predeterminado es todo 0, y todos son negros Graphics2d G = (Graphics2D) ImageResult.CreateGraphics (); G.SetColor (color.white); G.Fillrect (0, 0, W, H); // llenar toda la pantalla g.dispose (); // deja el borde de imageresult.setrgb (borde, 0, (ancho - borde * 2), altura, imagearrayFirst, 0, (ancho - borde)); // establece rgb en la mitad izquierda imageSult.setrgb (0, altura, widthtwo, altura de altura, imageRearraSecond, 0, widthtwo); // set rgb en la mitad de la derecha de la derecha de la derecha de la derecha. Archivo (out); ImageIO.Write (ImageSult, "JPG", OutFile); // Escribir una imagen} Catch (Exception e) {logger.error ("Falló la imagen de síntesis perpendicular ...", e); isok = falso; } return isok; } / *** Impresión de imagen completa, escala de imagen y procesamiento de rotación*** @param fuente* Imagen pendiente de procesamiento* @param out* Directorio de salida de archivo después de procesar* @param Border* Bordamiento reservado de imagen* / Public Static Boolean Maigaope (String Source, String Out, Int Border) {boolean isok = true; Pruebe { /* 1 Lea la primera imagen* / file FileOne = new File (fuente); BufferedImage imageFirst = imageIO.read (fileOne); int width = imageFirst.getWidth (); // Image width int hight = imageFirst.getheight (); // imagen de imagen // La imagen es una imagen horizontal, gira 90 grados en sentido antihorario y escala igualmente si (ancho> altura) {imageFirst = rotateImageleft90 (imageFirst); } // Escalado de igualdad ImageFirst = RESEZE (ImageFirst, Y_Width, Y_Height); // tamaño de la imagen después del ancho de escala = imageFirst.getWidth (); // Image Width Height = ImageFirst.getheight (); // La altura de la imagen // Después de la escala de igualdad, la imagen aún es demasiado grande. Recortar la imagen boolean a_w, a_h = false; if ((a_w = (width> y_width)) || (a_h = (altura> y_height))) {// iniciar posición x, y coordinar int s_w = 0, s_h = 0; // Al recortar las coordenadas X, el atributo de sangría x_retract if (a_w) {int temp = width - y_width; if (temp> x_retract) {temp = x_retract; } else {temp = 0; } s_w = s_w + temp; } // Al recortar coordenadas y, el atributo de sangría y_retract if (a_h) {int temp = height - y_height; if (temp> y_retract) {temp = y_retract; } else {temp = 0; } s_h = s_h + temp; } ImageFirst = Crop (ImageFirst, S_W, S_H, Y_WIDTH, Y_HEight); ancho = imageFirst.getWidth (); altura = imageFirst.getheight (); } int [] imagearrayFirst = new int [(ancho - borde) * altura]; // leer rgb de la imagen imageArrayFirst = imageFirst.getrgb (borde, 0, (ancho - borde), altura, imagearReAnfirst, 0, (ancho - borde)); // Generar una nueva imagen BufferedImage ImageReSult = new BufferedImage (ancho, altura, bufferedimage.type_int_rgb); // Resuelve el fondo negro, el tipo de tipo_int_rgb predeterminado es todo 0, y todos son negros Graphics2d G = (Graphics2D) ImageResult.CreateGraphics (); G.SetColor (color.white); G.Fillrect (0, 0, ancho, altura); // llenar toda la pantalla g.dispose (); // deja el borde imageResult.setRgb (borde, 0, (ancho - borde * 2), altura, imagearrayFirst, 0, (ancho - borde)); // establece el archivo de archivo rgb en la mitad izquierda = nuevo archivo (out); ImageIO.Write (ImageSult, "JPG", OutFile); // Escribir una imagen} Catch (IOException e) {logger.error ("Impresión completa de imagen, escala de imagen y procesamiento de rotación falló ...", e); isok = falso; } return isok; }/ ** * Implemente el zoom de radio igual de la imagen * * @param Fuente * El flujo de imagen para ser procesado * @param TargetW * ancho * @param Targeth * altura * @return */ public static BufferedImage Resiize (bufferedImage Source, int Targetw, int Zoominimage (fuente, TargetW, Targeth); // El ancho y la altura de la imagen son demasiado pequeños, la fuerza amplía la imagen/* if (ancho <targetw && altura <Targeth) {return zoomInImage (fuente, Targetw, Targeth); } else if ((width <targetw && width == altura) || (altura <Targeth && width == altura)) {return zoomInImage (fuente, targetw, Targeth); } return null; */}/ ** * recorte la imagen a escala * * @param fuente * transmisión de imagen pendiente * @param startx * start x coordinate * @param starty * start y coordinate * @param endx * end x coordenate * @param endy * coordenate * @return */ public static bufferedImage Crop (bufferedimage fuente, int inicio, int inicio, intd intodx, int end end end) {@return */ public Buffered. fuente.getWidth (); int hight = Source.getheight (); if (startx <= -1) {startx = 0; } if (starty <= -1) {starty = 0; } if (endx <= -1) {endx = width - 1; } if (endy <= -1) {endy = altura - 1; } Resultado de BufferedImage = new BufferedImage (endx, endy, fuente.gettype ()); for (int y = starty; y <endy+starty; y ++) {for (int x = startx; x <endx+startx; x ++) {int rgb = fuente.getRgb (x, y); result.setRGB (x - startx, y - starty, rgb); }} Resultado de retorno; } / ** * Gire la imagen al ángulo especificado * * @param BufferedImage * Imagen de destino * @param grado * Gire el ángulo * @return * / public static BufferedImage RotateImage (BufferedImage final BufferedImage, inticultor final) {int w = bufferedimage.getWidth (); int h = bufferedImage.getheight (); int type = bufferedImage.getColormodel (). getTransparency (); Bufferedimage img; Graphics2D Graphics2d; (Graphics2d = (img = new BufferedImage (H, W, Type)). CreateGraphics ()). SetRenderingHint (renderinghints.key_interpolation, renderinghints.value_interpolation_bilineal); Graphics2d.rotate (matemáticas. Toradianos (grado), W / 2, H / 2 + (W> H? (W - H) / 2: (H - W) / 2)); Graphics2d.DrawImage (BufferedImage, 0, 0, NULL); Graphics2d.Dispose (); devolver img; } / ** * La imagen gira a la izquierda 90 grados * * @param BufferedImage * @return * / public static BufferedImage RotateImageleft90 (BufferedImage BufferedImage) {int w = bufferedimage.getWidth (); int h = bufferedImage.getheight (); int type = bufferedImage.getColormodel (). getTransparency (); Bufferedimage img; Graphics2D Graphics2d; (Graphics2d = (img = new BufferedImage (H, W, Type)). CreateGraphics ()). SetRenderingHint (renderinghints.key_interpolation, renderinghints.value_interpolation_bilineal); Graphics2d.rotate (Math.Toradians (270), w / 2, H / 2 + (W - H) / 2); Graphics2d.DrawImage (BufferedImage, 0, 0, NULL); Graphics2d.Dispose (); devolver img; } / ** * La imagen gira a la derecha 90 grados * * @param bufferedImage * @return * / public static bufferedImage RotateImageright90 (BufferedImage BufferedImage) {int w = bufferedimage.getWidth (); int h = bufferedImage.getheight (); int type = bufferedImage.getColormodel (). getTransparency (); Bufferedimage img; Graphics2D Graphics2d; (Graphics2d = (img = new BufferedImage (H, W, Type)). CreateGraphics ()). SetRenderingHint (renderinghints.key_interpolation, renderinghints.value_interpolation_bilineal); Graphics2d.rotate (math.toradians (90), w / 2 - (w - h) / 2, h / 2); Graphics2d.DrawImage (BufferedImage, 0, 0, NULL); Graphics2d.Dispose (); devolver img; } // Reenviar el archivo público ROTateImageOppo (archivo de archivo) lanza la excepción {BufferedImage BufferedImage = ImageIO.Read (archivo); int w = bufferedImage.getWidth (); int h = bufferedImage.getheight (); int type = bufferedImage.getColormodel (). getTransparency (); Bufferedimage img; Graphics2D Graphics2d; (Graphics2d = (img = new BufferedImage (W, H, type)). CreateGraphics ()). SetRenderingHint (renderinghints.key_interpolation, renderinghints.value_interpolation_bilineal); Graphics2d.rotate (Math.toradians (180), w / 2, h / 2); Graphics2d.DrawImage (BufferedImage, 0, 0, NULL); Graphics2d.Dispose (); Imageio.write (img, "jpg", archivo); Revolver archivo; } / *** * Procesamiento de reflejo de imagen * * @param archivo * @param fx * 0 es la inversión arriba y abajo de la inversión 1 es la inversión de izquierda y derecha * @return * / public void imagemisro (archivo de archivo, int fx) {try {bufferedeMage bufferedimage = image.read (archivo); int w = bufferedImage.getWidth (); int h = bufferedImage.getheight (); int [] [] datas = new int [w] [h]; for (int i = 0; i <h; i ++) {for (int j = 0; j <w; j ++) {data [j] [i] = bufferedImage.getRgb (j, i); }} int [] [] tmps = new int [w] [h]; if (fx == 0) {for (int i = 0, a = h-1; i <h; i ++, a--) {for (int j = 0; j <w; j ++) {tmps [j] [a] = dataS [j] [i]; }}} else if (fx == 1) {for (int i = 0; i <h; i ++) {for (int j = 0, b = w-1; j <w; j ++, b--) {tmps [b] [i] = dataS [j] [i]; }}} para (int i = 0; i <h; i ++) {for (int j = 0; j <w; j ++) {bufferedImage.setRgb (j, i, tmps [j] [i]); }} ImageIO.Write (BufferedImage, "jpg", archivo); } catch (Exception e) {E.PrintStackTrace (); }} / ** * La fuerza se acerca o sale de la imagen * * @param OriginalImage * OriginalImage * @return * / public static BufferedImage Zoominimage (BufferedImage) OriginalImage, int Ancho, int Height) {BufferedImage NewImage = New BufferedImage (Width, altura, OriginalImage.getType ()); Gráficos g = newimage.getGraphics (); G.DrawImage (OriginalImage, 0, 0, ancho, altura, nulo); G.Dispose (); devolver newimage; } / *** Principio de reconocimiento de imagen simple** @param img* ruta de imagen* / public static void discernimg (string img) {try {fileeNeOne = new File (img); BufferedImage bi = imageIO.read (fileOne); // Obtener el ancho y la altura de la imagen int width = bi.getWidth (); int altura = bi.getheight (); // Escanear la imagen para (int i = 0; i <altura; i ++) {for (int j = 0; j <width; j ++) {// fila scan int dip = bi.getrgb (j, i); if (dip == -1) System.out.print (""); else System.out.print ("♦"); } System.out.println (); // break de línea}} catch (excepción e) {logger.error ("error de reconocimiento de imagen", e); }}}Para obtener más contenido relacionado con Java, los lectores interesados en este sitio pueden ver los temas: "Resumen de habilidades de operación de imagen Java", "Resumen de habilidades de operación de fecha y hora de Java", "Resumen de las habilidades de nodo de operación de Java" "," Resumen de las habilidades de operación de archivos y directorio de Java "y" Tutoriales de estructura de datos de Java y algoritmo ".". ".". ".". ".". ".". ".". ".". ".". ".". ".". ".". ".". ".". ".". ".". ".". ".". ".". ".". ".". ".". ".". ".". ".". ".". ".". ".". ".". ".". ".". ".". ".". ".". ".". ".". ".". ".". ".". ".". ".". ".". ".". ".". ".
Espero que este artículo sea útil para la programación Java de todos.