java处理图片

一、几个处理图片时的关键类

Image、BufferedImage、Graphics、Graphics2D、Shape、Color、ImageIo、ImageInputStream

下面逐个介绍上述几个类

(一)、图像类

1.1、Image

抽象类 Image 是表示图形图像的所有类的超类。必须以特定于平台的方式获取图像

1.2、BufferedImage

BufferedImage 子类描述具有可访问图像数据缓冲区的 Image BufferedImage 由图像数据的ColorModel 相匹配,以表示其颜色和 alpha 分量。所有 BufferedImage 对象的左上角坐标都为 (0, 0)。因此,用来构造 BufferedImage 的任何 Raster 都必须满足:minX=0 且 minY=0。
常用方法:

1.2.1、BufferedImage(int width, int height, int imageType)
参数:
width - 所创建图像的宽度
height - 所创建图像的高度
imageType - 所创建图像的类型  这里举几个例子: TYPE_BYTE_BINARY  二
值化(黑白)、TYPE_BYTE_GRAY 灰度化、TYPE_INT_RGB 彩色

构造一个类型为预定义图像类型之一的 BufferedImage。

1.2.2、public Graphics getGraphics()

此方法返回 Graphics2D,但此处是出于向后兼容性的考虑。 createGraphics 更为方便,因为它被声明为返回 Graphics2D。

1.2.3、getHeight()

此方法返回图片的高度

1.2.4、int getMinX()

返回此 BufferedImage 的最小 x 坐标。

1.2.5、int getMinY()

返回此 BufferedImage 的最小 y 坐标。

1.2.6、public int getType()

返回图像类型。如果它不是已知的类型之一,则返回 TYPE_CUSTOM 。

1.2.7、int getWidth()

返回 BufferedImage 的宽度。

1.2.8、public BufferedImage getSubimage(int x,int y,int w,int h)

返回由指定矩形区域定义的子图像。返回的 BufferedImage 与源图像共享相同的数据数组。
参数:
x - 指定矩形区域左上角的 X 坐标
y - 指定矩形区域左上角的 Y 坐标
w - 指定矩形区域的宽度
h - 指定矩形区域的高度

1.2.9、public Image getScaledInstance(int width,int height,int hints)

创建此图像的缩放版本。返回一个新的 Image 对象,默认情况下,该对象按指定的 width 和 height 呈现图像。即使已经完全加载了初始源图像,新的 Image 对象也可以被异步加载。如果 width 或 height 为负数,则替换该值以维持初始图像尺寸的高宽比。如果 width 和 height 都为负,则使用初始图像尺寸。

参数:
width - 将图像缩放到的宽度。
height - 将图像缩放到的高度。
hints - 指示用于图像重新取样的算法类型的标志。

(二)绘图类

2.1、Graphics

Graphics 类是所有图形上下文的抽象基类,允许应用程序在组件(已经在各种设备上实现)以及闭屏图像上进行绘制
常用方法

2.1.1、public abstract boolean drawImage(Image img,int x,int y,ImageObserver observer)

绘制指定图像中当前可用的图像。图像的左上角位于该图形上下文坐标空间的 ( x, y)。图像中的透明像素不影响该处已存在的像素。

img - 要绘制的指定图像。如果 img 为 null,则此方法不执行任何操作。
x - x 坐标。
y - y 坐标。
observer - 转换了更多图像时要通知的对象。

2.2、Graphics2D

此 Graphics2D 类扩展 Graphics 类,以提供对几何形状、坐标转换、颜色管理和文本布局更为复杂的控制。它是用于在 Java(tm) 平台上呈现二维形状、文本和图像的基础类。

常用方法:

2.2.1、protected Graphics2D()

构建一个新的 Graphics2D 对象。

2.2.2、public abstract void drawString(String str,float x,float y)

使用 Graphics2D 上下文中当前文本属性状态呈现由指定 String 指定的文本。首字符的基线位于用户空间中的( x, y) 位置处。应用的呈现属性包括 Clip、 Transform、 Paint、 Font Composite 属性。对于脚本系统(如 Hebrew 和 Arabic)中的字符,在提供的坐标位于基线上最左边字符的情况下,可以从右到左呈现字形。

2.2.3、abstract void fill(Shape s)

使用 Graphics2D 上下文的设置,填充 Shape 的内部区域。

2.2.4、abstract void rotate(double theta)

旋转

2.2.5、abstract void translate(double tx, double ty)

平移

参数:
tx - 沿 x 轴平移的距离
ty - 沿 y 轴平移的距离
2.2.6、abstract void scale(double sx, double sy)

缩放

参数:
sx - 相对于以前的呈现操作,后续呈现操作中的与 X 坐标相乘的量。(缩放倍数)
sy - 相对于以前的呈现操作,后续呈现操作中的与 Y 坐标相乘的量。(缩放倍数)
2.2.7、abstract void setBackground(Color color)

设置 Graphics2D 上下文的背景色。

2.2.8、public abstract void shear(double shx,double shy)

裁剪

2.2.9、public abstract void dispose()

释放此图形的上下文以及它使用的所有系统资源。调用 dispose 之后,就不能再使用 Graphics 对象。Java 程序运行时,可以在一个短时间帧内创建大量的 Graphics 对象。尽管垃圾回收器的终止进程也能够进行相同的系统资源释放,但是最好通过调用此方法来手工释放相关资源,而不是依靠终止进程,因为终止进程需要很长时间才能结束运行。作为组件 paint 和 update 方法的参数提供的 Graphics 对象,在这些方法返回时将被系统自动释放。为了提高效率,仅当所使用的 Graphics 对象是由组件或另一个 Graphics 对象直接创建时,程序员才应在使用完此Graphics 后调用 dispose。

2.3 Shape

Shape 接口提供了表示一些几何形状的对象的定义。

2.4 Color

Color 类用于封装默认 sRGB 颜色空间中的颜色,或者用于封装由 ColorSpace 标识的任意颜色空间中的颜色。每种颜色都有一个隐式的 alpha 值 1.0,或者有一个在构造方法中提供的显式的 alpha 值。alpha 值定义了颜色的透明度,可用一个在 0.0 - 1.0 或 0 - 255 范围内的浮点值表示它。alpha 值为 1.0 或 255 则意味着颜色完全是不透明的,alpha 值为 0 或 0.0 则意味着颜色是完全透明的。在使用显式的 alpha 值构造 Color 时,或者在获取某个 Color 的颜色/alpha 分量时,从不将颜色分量预乘 alpha 分量。

(三)、流处理类

3.1 ImageIo

该类包含一些用来查找 ImageReader 和 ImageWriter 以及执行简单编码和解码的静态便捷方法
常用方法:

3.1.1、public static ImageInputStream createImageInputStream(Object input) throws IOException

返回一个 ImageInputStream,它将从给定 Object 中获取输入

参数:
input - 用作输入源的 Object,比如 File、可读取的 RandomAccessFile 或 InputStream。
3.1.2、public static ImageOutputStream createImageOutputStream(Object output) throws IOException

返回一个 ImageOutputStream,它将其输出发送到给定 Object。

参数:
output - 用作输出目标的 Object,比如 File、可写入的 RandomAccessFile 或 OutputStream。
3.1.3、static Iterator< ImageReader > getImageReaders(Object input)

返回包含所有当前已注册 ImageReader 的 Iterator,这些 ImageReader 声称能够解码所提供的 Object(通常是一个 ImageInputStream)。

3.1.4、static Iterator< ImageReader > getImageReadersByFormatName(String formatName)

方法返回包含所有当前已注册 ImageReader 的 Iterator,这些 ImageReader 声称能够解码指定格式。

参数:
formatName - 包含非正式格式名称的 String( 例如 "jpeg" 或 "tiff")
3.1.5、几个read方法
1、public static BufferedImage read(File input)

返回一个 BufferedImage,作为使用 ImageReader(它是从当前已注册 ImageReader 中自动选择的)解码所提供 File 的结果。该 File 被包装在一个 ImageInputStream 中。如果没有已注册的 ImageReader 声称能够读取得到的流,则返回 null。

2、public static BufferedImage read(InputStream input)

返回一个 BufferedImage,作为使用 ImageReader(它是从当前已注册 ImageReader 中自动选择的)解码所提供 InputStream 的结果。该 InputStream 被包装在一个 ImageInputStream 中。如果没有已注册的 ImageReader 声称能够读取得到的流,则返回 null。

3、public static BufferedImage read(URL input)

返回一个 BufferedImage,作为使用 ImageReader(它是从当前已注册 ImageReader 中自动选择的)解码所提供 URL 的结果。InputStream是从 URL 中获得的,它被包装ImageInputStream 中。如果没有已注册的 ImageReader 声称能够读取得到的流,则返回 null。

4、public static BufferedImage read(ImageInputStream stream)

返回一个 BufferedImage,作为使用 ImageReader(它是从当前已注册 ImageReader 中自动选择的)解码所提供 ImageInputStream 的结果。如果没有已注册的 ImageReader 声称能够读取该流,则返回 null。

3.1.6、setUseCache(boolean useCache)

设置一个标记,指示在创建 ImageInputStream 和 ImageOutputStream 时是否应该使用基于磁盘的缓存文件。

3.1.7、public static void setCacheDirectory(File cacheDirectory)

设置将在其中创建缓存文件的目录。值为 null 表示将使用与系统有关的默认临时文件目录。如果
getUseCache 返回 false,则忽略此值。

3.1.8、三个write方法
1、static boolean write(RenderedImage im, String formatName, File output) 

使用支持给定格式的任意 ImageWriter 将一个图像写入 File。

2、static boolean write(RenderedImage im, String formatName, ImageOutputStream output) 

使用支持给定格式的任意 ImageWriter 将一个图像写入 ImageOutputStream。

3、static boolean write(RenderedImage im, String formatName, OutputStream output) 

使用支持给定格式的任意 ImageWriter 将一个图像写入 OutputStream。

3.2、ImageInputStream

供 ImageReader 使用的可查找输入流接口。各种输入源(如 InputStream、File 以及将来的快速 I/O 源)都可以通过此接口的恰当实现进行“包装”,供 Image I/O API 使用。简言之,该接口是用于包装输入流(解码)。

二、图片操作工具类(持续完善中…)

参考:http://blog.csdn.net/zhangzhikaixinya/article/details/8459400

package util;

import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
import java.awt.image.CropImageFilter;
import java.awt.image.FilteredImageSource;
import java.awt.image.ImageFilter;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;

import javax.imageio.ImageIO;

/**
 * @Description: 图片操作类
 * @author limouren
 * @date 2018年1月17日
 */
public class ImageUtil {
    public static final String IMAGE_TYPE_GIF = "gif";// 图形交换格式
    public static final String IMAGE_TYPE_JPG = "jpg";// 联合照片专家组
    public static final String IMAGE_TYPE_JPEG = "jpeg";// 联合照片专家组
    public static final String IMAGE_TYPE_BMP = "bmp";// 英文Bitmap(位图)的简写,它是Windows操作系统中的标准图像文件格式
    public static final String IMAGE_TYPE_PNG = "png";// 可移植网络图形
    public static final String IMAGE_TYPE_PSD = "psd";// Photoshop的专用格式Photoshop

    /**
     * @Description: 按比例缩小或者放大图片
     * @param srcImage
     *            要缩小或者放大的图片
     * @param scale
     *            缩小或者放大的倍数
     * @param flag
     *            true表示放大;false表示缩小
     * @param formatName
     *            缩小后的图片格式(最好跟原图片格式相同),默认为jpeg
     * @return BufferedImage 缩小或者放大后的图片
     */
    public static BufferedImage multipleScale(BufferedImage srcImage,
            int scale, boolean flag, String formatName) throws Exception {
        if (null == srcImage) {
            return null;
        }
        if (scale <= 0) {
            return null;
        }
        if (null == formatName || "".equals(formatName)) {
            formatName = IMAGE_TYPE_JPEG;
        }

        int width = srcImage.getWidth(); // 得到源图宽
        int height = srcImage.getHeight(); // 得到源图长
        if (flag) {// 放大
            width = width * scale;
            height = height * scale;
        } else {// 缩小
            width = width / scale;
            height = height / scale;
        }

        Image image = srcImage.getScaledInstance(width, height,
                Image.SCALE_DEFAULT);
        BufferedImage tag = new BufferedImage(width, height,
                BufferedImage.TYPE_INT_RGB);
        Graphics g = tag.createGraphics();
        g.drawImage(image, 0, 0, null); // 绘制缩小后的图
        g.dispose();
        tag.flush();
        return tag;
    }

    /**
     * @Description: 在(x,y)坐标处裁剪宽为width,高为height的图片。 若height或者width <0,返回null
     * @param srcImage
     * @param x
     * @param y
     * @param width
     * @param height
     * @return
     * @throws Exception
     */
    public static BufferedImage cut(BufferedImage srcImage, int x, int y,
            int width, int height) throws Exception {
        if (null != srcImage && srcImage.getHeight() > 0
                && srcImage.getWidth() > 0) {
            int srcWidth = srcImage.getHeight(); // 源图宽度
            int srcHeight = srcImage.getWidth(); // 源图高度
            Image image = srcImage.getScaledInstance(srcWidth, srcHeight,
                    Image.SCALE_DEFAULT);
            if (width <= 0 || height <= 0) {
                return null;
            }
            // 四个参数分别为图像起点坐标和宽高
            // 即: CropImageFilter(int x,int y,int width,int height)
            ImageFilter cropFilter = new CropImageFilter(x, y, width, height);
            Image img = Toolkit.getDefaultToolkit().createImage(
                    new FilteredImageSource(image.getSource(), cropFilter));
            BufferedImage tag = new BufferedImage(width, height,
                    BufferedImage.TYPE_INT_RGB);
            Graphics g = tag.getGraphics();
            g.drawImage(img, 0, 0, width, height, null); // 绘制切割后的图
            g.dispose();
            return tag;
        } else {
            return null;
        }
    }

    /**
     * @Description: 转换BufferedImage->输出流
     * @param image
     *            二维码内容
     * @param format
     *            图片格式
     * @param outPutStream
     *            如果不指定输出流,默认为ByteArrayOutputStream 输出流
     * @return
     * @throws IOException
     */
    public static OutputStream writeToStream(BufferedImage image,
            String format, OutputStream outPutStream) throws Exception {
        if (null == outPutStream) {
            outPutStream = new ByteArrayOutputStream();
        }
        ImageIO.write(image, format, outPutStream);
        return outPutStream;
    }

    /**
     * 图片输出到文件
     * 
     * @param image
     *            图片
     * @param format
     *            图片格式
     * @param file
     *            输出文件
     * @return
     * */
    public static File writeToFile(BufferedImage image, String format, File file)
            throws IOException {
        if (null == file) {
            return null;
        }
        ImageIO.write(image, format, file);
        return file;
    }

}
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
处理图片性能低可能有多种原因,以下是一些常见的优化建议: 1. 图片压缩:使用适当的压缩算法来减小图片的文件大小,可以通过降低图片质量、调整分辨率或使用更高效的图片格式(如WebP)来实现。这可以减少网络传输和磁盘加载时间。 2. 图片缓存:在处理图片时,可以使用缓存来避免重复的加载和处理操作。将已经处理过的图片缓存起来,下次需要时直接从缓存中获取,避免重复的计算和IO操作。 3. 多线程处理:如果需要同时处理多张图片,可以考虑使用多线程来并行处理。将图片处理任务拆分成多个子任务,每个子任务在独立的线程中处理,以提高处理效率。 4. 图片格式优化:选择合适的图片格式可以提高处理性能。例如,对于需要透明背景的图片,使用PNG格式;对于颜色较少且无需透明背景的图片,使用GIF格式或JPEG格式。 5. 使用图像处理库:Java中有许多优秀的图像处理库,如ImageIO、OpenCV、Java Advanced Imaging(JAI)等。这些库提供了丰富的图像处理功能,并且经过了优化和性能调整。选择适合你需求的库,可以提高处理图片的性能。 6. 图片预加载:如果你的应用程序需要频繁地加载和显示图片,可以在需要时预加载图片,提前将图片加载到内存中。这样可以避免每次使用时都进行IO操作,减少加载时间和提高响应速度。 7. 优化算法和算法参数:在使用图像处理算法时,可以调整算法的参数或尝试其他优化算法,以达到更好的性能。例如,图像的缩放、裁剪、旋等操作可以选择更高效的算法。 8. 监测和分析性能瓶颈:使用性能分析工具来监测和分析代码中的性能瓶颈。通过定位具体的性能问题,可以有针对性地进行优化。 需要根据具体情况选择适合的优化方法,并进行性能测试和评估,以确保达到预期的性能改善效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值