本文链接: http://blog.csdn.net/xietansheng/article/details/78453570

Java Swing 图形界面开发(目录)

1. 读取图片

方法一: 通过 java.awt.Toolkit 工具类来读取本地、网络 或 内存中 的 图片(支持 GIF、JPEG 或 PNG)

Image image = Toolkit.getDefaultToolkit().getImage(String filename);
Image image = Toolkit.getDefaultToolkit().getImage(URL url);
Image image = Toolkit.getDefaultToolkit().createImage(byte[] imageData);

方法二: 通过 javax.imageio.ImageIO 工具类读取本地、网络 或 内存中 的 图片(BufferedImage 继承自 Image)

BufferedImage bufImage = ImageIO.read(File input);
BufferedImage bufImage = ImageIO.read(URL input);
BufferedImage bufImage = ImageIO.read(InputStream input);// 创建空图片
BufferedImage bufImage = new BufferedImage(int width, int height, int imageType);

PS: 推荐使用第二种读取图片的方式,读取后获得的 BufferedImage 有更丰富的 API 对图片进行相关操作。

2. BufferedImage 常用方法

BufferedImage 表示读取到内存中一张图片,首先把一张本地或远程图片读取为 BufferedImage 实例,然后使用其 API 进行相应的操作。

图片的宽高:

int getWidth();
int getHeight();
// 或
int getWidth(ImageObserver observer);
int getHeight(ImageObserver observer);

图片像素操作:

// 设置图片坐标 (x, y) 处的 RGB 像素值
void setRGB(int x, int y, int rgb);// 获取图片坐标 (x, y) 处的 RGB 像素值
int getRGB(int x, int y);/*** 区域批量设置像素, 点(x, y)的像素值:*     pixel = rgbArray[offset + (y - startY) * scansize + (x - startX)];* * 参数说明:*     startX: 设置区域起点横坐标*     startY: 设置区域起点纵坐标*     w: 设置区域的横向宽度(列数)*     h: 设置区域的纵向宽度(行数)*     rgbArray: 取值的像素数组, 数组长度必须大于 offset + h * scansize*     offset: rgbArray 数组的偏移量, 即读取数据时从该数组头部忽略跳过的长度*     scansize: rgbArray 数组的扫描行间隔, 即每一行所需要占用数组内的数据长度, 即为设置区域的每一行设置数据时,  *               都先从数组中读取 scansize 长度的数据, 如果 scansize 大于列数(w), 则后面多读取的数据将被忽略。** PS: 如果想数组中的每一个值都能用上, 通常 offset==0, w==scansize, rgbArray.length==w*h*/
void setRGB(int startX, int startY, int w, int h, int[] rgbArray, int offset, int scansize);/*** 获取图片某区域的所有像素值存入 rgbArray 数组中并返回, * 如果 rgbArray 为 null, 则内部会新建一个长度为 offset + h * scansize 的数组, * 其他参数参考上面 setRGB(...) 方法的参数说明。*/
int[] getRGB(int startX, int startY, int w, int h, int[] rgbArray, int offset, int scansize);

图片裁剪:

/*** 裁剪图片, 参数说明:*     x: 裁剪起点横坐标*     y: 裁剪起点纵坐标*     w: 需要裁剪的宽度*     h: 需要裁剪的高度*/
BufferedImage getSubimage (int x, int y, int w, int h);

图片缩放:

/*** 图片缩放, 参数说明:*     width: 缩放后的宽度*     height: 缩放后的高度*     hints: 指示用于图像重新取样的算法类型的标志** hints 参数取值为以下之一(Image 类中的常量):*     SCALE_AREA_AVERAGING: 使用 Area Averaging 图像缩放算法;*     SCALE_DEFAULT: 使用默认的图像缩放算法;*     SCALE_FAST: 选择一种图像缩放算法,在这种缩放算法中,缩放速度比缩放平滑度具有更高的优先级;*     SCALE_REPLICATE: 使用 ReplicateScaleFilter 类中包含的图像缩放算法;*     SCALE_SMOOTH: 选择图像平滑度比缩放速度具有更高优先级的图像缩放算法。** PS: 获取到的结果是 Image, 如果想转换为 BufferedImage, 可以创建一个相同宽高的空的 BufferedImage, *     然后把获取到的 Image 绘制到 BufferedImage 上。*/
Image getScaledInstance(int width, int height, int hints);

在图片上绘制几何图形、文字、图片(贴图):

// 创建图片的画布
Graphics2D createGraphics();// 获取图片的画布, 此方法实际上内部调用了 createGraphics() 方法, Graphics2D 继承自 Graphics
Graphics getGraphics();/** 获取到 Graphics2D 对象后, 调用它的绘图方法,便可在原图片上绘制几何图形、文字、图片(贴图)等。* 获取到的画布是新创建的, 使用完后需要调用 Graphics 的 dispose() 方法销毁。*/

Graphics2D 的使用,具体的绘制方法,参考: Java绘图: 使用Graphics类绘制线段、矩形、椭圆/圆弧/扇形、图片、文本

3. 保存图片

把内存中的 BufferedImage 持久化保存到本地磁盘(使用 javax.imageio.ImageIO 工具类):

// 先读取图片
BufferedImage bufImage = ImageIO.read(...);/* * 对 bufImage 进行相应的操作*//*** 保存 bufImage, 参数说明:*     im: bufImage 本身, BufferedImage 实现了 RenderedImage 接口*     formatName: 保存的图片格式的名称, 支持 "JPEG"、"PNG"、"GIF"、"BMP" 等格式*     output: 结果输出位置*/
ImageIO.write(RenderedImage im, String formatName, File output);
ImageIO.write(RenderedImage im, String formatName, OutputStream output);

4. 代码实例

把一张图片进行水平镜像,即依次把图片每一行的第1列像素点和最后1列对调,把第2列和倒数第2列对调,以此类推。

package com.xiets.imagedemo;import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;public class Main {public static void main(String[] args) throws IOException {// 读取图片BufferedImage bufImage = ImageIO.read(new File("aa.jpg"));// 获取图片的宽高final int width = bufImage.getWidth();final int height = bufImage.getHeight();// 读取出图片的所有像素int[] rgbs = bufImage.getRGB(0, 0, width, height, null, 0, width);// 对图片的像素矩阵进行水平镜像for (int row = 0; row < height; row++) {for (int col = 0; col < width / 2; col++) {int temp = rgbs[row * width + col];rgbs[row * width + col] = rgbs[row * width + (width - 1 - col)];rgbs[row * width + (width - 1 - col)] = temp;}}// 把水平镜像后的像素矩阵设置回 bufImagebufImage.setRGB(0, 0, width, height, rgbs, 0, width);// 把修改过的 bufImage 保存到本地ImageIO.write(bufImage, "JPEG", new File("bb.jpg"));}}

查看结果,下面左图是变换前的图片aa.jpg,右边是变换后的图片bb.jpg:


Java图片操作 --- 图片的读取、绘制、缩放、裁剪、保存相关推荐

  1. java中关于图片的操作

    java中操作图片 一,给图片加上生成好的二维码及文字 一,给图片加上生成好的二维码及文字 //zxingImage 生成好的二维码 backgroundPath 模板文件的地址 public sta ...

  2. java操作图片为啥改了图片以后底片是红色的

    之前项目上线上传的两张png格式的图片. 后来因需求变更 需要修改 图片,想着只需要修改图片的名称直接替换掉就可以了 但是实际出来的效果确是 替换后的图片呈现泛红的状态. 找了一下原因是用 java ...

  3. 图片操作的手势动态识别系统

    数字图像处理技术是将获得的低质量图像利用计算机处理成更适合人眼观察或仪器检测的图像的技术.嵌入式视觉技术是使用摄像机和计算机代替人眼对目标进行识别,跟踪和测量的技术.因此.数字图像处理技术和嵌入式视觉 ...

  4. 【数字图像处理】C++读取、旋转和保存bmp图像文件编程实现

    通过我这些天用C++读写bmp图像的经历,摸索再摸索,终于对bmp文件的结构.操作有了一定的了解,下面就大概介绍bmp图片纯C++的读取.旋转和保存的实现过程. 要用C++读取bmp图片文件,首先要弄 ...

  5. OpenCasCade学习笔记(三):加载显示STEP格式图片,并实现平移、缩放和旋转操作

    OpenCasCade学习笔记(三):加载显示STEP格式图片,并实现平移.缩放和旋转操作 C3DWidget.h #pragma once#include <QtWidgets/QApplic ...

  6. 【Java文件操作(六)】借助内存复制图片:ByteArrayOutputStream\ByteArrayInputStream\FileOutputStream\FileInputStream辨析

    我的博客--Java文件操作系列 [Java文件操作(一)]递归打印文件目录 [Java文件操作(二)]删除文件夹,但保留其内部文件 [Java文件操作(三)]递归复制文件夹内所有文件 [Java文件 ...

  7. Java使用thumbnailator进行图片压缩缩放裁剪水印旋转处理

    Java使用thumbnailator进行图片压缩缩放裁剪水印旋转处理 一.thumbnailator介绍 二.使用步骤 1.maven的pom.xml引入如下 2.测试代码 一.thumbnaila ...

  8. TF:利用TF读取数据操作,将CIFAR-10 数据集中的训练图片读取出来,并保存为.jpg格式

    TF:利用TF读取数据操作,将CIFAR-10 数据集中的训练图片读取出来,并保存为.jpg 格式 目录 输出结果 核心代码 输出结果 核心代码 def inputs_origin(data_dir) ...

  9. java mysql blob 存储图片,Java实现用Mysql存取图片操作实例

    1.MySQL中的BLOB类型 Mysql中可以存储大文件数据,一般使用的BLOB对象.如图片,视频等等. BLOB是一个二进制大对象,可以容纳可变数量的数据.因为是二进制对象,所以与编码方式无关.有 ...

最新文章

  1. 基于OpenCV的气体泵扫描仪数字识别系统
  2. java游戏输赢统计_java利用多线程和Socket实现猜拳游戏
  3. vb.net2019-播放声音(wav、mp3等)
  4. 鸿蒙后的时期有什么,鸿蒙系统什么时候上市 华为鸿蒙系统有多厉害?
  5. 我画了35张图,就是为了让你深入 AQS!
  6. 北京房租到底有多高? | 爬取北京海淀区一居室租房信息
  7. python 发送邮件connect none_使用python向IP地址发送邮件
  8. 解读程序员的武侠世界,顶级程序员是内外兼修的大侠,那么你呢?
  9. android网络请求库volley方法详解
  10. 高薪编程,品牌公司——人往高处走,作为程序员的你够格吗
  11. vue 为全局变量赋值_在vue项目中 如何定义全局变量 全局函数
  12. 传奇病毒劫持流量手法分析
  13. 谁在崛起,谁在没落?新一线城市竞争力盘点,用Python绘制动态图带你看懂!...
  14. P2394 yyy loves Chemistry I
  15. ubuntu服务器搭建静态网站
  16. 跨平台web app教育设备的一些设计标准
  17. 生日悖论(python)
  18. IDEA报错:-Dmaven.multiModuleProjectDirectory system property is not set.
  19. 初探Log4j2-yaml配置坑
  20. ecshop支付宝付款成功后台显示未付款

热门文章

  1. 思科路由交换学习笔记 - CCNP CCIE.安全DMVPN
  2. python tkinter 安装_详解python tkinter模块安装过程
  3. Excel一键按背景颜色统计个数的操作
  4. 【從零開始學日文】#1 日語50音的發音和寫法簡單教學!(平假名篇)
  5. 必看!今年端午高速不免费,这份出行指南请收下
  6. 线下沙龙丨瑞云“遇·建”-上海站建筑可视化技术沙龙活动圆满落幕!
  7. 快手普通主播怎么变现赚钱,掌握以下几点即可丨国仁网络资讯
  8. 广度优先搜索以及C++实现
  9. 史上最萌挑战现身海天蚝油《挑战不可能之加油中国》
  10. VBA(10)导入图片,但是多文件夹例子