`
Dikaros
  • 浏览: 3526 次
文章分类
社区版块
存档分类
最新评论

几个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文件的方法

    Java将图片组合成PDF文件的方法主要涉及到以下几个知识点: 1. Java图像处理:Java图像处理是指使用Java语言对图像进行处理和操作的过程。图像处理是指对图像进行各种操作,如图像滤波、图像缩放、图像裁剪、图像...

    java多张图片合成,图片拼接,图片上写字

    本篇文章将深入探讨如何使用Java实现“多张图片合成”、“图片拼接”以及“图片上写字”的功能。我们将主要围绕提供的`ImgUtil.java`文件进行讲解。 1. **图片合成**: 图片合成是指将多张图片组合成一张新的图片...

    利用Java程序把多张图片合成一张图片

    在这个方法中,我们首先计算了所有图片的总宽度和最大高度,然后创建了一个新的`BufferedImage`对象以容纳合成后的图片。接着,我们使用`Graphics2D`对象在新图片上绘制每张原始图片,每张之间留有一定的间距。 ...

    java版图片压缩方法

    在深入讨论具体的Java代码实现之前,我们先来理解几个关键的概念和技术: 1. **图片压缩**:压缩是指通过算法减少数据量的过程,分为有损压缩和无损压缩。有损压缩会牺牲部分图像质量来换取更高的压缩比,而无损...

    Java图片播放程序

    总的来说,这个Java图片播放程序展现了Java在图形用户界面开发和多媒体处理方面的能力。通过理解和学习这样的程序,开发者可以提升在GUI设计、事件处理、多线程控制以及文件操作等方面的技能。同时,这个程序也可以...

    java文字转图片

    本文将详细讲解如何利用Java实现这一功能,主要涉及以下几个知识点: 1. **Graphics2D API** Java中的`Graphics2D`是`Graphics`类的子类,提供了丰富的绘图功能,包括绘制文本。在文字转图片的过程中,`Graphics2D...

    java图片验证 制作java图片验证

    源码可能会包含以下几个关键部分: - 字符串生成器:创建随机字符串。 - 图形上下文设置:初始化画布,设置颜色和字体。 - 干扰元素绘制:绘制线条、斑点等干扰元素。 - 文本变形绘制:扭曲或倾斜文字。 - 图像保存...

    java的图片浏览器

    为了实现这些功能,开发者需要掌握以下几个Java相关的技术点: 1. **Swing或JavaFX**:这是Java的图形用户界面(GUI)库,用于创建窗口和组件,如按钮、文本框和图像视图。Java 图片浏览器会使用这些库构建用户界面...

    java 水印(水印适应图片大小,但个别图片太小不支持)

    本知识点主要探讨如何在Java中实现自适应图片大小的水印功能,以及遇到图片过小时的处理策略。 首先,我们需要理解水印的基本概念。水印是在图像或文档上添加的一种视觉标记,它可以是文字、图像或者图形,用于表明...

    java图片压缩文件大小图片大小(支持gif动态图)

    在实际应用中,为了确保图片压缩效果和速度,我们还需要考虑以下几个方面: 1. **缓存**:如果处理大量图片,可以考虑使用缓存机制,避免重复读取和处理。 2. **多线程**:对于批量操作,使用多线程可以显著提高性能...

    java图片上传与下载方法

    在Java Web开发中,图片的上传与下载是常见的功能需求,尤其在电商平台、社交媒体等应用场景中。本示例提供了一种实现方式,通过使用`commons-io`和`commons-fileupload`这两个库,以及两个Servlet(`UploadServlet`...

    一个java的建议图片浏览工具

    在这个Java图片浏览工具中,我们可以看到这些概念的实际应用。 1. 类与对象:在图片浏览器中,我们可以定义一个`Picture`类来表示图片,包含图片路径、类型等属性,以及显示、放大、缩小等方法。同时,还有一个`...

    java各种方式压缩图片

    以上就是Java中压缩图片的几种常见方法,可以根据项目需求和性能考虑选择合适的方式。在实际应用中,除了调整尺寸,还可以通过设置JPEG的压缩质量来进一步减小文件大小。例如,`ImageIO.write()`方法的第三个参数...

    Java实现图片和Base64之间的相互转化

    这两个Java程序可以作为处理图片与Base64转换的基本模板。在实际应用中,你可能需要根据具体需求进行调整,例如添加异常处理,处理不同的图片格式,或者将这些功能封装到类或方法中以供重复使用。在处理大量图片或...

    用java做的图片浏览器

    综上所述,制作一个Java图片浏览器涵盖了Java GUI编程的多个方面,从基础的组件使用到高级的文件操作和多线程,都锻炼了开发者综合运用Java技术的能力。通过这个项目,开发者不仅可以学习到Java编程,还能理解软件...

    excel含图片导入 包含wps嵌入图片 java

    当我们谈论“Excel含图片导入 包含WPS嵌入图片 Java”这个主题时,它涉及到几个关键的技术点,包括: 1. **Excel文件处理**:Excel是微软开发的一款电子表格软件,广泛用于数据管理和分析。它允许用户创建、编辑和...

    java:将html生成图片的所有方法比较

    本文将深入探讨几种不同的方法,分析它们的优缺点,以帮助开发者选择最适合项目需求的解决方案。 1. **Java2DPDF库转图片** - 优点:通过先将HTML渲染为PDF,然后将PDF转换为图像,这种方式可以保持较好的排版和...

    JAVA快速图片剪切

    4. **性能优化**:为了实现“快速”图片剪切,我们需要关注几个性能优化点: - 使用`BufferedImage`的适当类型,如TYPE_INT_ARGB,以减少颜色转换开销。 - 避免不必要的内存复制,如通过`createGraphics()`创建`...

    java操作wordpdf图片生成图片水印

    在生成图片水印的过程中,我们需要考虑以下几点: 1. **水印设计**:水印可以是文本(如日期、公司名称或“机密”等字样),也可以是图像。设计时需注意透明度设置,以确保不影响文档内容的可读性。 2. **定位与...

Global site tag (gtag.js) - Google Analytics