`

applet图形缩放类

阅读更多
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Iterator;
import javax.imageio.ImageIO;
import javax.imageio.ImageWriter;
import javax.imageio.stream.ImageOutputStream;

import java.awt.Dimension;
import java.awt.image.PixelGrabber;
import java.util.Locale;

import javax.imageio.IIOImage;
import javax.imageio.ImageWriteParam;
import javax.imageio.plugins.jpeg.JPEGImageWriteParam;

/**
 * 将图片1.jpg缩小为图片test.jpg。
 */
public class TestImage
{
	public static void main(String[] args) throws Exception, IOException
	{
		ImageIO.write(ImageUtils.resizeImage("e:\\1.jpg", ImageUtils.IMAGE_GIF,
				30, 20), "JPEG", new FileOutputStream("e:\\test.jpg"));
	}
}

class ImageUtils
{
	public static final int IMAGE_UNKNOWN = -1;
	public static final int IMAGE_JPEG = 0;
	public static final int IMAGE_PNG = 1;
	public static final int IMAGE_GIF = 2;

	/**
	 * Resizes an image
	 * 
	 * @param imgName
	 *            The image name to resize. Must be the complet path to the file
	 * @param type
	 *            int
	 * @param maxWidth
	 *            The image's max width
	 * @param maxHeight
	 *            The image's max height
	 * @return A resized <code>BufferedImage</code>
	 */
	public static BufferedImage resizeImage(String imgName, int type,
			int maxWidth, int maxHeight)
	{
		try
		{
			return resizeImage(ImageIO.read(new File(imgName)), type, maxWidth,
					maxHeight);
		}
		catch (IOException e)
		{
			e.printStackTrace();
			return null;
		}
	}

	/**
	 * Resizes an image.
	 * 
	 * @param image
	 *            The image to resize
	 * @param maxWidth
	 *            The image's max width
	 * @param maxHeight
	 *            The image's max height
	 * @return A resized <code>BufferedImage</code>
	 * @param type
	 *            int
	 */
	public static BufferedImage resizeImage(BufferedImage image, int type,
			int maxWidth, int maxHeight)
	{
		Dimension largestDimension = new Dimension(maxWidth, maxHeight);

		// Original size
		int imageWidth = image.getWidth(null);
		int imageHeight = image.getHeight(null);

		float aspectRatio = (float) imageWidth / imageHeight;

		if (imageWidth > maxWidth || imageHeight > maxHeight)
		{
			if ((float) largestDimension.width / largestDimension.height > aspectRatio)
			{
				largestDimension.width = (int) Math
						.ceil(largestDimension.height * aspectRatio);
			}
			else
			{
				largestDimension.height = (int) Math
						.ceil(largestDimension.width / aspectRatio);
			}

			imageWidth = largestDimension.width;
			imageHeight = largestDimension.height;
		}

		return createHeadlessSmoothBufferedImage(image, type, imageWidth,
				imageHeight);
	}

	/**
	 * Saves an image to the disk.
	 * 
	 * @param image
	 *            The image to save
	 * @param toFileName
	 *            The filename to use
	 * @param type
	 *            The image type. Use <code>ImageUtils.IMAGE_JPEG</code> to
	 *            save as JPEG images, or <code>ImageUtils.IMAGE_PNG</code> to
	 *            save as PNG.
	 * @return <code>false</code> if no appropriate writer is found
	 */
	public static boolean saveImage(BufferedImage image, String toFileName,
			int type)
	{
		try
		{
			return ImageIO.write(image, type == IMAGE_JPEG ? "jpg" : "png",
					new File(toFileName));
		}
		catch (IOException e)
		{
			e.printStackTrace();
			return false;
		}
	}

	/**
	 * Compress and save an image to the disk. Currently this method only
	 * supports JPEG images.
	 * 
	 * @param image
	 *            The image to save
	 * @param toFileName
	 *            The filename to use
	 * @param type
	 *            The image type. Use <code>ImageUtils.IMAGE_JPEG</code> to
	 *            save as JPEG images, or <code>ImageUtils.IMAGE_PNG</code> to
	 *            save as PNG.
	 */
	public static void saveCompressedImage(BufferedImage image,
			String toFileName, int type)
	{
		try
		{
			if (type == IMAGE_PNG)
			{
				throw new UnsupportedOperationException(
						"PNG compression not implemented");
			}

			Iterator iter = ImageIO.getImageWritersByFormatName("jpg");
			ImageWriter writer;
			writer = (ImageWriter) iter.next();

			ImageOutputStream ios = ImageIO.createImageOutputStream(new File(
					toFileName));
			writer.setOutput(ios);

			ImageWriteParam iwparam = new JPEGImageWriteParam(Locale
					.getDefault());

			iwparam.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
			iwparam.setCompressionQuality(0.7F);

			writer.write(null, new IIOImage(image, null, null), iwparam);

			ios.flush();
			writer.dispose();
			ios.close();
		}
		catch (IOException e)
		{
			e.printStackTrace();
		}
	}

	/**
	 * Creates a <code>BufferedImage</code> from an <code>Image</code>.
	 * This method can function on a completely headless system. This especially
	 * includes Linux and Unix systems that do not have the X11 libraries
	 * installed, which are required for the AWT subsystem to operate. This
	 * method uses nearest neighbor approximation, so it's quite fast.
	 * Unfortunately, the result is nowhere near as nice looking as the
	 * createHeadlessSmoothBufferedImage method.
	 * 
	 * @param image
	 *            The image to convert
	 * @param w
	 *            The desired image width
	 * @param h
	 *            The desired image height
	 * @return The converted image
	 * @param type
	 *            int
	 */
	public static BufferedImage createHeadlessBufferedImage(
			BufferedImage image, int type, int width, int height)
	{
		if (type == ImageUtils.IMAGE_PNG && hasAlpha(image))
		{
			type = BufferedImage.TYPE_INT_ARGB;
		}
		else
		{
			type = BufferedImage.TYPE_INT_RGB;
		}

		BufferedImage bi = new BufferedImage(width, height, type);

		for (int y = 0; y < height; y++)
		{
			for (int x = 0; x < width; x++)
			{
				bi.setRGB(x, y, image.getRGB(x * image.getWidth() / width, y
						* image.getHeight() / height));
			}
		}

		return bi;
	}

	/**
	 * Creates a <code>BufferedImage</code> from an <code>Image</code>.
	 * This method can function on a completely headless system. This especially
	 * includes Linux and Unix systems that do not have the X11 libraries
	 * installed, which are required for the AWT subsystem to operate. The
	 * resulting image will be smoothly scaled using bilinear filtering.
	 * 
	 * @param source
	 *            The image to convert
	 * @param w
	 *            The desired image width
	 * @param h
	 *            The desired image height
	 * @return The converted image
	 * @param type
	 *            int
	 */
	public static BufferedImage createHeadlessSmoothBufferedImage(
			BufferedImage source, int type, int width, int height)
	{
		if (type == ImageUtils.IMAGE_PNG && hasAlpha(source))
		{
			type = BufferedImage.TYPE_INT_ARGB;
		}
		else
		{
			type = BufferedImage.TYPE_INT_RGB;
		}

		BufferedImage dest = new BufferedImage(width, height, type);

		int sourcex;
		int sourcey;

		double scalex = (double) width / source.getWidth();
		double scaley = (double) height / source.getHeight();

		int x1;
		int y1;

		double xdiff;
		double ydiff;

		int rgb;
		int rgb1;
		int rgb2;

		for (int y = 0; y < height; y++)
		{
			sourcey = y * source.getHeight() / dest.getHeight();
			ydiff = scale(y, scaley) - sourcey;

			for (int x = 0; x < width; x++)
			{
				sourcex = x * source.getWidth() / dest.getWidth();
				xdiff = scale(x, scalex) - sourcex;

				x1 = Math.min(source.getWidth() - 1, sourcex + 1);
				y1 = Math.min(source.getHeight() - 1, sourcey + 1);

				rgb1 = getRGBInterpolation(source.getRGB(sourcex, sourcey),
						source.getRGB(x1, sourcey), xdiff);
				rgb2 = getRGBInterpolation(source.getRGB(sourcex, y1), source
						.getRGB(x1, y1), xdiff);

				rgb = getRGBInterpolation(rgb1, rgb2, ydiff);

				dest.setRGB(x, y, rgb);
			}
		}

		return dest;
	}

	private static double scale(int point, double scale)
	{
		return point / scale;
	}

	private static int getRGBInterpolation(int value1, int value2,
			double distance)
	{
		int alpha1 = (value1 & 0xFF000000) >>> 24;
		int red1 = (value1 & 0x00FF0000) >> 16;
		int green1 = (value1 & 0x0000FF00) >> 8;
		int blue1 = (value1 & 0x000000FF);

		int alpha2 = (value2 & 0xFF000000) >>> 24;
		int red2 = (value2 & 0x00FF0000) >> 16;
		int green2 = (value2 & 0x0000FF00) >> 8;
		int blue2 = (value2 & 0x000000FF);

		int rgb = ((int) (alpha1 * (1.0 - distance) + alpha2 * distance) << 24)
				| ((int) (red1 * (1.0 - distance) + red2 * distance) << 16)
				| ((int) (green1 * (1.0 - distance) + green2 * distance) << 8)
				| (int) (blue1 * (1.0 - distance) + blue2 * distance);

		return rgb;
	}

	/**
	 * Determines if the image has transparent pixels.
	 * 
	 * @param image
	 *            The image to check for transparent pixel.s
	 * @return <code>true</code> of <code>false</code>, according to the
	 *         result
	 */
	public static boolean hasAlpha(Image image)
	{
		try
		{
			PixelGrabber pg = new PixelGrabber(image, 0, 0, 1, 1, false);
			pg.grabPixels();

			return pg.getColorModel().hasAlpha();
		}
		catch (InterruptedException e)
		{
			return false;
		}
	}
}

 

分享到:
评论

相关推荐

    平面图形控件applet

    显示背景图片和区域数据. 区域透明填充. 人机交互: 移动; 缩放, 复原; 程序交互: 点击, 进入, 离开区域时回调javascript; 运行时可用javascript装载图形,修改区域参数;

    jfreechart+applet三维图形实例

    5. **交互功能**:Applet可以响应用户的鼠标和键盘事件,因此我们可以为三维图形添加交互功能,例如旋转、缩放或切换视图。这需要在Applet类中添加事件监听器,并根据用户操作更新图形的状态。 6. **优化与性能**:...

    java 图片缩放类

    根据提供的文件信息,我们可以总结出以下关于“Java图片缩放类”的相关知识点: ### Java 图片缩放类概述 在Java开发中,处理图像时经常需要进行缩放操作以适应不同的显示需求或优化资源占用。Java 提供了多种库来...

    java 图形显示,移动,缩放

    3. **图形缩放**: `Graphics2D`类提供了缩放功能,通过调用`scale()`方法可以改变图形的大小。如果要保持原图的比例,可以使用`AffineTransform`对象。 ```java g2.scale(scaleFactorX, scaleFactorY); // 缩放...

    Applet版JFreeChart演示

    1. **Java源代码**:Applet的实现类,包括JFreeChart的初始化和绘图逻辑。 2. **HTML文件**:包含嵌入Applet的HTML页面,定义了Applet的属性和参数。 3. **JFreeChart库文件**:可能包含了JFreeChart库的JAR文件,...

    在Java Applet中实现动画.rar_applet_java Applet

    Java Applet中的`paint()`方法接收一个`Graphics`对象参数,我们可以利用这个对象绘制图形。在每一帧中,我们清除屏幕并重新绘制物体的新位置,模拟物体的移动。例如: ```java public void paint(Graphics g) { ...

    java图像处理Applet

    在Java编程语言中,Applet是特殊类型的类,可以通过HTML页面嵌入到Web浏览器中,为用户提供交互式的图形界面体验。 在Java Applet中进行图像处理,主要涉及到以下几个核心知识点: 1. **Java AWT和Swing库**:Java...

    图片浏览小程序(java+applet)

    在早期的网页开发中,Applet被广泛用于创建动态图形、游戏以及像图片浏览这样的多媒体应用。本项目"图片浏览小程序(java+applet)"正是利用了这一特性,旨在为用户构建一个轻量级的在线图片查看工具。 首先,我们...

    java小程序Applet显示图片

    一个Applet通常继承自`java.applet.Applet`类,这个类提供了运行Applet所需的基本功能。以下是一个简单的Applet示例: ```java import java.applet.*; import java.awt.*; public class ShowImageApplet extends ...

    Java在Applet小程序中显示图片.rar

    但理解如何在Applet中处理图像仍然是学习Java图形用户界面编程的一个重要环节。 总之,通过使用Java的`Image`和`Graphics`类,以及适当的HTML嵌入,你可以在Applet小程序中显示图片,提供一种在Web页面中交互式展示...

    图形用户界面设计组件分类

    接下来,我们有两类容器组件:一般容器和专用容器。一般容器如JPane、JScrollPane、JSplitPane、JTabbedPane和JToolBar,它们用于组织和管理其他组件。JPane是基本的容器,可以添加任何组件;JScrollPane为组件提供...

    javaApplet实例

    在描述中提到的"javaapplet小游戏"可能包含了一些简单的游戏程序,如猜数字、扫雷等,这些游戏通常利用了Java的图形用户界面(GUI)组件和事件处理机制。开发者可以利用Java的AWT(Abstract Window Toolkit)或Swing...

    java_paiting.rar_drawlet applet

    5. 变形功能:Drawlet Applet支持图形的变形操作,如旋转、缩放和移动。这通常通过计算图形的变换矩阵来实现。 6. 存储和加载:用户可能希望保存他们的作品或加载之前创建的图形。Drawlet需要实现序列化和反序列化...

    javajava图形与图像处理.pptx

    在Canvas类中,可以象在Applet中那样绘制各种图形。 7. 图像的加载和显示 图像的加载和显示是异步进行的,图像的生产者(ImageProducer)传递给图像的消费者(ImageConsumer)一个与图像相关的位,因为图像的生产过程...

    Java Applet 编程技巧实例专辑.rar

    - `Applet`类:所有Applet的基类,继承自`java.applet.Applet`。 - `&lt;applet&gt;`标签:在HTML中嵌入Applet的语法,包含`width`和`height`属性,以及`code`属性指定Applet的主类。 2. **编程技巧**: - 布局管理:...

    Java Applet小程序图片显示实例.rar

    Java Applet小程序是一种嵌入在HTML页面中的小型Java程序,常用于增强网页的交互性,如显示动态图像、实现...同时,也可以探索如何利用Java的`ImageIO`和`Graphics`类进行更复杂的图像操作,比如旋转、缩放和裁剪等。

    java源码图片浏览小程序(java+applet)

    - **图形绘制**:利用Java的Graphics类进行基本的图形绘制,如矩形、线条等,也可以使用BufferedImage类来处理图片数据。 - **事件处理**:通过监听器模式处理用户的输入事件,例如鼠标点击、键盘按键等。 - **...

    svg2vector-applet

    SVG(Scalable Vector Graphics)是一种基于XML的矢量图像格式,它允许无损缩放,适用于各种屏幕尺寸和分辨率,特别是在Android开发中,使用SVG可以确保图形在不同设备上保持清晰。然而,Android原生并不直接支持SVG...

    关于项目中用到jgraph和applet的一点总结(1)

    `jGraph`的强大之处在于它的灵活性和易用性,开发者可以通过简单的代码就能实现复杂的图形绘制,同时支持各种图形操作,如拖放、缩放、旋转等。此外,`jGraph`还支持XML格式的数据交换,使得图形数据的存储和读取...

    图片浏览小程序(java+applet).zip

    总结来说,这个“图片浏览小程序”项目涵盖了Java基础、Applet生命周期管理、GUI编程(Swing/AWT)、I/O流、图像处理、事件处理以及可能的Java 2D图形操作。随着Java Applet的过时,现代Web开发更倾向于使用...

Global site tag (gtag.js) - Google Analytics