- 浏览: 3525 次
文章分类
最新评论
几个java的图片方法
之前学校有个图片处理研究性学习,正好学了java高级,自己找了些资料写了几个图像处理的方法,在这里分享给大家
1、获取指定路径的图片
/** * 读取指定路径的图片 * * @param path * 图片路径 * @return 缓冲图片 */ public static BufferedImage readPicture(String path) { try { // 使用Io流读取指定路径的图片将其存入图片流 抛出 FuleNotFoundException 以及IoException BufferedImage image = ImageIO.read(new FileInputStream(path)); bImage = image; System.out.println("图片读取成功"); } catch (FileNotFoundException e) { System.out.println("没有找到指定的图片"); } catch (IOException e) { System.out.println(e.getMessage()); } return bImage; }
2、读取网络图片
/** * 读取网络图片 * * @param url * 地址 * @return 缓冲图片 */ public static BufferedImage readWebImage(String url) { BufferedImage bf = null; HttpURLConnection conn; InputStream inStream = null; // 以流的方式获取网络数据 try { URL u = new URL(url); conn = (HttpURLConnection) u.openConnection(); // 设置请求方式为"GET" conn.setRequestMethod("GET"); // 超时响应时间为5秒 conn.setConnectTimeout(5 * 1000); // 通过输入流获取图片数据 inStream = conn.getInputStream(); bf = ImageIO.read(inStream); } catch (Exception e) { e.printStackTrace(); return null; } finally { // 关闭输入流释放连接 if (inStream != null) { try { inStream.close(); } catch (IOException e) { e.printStackTrace(); } } conn = null; } return bf; }
3、使用BufferedImage创建一张图片
/** * 使用图片流创建一张图片 * * @param bf * 图片流 * @param path * 路径 * @param name * 文件名 * @param format * 格式 */ public static void creatPicture(BufferedImage bf, String path, String name, String format) { try { // 新建文件 File file = new File(path + "/" + name + "." + format); // 通过图片io流将图片写入file文件 ImageIO.write(bf, format, file); System.out.println("图片创建成功,保存在" + path + "/" + name + "目录下"); } catch (Exception e) { e.printStackTrace(); System.out.println("创建失败"); } }
4、获取色差,即颜色在直方图中的距离
/** * 获取两个颜色的距离 * * @param r1 * 颜色1 * @param r2 * 颜色2 * @return 颜色距 */ public static float getDistance(RGB r1, RGB r2) { // 结果 float result = 0; // 使用空间两点间距离公式求解颜色距离 result = (float) Math.sqrt(Math.pow(r1.getRed() - r2.getRed(), 2) + Math.pow(r1.getGreen() - r2.getGreen(), 2) + Math.pow(r1.getBlue() - r2.getBlue(), 2)); return result; }
5、将一张彩色图片转换为灰度图
/** * 全灰度图转换 * * @param path * 图片路径 * @param type * 0:hsv取亮度 1:RGB取平均值 2:移位算法 3。取红色 4。 取绿色 5.取蓝色 其他:RGB心理算法 * @param threshold * 误差 */ public static BufferedImage changeToGray(BufferedImage pixes, int type, int threshold) { BufferedImage bi = pixes; if (pixes.getHeight() < 1) { return bi; } else { Graphics2D g2 = (Graphics2D) bi.getGraphics(); // i是纵坐标 switch (type) { case 0: for (int i = 0; i < pixes.getHeight(); i++) { // j是横坐标 for (int j = 0; j < pixes.getWidth(); j++) { // 获取颜色集合中一个颜色的int值 RGB color = new RGB(pixes.getRGB(j, i)); HSV hsv = color.toHSV(); hsv.setSaturation(0); hsv.setHue(0); g2.setColor(new Color(color.toRGBInt())); if (getDistance(color, hsv.toRGB()) <= threshold) { g2.setColor(new Color(hsv.toRGB().toRGBInt())); } // System.out.println(g2.getColor()); // 画一个像素 g2.drawLine(j, i, j, i); } } break; case 1: for (int i = 0; i < pixes.getHeight(); i++) { // j是横坐标 for (int j = 0; j < pixes.getWidth(); j++) { // 获取颜色集合中一个颜色的int值 RGB color = new RGB(pixes.getRGB(j, i)); int ave = (color.getBlue() + color.getRed() + color .getGreen()) / 3; g2.setColor(new Color(color.toRGBInt())); if (getDistance(color, new RGB(ave, ave, ave)) <= threshold) { g2.setColor(new Color(ave, ave, ave)); } // System.out.println(g2.getColor()); // 画一个像素 g2.drawLine(j, i, j, i); } } break; case 2: for (int i = 0; i < pixes.getHeight(); i++) { // j是横坐标 for (int j = 0; j < pixes.getWidth(); j++) { // 获取颜色集合中一个颜色的int值 RGB color = new RGB(pixes.getRGB(j, i)); int ave = (color.getBlue() * 28 + color.getRed() * 76 + color .getGreen() * 151) >> 8; g2.setColor(new Color(color.toRGBInt())); if (getDistance(color, new RGB(ave, ave, ave)) <= threshold) { g2.setColor(new Color(ave, ave, ave)); } // System.out.println(g2.getColor()); // 画一个像素 g2.drawLine(j, i, j, i); } } break; case 3: for (int i = 0; i < pixes.getHeight(); i++) { // j是横坐标 for (int j = 0; j < pixes.getWidth(); j++) { // 获取颜色集合中一个颜色的int值 RGB color = new RGB(pixes.getRGB(j, i)); g2.setColor(new Color(color.toRGBInt())); if (getDistance( color, new RGB(color.getRed(), color.getRed(), color .getRed())) <= threshold) { g2.setColor(new Color(color.getRed(), color .getRed(), color.getRed())); } // System.out.println(g2.getColor()); // 画一个像素 g2.drawLine(j, i, j, i); } } break; case 4: for (int i = 0; i < pixes.getHeight(); i++) { // j是横坐标 for (int j = 0; j < pixes.getWidth(); j++) { // 获取颜色集合中一个颜色的int值 RGB color = new RGB(pixes.getRGB(j, i)); g2.setColor(new Color(color.toRGBInt())); if (getDistance(color, new RGB(color.getGreen(), color.getGreen(), color.getGreen())) <= threshold) { g2.setColor(new Color(color.getGreen(), color .getGreen(), color.getGreen())); } // System.out.println(g2.getColor()); // 画一个像素 g2.drawLine(j, i, j, i); } } break; case 5: for (int i = 0; i < pixes.getHeight(); i++) { // j是横坐标 for (int j = 0; j < pixes.getWidth(); j++) { // 获取颜色集合中一个颜色的int值 RGB color = new RGB(pixes.getRGB(j, i)); g2.setColor(new Color(color.toRGBInt())); if (getDistance( color, new RGB(color.getBlue(), color.getBlue(), color .getBlue())) <= threshold) { g2.setColor(new Color(color.getBlue(), color .getBlue(), color.getBlue())); } // System.out.println(g2.getColor()); // 画一个像素 g2.drawLine(j, i, j, i); } } break; default: for (int i = 0; i < pixes.getHeight(); i++) { // j是横坐标 for (int j = 0; j < pixes.getWidth(); j++) { // 获取颜色集合中一个颜色的int值 RGB color = new RGB(pixes.getRGB(j, i)); int gray = (color.getBlue() * 114 + color.getRed() * 299 + color.getGreen() * 587) / 1000; g2.setColor(new Color(color.toRGBInt())); if (getDistance(color, new RGB(gray, gray, gray)) <= threshold) { g2.setColor(new Color(gray, gray, gray)); } // System.out.println(g2.getColor()); // 画一个像素 g2.drawLine(j, i, j, i); } } break; } return bi; } }其中出现的RGB类是色彩的RGB格式,HSV是色彩的HSV格式
RGB.java
public class RGB { // 红色 private int red; // 绿色 private int green; // 蓝色 private int blue; /** * 默认生成白色 */ public RGB() { red = 255; green = 255; blue = 255; } /** * 用RGB值初始化一个颜色 * * @param red * 红色值 0-255 * @param green * 绿色值 0-255 * @param blue * 蓝色值 0-255 */ public RGB(int red, int green, int blue) { if (red < 256 && green >= 0 && green < 256 && green >= 0 && blue < 256 && blue >= 0) { this.red = red; this.green = green; this.blue = blue; } else { this.red = 0; this.green = 0; this.blue = 0; } } /** * 使用32位整型值初始化一个颜色 * * @param color * 例如 0xffffff -1 */ public RGB(int color) { // Color类 可以使用整形值初始化一个类,由于 Color c = new Color(color); red = c.getRed(); green = c.getGreen(); blue = c.getBlue(); } public int getRed() { return red; } public void setRed(int red) { this.red = red; } public int getGreen() { return green; } public void setGreen(int green) { this.green = green; } public int getBlue() { return blue; } public void setBlue(int blue) { this.blue = blue; } /** * 转换为32位整型值 用于初始化一个Color对象 * * @return 32位整型 */ public int toRGBInt() { int rgb = 0xff000000 | (red << 16) | green << 8 | blue; return rgb; } public float getDistance(RGB rgb) { return (float) Math.sqrt(Math.pow(this.getRed() - rgb.getRed(), 2) + Math.pow(this.getGreen() - rgb.getGreen(), 2) + Math.pow(this.getBlue() - rgb.getBlue(), 2)); } /** * RGB转HSV算法 * * @return */ public HSV toHSV() { int hue = 0;// 色调 int saturation = 0;// 饱和度 int value = 0;// 亮度 int max = Math.max(Math.max(red, blue), green); int min = Math.min(Math.min(red, blue), green); // 色调的计算 if (max == min) { hue = 0; } else { if (max == red && green >= blue) { hue = (int) ((green - blue) / (float) (max - min) * 60); } else if (max == red && green < blue) { hue = (int) ((green - blue) / (float) (max - min) * 60 + 360); } else if (max == green) { hue = (int) ((blue - red) / (float) (max - min) * 60 + 120); } else if (max == blue) { hue = (int) ((red - green) / (float) (max - min) * 60 + 240); } } value = max;// 亮度的值为颜色最大值 if (max == 0) { saturation = 0; } else { saturation = (int) ((float) (max - min) / max * 100);// 饱和度计算 } return new HSV(hue, saturation, value); } public String toString() { return "[" + red + "," + green + "," + blue + "]"; }
HSV.java
public class HSV { int hue;// 色调0-360 int saturation;// 饱和度0-100 int value;// 亮度0-255 public HSV() { this.hue = 0; this.saturation = 0; this.value = 0; } /** * 使用参数初始化HSV信息 * @param hue 色调 * @param saturation 饱和度 * @param value 亮度 */ public HSV(int hue, int saturation, int value) { if (hue <= 360 && saturation >= 0 && saturation <= 100 && value >= 0 && value <= 255) { this.hue = hue; this.saturation = saturation; this.value = value; } else { this.hue = 0; this.saturation = 0; this.value = 0; } } public int getHue() { return hue; } public void setHue(int hue) { this.hue = hue; } public int getSaturation() { return saturation; } public void setSaturation(int saturation) { this.saturation = saturation; } public int getValue() { return value; } public void setValue(int value) { this.value = value; } public String toString(){ return "["+hue+","+saturation+","+value+"]"; } /** * HSV转RGB算法 * @return */ public RGB toRGB() { int red = 0; int green = 0; int blue = 0; float a, b, c, h;// if (saturation == 0) { red = value; green = value; blue = value; } else { h = hue / (float) 60; int i = hue / 60; a = (float) (value * (100 - saturation)/100.0); b = (float) (value * (100 - saturation * (h-i))/100.0); c = (float) (value * (100 - saturation* (1 - h+i))/100.0); switch (i) { case 0: red=value; green=Math.round(c); blue=Math.round(a); break; case 1: red=Math.round(b); green=value; blue=Math.round(a); break; case 2: red=Math.round(a); green=value; blue=Math.round(c); break; case 3: red=Math.round(a); green=Math.round(b); blue=value; break; case 4: red=Math.round(c); green=Math.round(a); blue=value; break; case 5: red=value; green=Math.round(a); blue=Math.round(b); break; } } return new RGB(red, green, blue); } }
6、在一张图片上的指定位置用指定颜色画一个矩形
/** * 在一张图片上的指定位置用指定颜色画一个矩形 * * @param pix * 图片流 * @param x * 起点 横坐标 * @param y * 起点 纵坐标 * @param width * 矩形宽度 * @param height * 矩形高度 * @param rgb * 画笔颜色 * @return 画完方后的矩形 */ public static BufferedImage drawRectOnMip(BufferedImage pix, int x, int y, int width, int height, RGB rgb) { BufferedImage pixes = pix; if (x > pixes.getWidth() || y > pixes.getHeight() || width > pixes.getWidth() - x || height > pixes.getHeight() - y) { System.out.println("无法绘制"); return pix; } // pic_drawRect Graphics2D g2 = (Graphics2D) pixes.getGraphics(); for (int i = 0; i < pixes.getHeight(); i++) { // j是横坐标 for (int j = 0; j < pixes.getWidth(); j++) { // 获取颜色集合中一个颜色的int值 Color color = new Color(pixes.getRGB(j, i)); // System.out.println(pixes.get(i).get(j).toRGBInt()); // System.out.println(color); g2.setColor(color); // System.out.println(g2.getColor()); // 画一个像素 g2.drawLine(j, i, j, i); } } g2.setColor(new Color(rgb.toRGBInt())); g2.drawRect(x, y, width, height); return pixes; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
相关推荐
Java将图片组合成PDF文件的方法主要涉及到以下几个知识点: 1. Java图像处理:Java图像处理是指使用Java语言对图像进行处理和操作的过程。图像处理是指对图像进行各种操作,如图像滤波、图像缩放、图像裁剪、图像...
本篇文章将深入探讨如何使用Java实现“多张图片合成”、“图片拼接”以及“图片上写字”的功能。我们将主要围绕提供的`ImgUtil.java`文件进行讲解。 1. **图片合成**: 图片合成是指将多张图片组合成一张新的图片...
在这个方法中,我们首先计算了所有图片的总宽度和最大高度,然后创建了一个新的`BufferedImage`对象以容纳合成后的图片。接着,我们使用`Graphics2D`对象在新图片上绘制每张原始图片,每张之间留有一定的间距。 ...
在深入讨论具体的Java代码实现之前,我们先来理解几个关键的概念和技术: 1. **图片压缩**:压缩是指通过算法减少数据量的过程,分为有损压缩和无损压缩。有损压缩会牺牲部分图像质量来换取更高的压缩比,而无损...
总的来说,这个Java图片播放程序展现了Java在图形用户界面开发和多媒体处理方面的能力。通过理解和学习这样的程序,开发者可以提升在GUI设计、事件处理、多线程控制以及文件操作等方面的技能。同时,这个程序也可以...
本文将详细讲解如何利用Java实现这一功能,主要涉及以下几个知识点: 1. **Graphics2D API** Java中的`Graphics2D`是`Graphics`类的子类,提供了丰富的绘图功能,包括绘制文本。在文字转图片的过程中,`Graphics2D...
源码可能会包含以下几个关键部分: - 字符串生成器:创建随机字符串。 - 图形上下文设置:初始化画布,设置颜色和字体。 - 干扰元素绘制:绘制线条、斑点等干扰元素。 - 文本变形绘制:扭曲或倾斜文字。 - 图像保存...
为了实现这些功能,开发者需要掌握以下几个Java相关的技术点: 1. **Swing或JavaFX**:这是Java的图形用户界面(GUI)库,用于创建窗口和组件,如按钮、文本框和图像视图。Java 图片浏览器会使用这些库构建用户界面...
本知识点主要探讨如何在Java中实现自适应图片大小的水印功能,以及遇到图片过小时的处理策略。 首先,我们需要理解水印的基本概念。水印是在图像或文档上添加的一种视觉标记,它可以是文字、图像或者图形,用于表明...
在实际应用中,为了确保图片压缩效果和速度,我们还需要考虑以下几个方面: 1. **缓存**:如果处理大量图片,可以考虑使用缓存机制,避免重复读取和处理。 2. **多线程**:对于批量操作,使用多线程可以显著提高性能...
在Java Web开发中,图片的上传与下载是常见的功能需求,尤其在电商平台、社交媒体等应用场景中。本示例提供了一种实现方式,通过使用`commons-io`和`commons-fileupload`这两个库,以及两个Servlet(`UploadServlet`...
在这个Java图片浏览工具中,我们可以看到这些概念的实际应用。 1. 类与对象:在图片浏览器中,我们可以定义一个`Picture`类来表示图片,包含图片路径、类型等属性,以及显示、放大、缩小等方法。同时,还有一个`...
以上就是Java中压缩图片的几种常见方法,可以根据项目需求和性能考虑选择合适的方式。在实际应用中,除了调整尺寸,还可以通过设置JPEG的压缩质量来进一步减小文件大小。例如,`ImageIO.write()`方法的第三个参数...
这两个Java程序可以作为处理图片与Base64转换的基本模板。在实际应用中,你可能需要根据具体需求进行调整,例如添加异常处理,处理不同的图片格式,或者将这些功能封装到类或方法中以供重复使用。在处理大量图片或...
综上所述,制作一个Java图片浏览器涵盖了Java GUI编程的多个方面,从基础的组件使用到高级的文件操作和多线程,都锻炼了开发者综合运用Java技术的能力。通过这个项目,开发者不仅可以学习到Java编程,还能理解软件...
当我们谈论“Excel含图片导入 包含WPS嵌入图片 Java”这个主题时,它涉及到几个关键的技术点,包括: 1. **Excel文件处理**:Excel是微软开发的一款电子表格软件,广泛用于数据管理和分析。它允许用户创建、编辑和...
本文将深入探讨几种不同的方法,分析它们的优缺点,以帮助开发者选择最适合项目需求的解决方案。 1. **Java2DPDF库转图片** - 优点:通过先将HTML渲染为PDF,然后将PDF转换为图像,这种方式可以保持较好的排版和...
4. **性能优化**:为了实现“快速”图片剪切,我们需要关注几个性能优化点: - 使用`BufferedImage`的适当类型,如TYPE_INT_ARGB,以减少颜色转换开销。 - 避免不必要的内存复制,如通过`createGraphics()`创建`...
在生成图片水印的过程中,我们需要考虑以下几点: 1. **水印设计**:水印可以是文本(如日期、公司名称或“机密”等字样),也可以是图像。设计时需注意透明度设置,以确保不影响文档内容的可读性。 2. **定位与...