В этой статье описывается класс инструмента обработки изображений WeChat, реализованный Java. Поделитесь этим для вашей ссылки, следующим образом:
Теперь на улице меньше фотографий и статей. Я читаю код копии, но не могу его использовать. Я использую соответствующий пакет JAR для его обработки, и многие из них масштабируются по пропорции, что не может соответствовать ожиданиям, которые я хочу: этот класс инструментов - это класс, основанный на Java, основанной на RGB, написанной на Wechat Printers ранее.
пакет com.zjpz.util; import java.awt.color; import java.awt.graphics; импорт java.awt.graphics2d; импорт java.awt.renderinghints; импорт java.awt.geom.affineTransform; импорт java.awt.image.iMage.Mairmage. java.awt.image.writableraster; import java.io.file; import java.io.ioexception; import javax.imageio.imageio; импорт org.slf4j.logger; импорт org.slf4j.loggerfactory;/** * wechat straicing strage strage logger = loggerFactory.getLogger (pictUretool.class); public static void main (string [] args) бросает ioException {file fileOne = new File ("c: //1.jpg"); BufferedImage ImageFirst = imageIo.read (fileOne); int border = 0; ImageFirst = Crop (ImageFirst, 0,10,297 300); File outfile = new File ("d: //2.jpg"); Imageio.Write (ImageFirst, "jpg", Outfile); // Написать изображение}/ *** x координата пикселя вертикального комбинированного изображения*/ Приватный окончательный статический int y_width = 645; / *** Координатный пиксель y Standard Picture, 920, является общей фотографией, 1099 - это малочная фотография*/ private final Static int y_height = 920; / *** CRPUT x Координаты с отступаемыми пикселями*/ private final Static int x_retract = 50; / *** CROM Y координаты с отступом пиксели*/ private final Static int y_retract = 50; / ** * Системная граница изображения по умолчанию составляет 20 */ public final Static int border = 20; / *** Горизонтальное синтетическое изображение*/ public static void xpic (строка сначала, строка второй, строка) {try {/* 1 Прочтите первое изображение*/ fileOne = new File (First); BufferedImage ImageFirst = imageIo.read (fileOne); int width = imagefirst.getWidth (); // Ширина изображения int height = imagefirst.getheight (); // Высота изображения int [] ImageArrayFirst = new int [ширина * высота]; // Читать rgb из изображения ImagearrayFirst = imagefirst.getrgb (0, 0, width, height, imagearrayfirst, 0, witsthth, 0, witsthth, 0, witsthth, witsthth, witsthth, with, with, with, with, with -with, withfirst.getrgb. /* 1 сделайте то же самое для второго изображения*/ file filetwo = new File (Second); BufferedImage ImageSecond = imageio.read (filetwo); int widthtwo = imageerecond.getwidth (); // ширина изображения int heighttwo = imageecond.getheight (); // Высота изображения int [] ImageArraysecond = new int [widthtwo * heighttwo]; ImageArraySecond = imageEcond.getRgb (0, 0, widthtwo, heighttwo, imagearraysecond, 0, widthtwo); int h = высота; if (height <heighttwo) {h = heighttwo; } // Сгенерировать новое изображение BufferedImage ImagerEsult = new BufferedImage (ширина + widthtwo, h, bufferedimage.type_int_rgb); Imageresult.setrgb (0, 0, ширина, высота, ImagearrayFirst, 0, width); // set rgb Imageresult.setrgb (ширина, 0, ширина, высота, ImageEarraySecond, 0, widthtwo); // set rgb -файл в правой половине = new file (out); Imageio.Write (ImagerESult, "jpg", Outfile); // Написать изображение} catch (Exception e) {logger.error ("Горизонтальное синтез изображение было ошибкой ...", e); }} / *** Изображение вертикального синтеза** @param Сначала* Поместите путь к изображению выше* @param второй* Поместите путь к изображению ниже* @param out* hilectory file* @param граница* Зарезервированная граница* / public static boolean ypic (строка сначала, строка вторая, строка, int border) {boolean isok = true; try { /* 1 Прочитайте первое изображение* / file fileOne = new File (первое); BufferedImage ImageFirst = imageIo.read (fileOne); int width = imagefirst.getWidth (); // Ширина изображения int height = imagefirst.getheight (); // Высота изображения/* 2 Сделайте то же самое для второго изображения*/ file filetwo = new File (Second); BufferedImage ImageSecond = imageio.read (filetwo); int widthtwo = imageerecond.getwidth (); // ширина изображения int heighttwo = imageecond.getheight (); // Высота изображения/ * 1 Читать первое изображение начало */ int t_height = y_height - heighttwo; // изображение представляет собой горизонтальное изображение, повернуть на 90 градусов против часовой стрелки и в равной степени, если (ширина> высота) {imagefirst = rotateimageleft90 (imagefirst); } // Равное масштабирование изображения first = resize (imagefirst, y_width, t_height); // Размер изображения после масштабирования width = imagefirst.getWidth (); // Высота ширины изображения = изображение .first.getheight (); // Высота изображения // После равного радикального масштабирования изображение все еще слишком большое. Обрезать изображение логическое значение a_w, a_h = false; if ((a_w = (ширина> y_width)) || (a_h = (height> t_height))) {// начальная позиция x, y координата int s_w = 0, s_h = 0; // При координатах x обрезка x атрибут 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; } // При координатах y обрезка y, атрибут отступления 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_HEITH); width = imagefirst.getWidth (); высота = imagefirst.getheight (); } int [] ImageArrayFirst = new int [(ширина - граница) * Высота]; // Читать rgb ImageArrayFirst = ImageFirst.getrgb (граница, 0, (ширина - граница), высота, ImagearrayFirst, 0, (ширина - граница)); / * 2do Тот же процесс для второго изображения начинается */ int [] imagearraysecond = new int [widthtwo * heighttwo]; ImageArraySecond = imageEcond.getRgb (0, 0, widthtwo, heighttwo, imagearraysecond, 0, widthtwo); int w = ширина; if (width <widthtwo) {w = widthtwo; } // Высота изображения int h = высота + heighttwo; // генерировать новое изображение BufferedImage ImagerEsult = new BufferedImage (W, H, BuffereMage.type_int_rgb); // Решение черного фона, все по умолчанию type_int_rgb - все 0, и все они являются черной графикой 2d g = (Graphics2d) Imageresult.creategraphics (); g.setcolor (color.white); G.FillRect (0, 0, W, H); // заполнить весь экран g.dispose (); // Оставьте пограничный Imageresult.setrgb (граница, 0, (ширина - граница * 2), высота, ImagearrayFirst, 0, (ширина - граница)); // Установить RGB в левой половине ImagerEsult.setrgb (0, высота, ширина, высота, ImagearRaysecond, 0, WildthTwo); Файл (Out); Imageio.Write (ImagerESult, "jpg", Outfile); // Написать изображение} catch (Exception e) {logger.error ("Перпендикулярное изображение синтеза не удалось ...", e); isok = false; } вернуть isok; } / *** Полная печать изображения, масштабирование изображений и обработка вращения*** @param источник* Изображение. Обработка* @param out* Управляемый каталог файла после обработки* @param border* Зарезервированная граница* / public static boolean maigaopic (String Source, String Out, int isok isok = true; try { /* 1 Прочитайте первое изображение* / file fileOne = new File (Source); BufferedImage ImageFirst = imageIo.read (fileOne); int width = imagefirst.getwidth (); // ширина изображения int height = imagefirst.getheight (); // Высота изображения // изображение представляет собой горизонтальное изображение, повернуть на 90 градусов против часовой стрелки и одинаково, если (ширина> высота) {imagefirst = rowateimageleft90 (imagefirst); } // Равенство масштабирование ImageFirst = resize (ImageFirst, y_width, y_height); // Размер изображения после масштабирования ширины = ImageFirst.getWidth (); // Высота ширины изображения = ImageFirst.getheight (); // Высота изображения // После масштабирования равенства изображение все еще слишком большое. Обрезать изображение логическое значение a_w, a_h = false; if ((a_w = (ширина> y_width)) || (a_h = (высота> y_height))) {// начальная позиция x, y координата int s_w = 0, s_h = 0; // При координатах x обрезка x атрибут 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; } // При координатах y обрезка y атрибут 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_HEITH); width = imagefirst.getWidth (); высота = imagefirst.getheight (); } int [] ImageArrayFirst = new int [(ширина - граница) * Высота]; // Читать RGB из изображения ImageArrayFirst = ImageFirst.getRgb (граница, 0, (ширина - граница), высота, ImageArrayFirst, 0, (ширина - граница)); // генерировать новое изображение BufferedImage ImagerEsult = new BufferedImage (ширина, высота, bufferemage.type_int_rgb); // Решение черного фона, все по умолчанию type_int_rgb - все 0, и все они являются черной графикой 2d g = (Graphics2d) Imageresult.creategraphics (); g.setcolor (color.white); G.FillRect (0, 0, ширина, высота); // заполнить весь экран g.dispose (); // Оставьте пограничный Imageresult.setrgb (граница, 0, (ширина - граница * 2), высота, imagearrayfirst, 0, (ширина - граница)); // Установить rgb -файл outfile в левой половине = новый файл (out); Imageio.Write (ImagerESult, "jpg", Outfile); // Написать изображение} catch (ioException e) {logger.error ("Полная печать изображения, масштабирование изображения и обработка вращения ошибочно ...", e); isok = false; } вернуть isok; }/ ** * Реализуйте равный радио-увеличение изображения * * @param источник * Поток изображения, который будет обрабатываться * @param targetw * width * @param targeth * height * @return */ public static bufferedimage resize (bufferedimage source, int targetw, int targeth) {int width = sourcewidth ();// with with и hight withlight (/ return withlet (// return witchight (// return witchight (// return-withight (// return-letright (// return-letright); Zoominimage (Source, TargetW, Targeth); // Ширина и высота изображения слишком мала, увеличивает принудительное изображение/* if (width <targetw && histe <targeth) {return Zoominimage (Source, TargetW, Targeth); } else if ((width <targetw && width == height) || (высота <targeth && width == height)) {return Zoominimage (source, targetw, targeth); } return null; */}/ ** * Размещайте изображение, чтобы масштабировать * * @param source * string stream * @param startx * start x координата * @param starty * start y координата * @param endx * end x координата * @param endy * end y координата * @return */ public static bufferemage (источник Bufferemage, int startx, int endx, int endty) indy) Source.getWidth (); int height = source.getheight (); if (startx <= -1) {startx = 0; } if (starty <= -1) {starty = 0; } if (endx <= -1) {endx = width - 1; } if (endy <= -1) {endy = height - 1; } BufferedImage result = new BufferedImage (endx, endy, source.getType ()); for (int y = starty; y <endy+starty; y ++) {for (int x = startx; x <endx+startx; x ++) {int rgb = source.getrgb (x, y); result.setrgb (x - startx, y - starty, rgb); }} return result; } / ** * Поверните изображение к указанному углу * * @param bufferedimage * Целевое изображение * @param степень * Поверните угол * @return * / public static bufferemage rowateimage (окончательный буферизатор BufferedImage, final int destre) {int w = bufferemage.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_bilinear); graphics2d.Rotate (math.toradians (степень), w / 2, h / 2 + (w> h? (w - h) / 2: (h - w) / 2)); Graphics2d.drawimage (BufferedImage, 0, 0, NULL); graphics2d.dispose (); вернуть IMG; } / ** * Изображение поворачивается влево на 90 градусов * * @param bufferedimage * @return * / public static bufferedimage rotateimageleft90 (bufferedimage bufferedimage) {int w = bufferemage.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_bilinear); Graphics2d.Rotate (Math.Toradians (270), W / 2, H / 2 + (W - H) / 2); Graphics2d.drawimage (BufferedImage, 0, 0, NULL); graphics2d.dispose (); вернуть IMG; } / ** * Изображение поворачивается вправо 90 градусов * * @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_bilinear); Graphics2d.Rotate (Math.Toradians (90), W / 2 - (W - H) / 2, H / 2); Graphics2d.drawimage (BufferedImage, 0, 0, NULL); graphics2d.dispose (); вернуть IMG; } // Переварие открытого файла rotateimageoppo (файл файл), бросает исключение {bufferemage bufferedimage = imageio.read (file); 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_bilinear); Graphics2d.Rotate (Math.Toradians (180), W / 2, H / 2); Graphics2d.drawimage (BufferedImage, 0, 0, NULL); graphics2d.dispose (); Imageio.write (img, "jpg", файл); вернуть файл; } / *** * Обработка зеркального изображения * * @param file * @param fx * 0 - инверсия вверх и вниз 1 - левая и правая инверсия * @return * / public void imagemisro (файл файла, int fx) {try {bufferemage bufferemage = imageio.read (файл); 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 ++) {datas [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]; }}} for (int i = 0; i <h; i ++) {for (int j = 0; j <w; j ++) {buferedimage.setrgb (j, i, tmps [j] [i]); }} Imageio.write (BufferedImage, "jpg", file); } catch (Exception e) {e.printstackTrace (); }} / ** * Принудительное увеличение или из изображения * * @param OriginalImage * OriginalImage * @return * / public Static BufferedImage Zoominimage (BuffereMage) OriginalImage, int Width, int Height) {BufferedImage newimage = new BuffereMage (ширина, высота, оригинальный gettype ()); Graphics g = newimage.getGraphics (); g.drawimage (OriginalImage, 0, 0, ширина, высота, нулевая); g.dispose (); вернуть Newimage; } / *** Простой принцип распознавания изображений** @param img* path* / public static void discernimg (string img) {try {file fileOne = new File (img); BufferedImage bi = imageio.read (fileOne); // Получить ширину и высоту изображения int width = bi.getwidth (); int height = bi.getheight (); // сканировать изображение для (int i = 0; i <height; i ++) {for (int j = 0; j <ширина; j ++) {// scan scan int dip = bi.getrgb (j, i); if (dip == -1) System.out.print ("" "); else System.out.print ("♦"); } System.out.println (); // Line Break}} Catch (Exception e) {logger.error ("ошибка распознавания изображения", e); }}}Для получения большего количества контента, связанного с Java, читатели, которые заинтересованы в этом сайте, могут просмотреть темы: «Сводка навыков операции на изображении Java», «Краткое изложение навыков даты и времени работы на джаве», «Сводка навыков операции Java DOM Node», «Сводка файлов Java и навыки операции по каталогам» и «Учебные пособия по структуре данных Java и алгоритм».
Я надеюсь, что эта статья будет полезна для всех Java Programming.