通过鼠标位置改变图像ColorModel对象索引,从而实现图像像素自动变化

BufferedImage 由图像数据的 ColorModel 和 Raster 组成。Raster 的 SampleModel 中 band 的数量和类型必须与 ColorModel 所要求的数量和类型相匹配,以表示其颜色和 alpha 分量。所有 BufferedImage 对象的左上角坐标都为 (0, 0)。因此,用来构造 BufferedImage 的任何 Raster 都必须满足:minX=0 且 minY=0。

此类依靠 Raster 的数据获取方法、数据设置方法,以及 ColorModel 的颜色特征化方法。

package chapter2;

import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import java.awt.image.*;

/**
* Created by LENOVO on 18-1-27.
*/
public class BufferedImageDemo extends JPanel implements MouseMotionListener{
private BufferedImage image = null;
private int width = 350;
private int height = 350;
public BufferedImageDemo(){
image = createImage();
addMouseMotionListener(this);
}

@Override
public void mouseDragged(MouseEvent e) {

}

@Override
public void mouseMoved(MouseEvent e) {
//创建新的图片
image = new BufferedImage(createColorModel(e.getX()),image.getRaster(),false,null);
repaint();
}
public void paintComponent(Graphics g){
Graphics2D g2d = (Graphics2D) g.create();
if(image != null){
g2d.drawImage(image,2,2,width,height,null);
}
}
//颜色特征获取
private static ColorModel createColorModel(int n){
byte[] r = new byte[16];
byte[] g = new byte[16];
byte[] b = new byte[16];
for(int i=0;i<r.length;i++){
r[i] = (byte) n;
g[i] = (byte) n;
b[i] = (byte) n;
}
return new IndexColorModel(4,16,r,g,b);
}

private BufferedImage createImage(){
byte[] pixels = new byte[width*height];
/*
* public DataBufferByte(byte[] dataArray, int size, int offset)
使用指定数组、大小和偏移量构造具有单个存储单元且基于字节的 DataBuffer。dataArray
至少必须有 offset + size 个元素。此 DataBuffer 的访问器只能使用 offset 到 offset + size - 1 个元素。
* */
DataBuffer dataBuffer = new DataBufferByte(pixels,width*height,0);
//SampleModel为抽象类,压缩的样本数据:SinglePixelPackedSampleModel实现类
//将多个样本打包到一个元素中去
/*
* public SinglePixelPackedSampleModel(int dataType,int w, int h,int[] bitMasks)
* dataType - 存储样本使用的数据类型。
w - 所描述的图像数据区域的宽度(以像素为单位)。
h - 所描述的图像数据区域的高度(以像素为单位)。
bitMasks - 所有 band 的位掩码。
* */
SampleModel sampleModel = new SinglePixelPackedSampleModel(DataBuffer.TYPE_BYTE,width,height,new int[]{(byte)0xf});
//null代表位置为(0,0)
WritableRaster raster = Raster.createWritableRaster(sampleModel,dataBuffer,null);
return new BufferedImage(createColorModel(0),raster,false,null);
}

public static void main(String args[]){
JFrame jf = new JFrame("BufferedImage Demo");
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jf.getContentPane().setLayout(new BorderLayout());
jf.getContentPane().add(new BufferedImageDemo(),BorderLayout.CENTER);
jf.setPreferredSize(new Dimension(380,380));
jf.pack();
jf.setVisible(true);
}
}

Java——BufferedImage操作实例的更多相关文章

  1. Java最全文件操作实例汇总

    本文实例汇总了Java文件操作.分享给大家供大家参考,具体如下: 1.创建文件夹 ? 1 2 3 4 5 6 7 8 9 10 11 //import java.io.*; File myFolder ...

  2. java比较日期大小及日期与字符串的转换【SimpleDateFormat操作实例】

    java比较日期大小及日期与字符串的转换[SimpleDateFormat操作实例] package com.ywx.test; import java.text.ParseException; im ...

  3. java 流操作对文件的分割和合并的实例详解_java - JAVA

    文章来源:嗨学网 敏而好学论坛www.piaodoo.com 欢迎大家相互学习 java 流操作对文件的分割和合并的实例详解 学习文件的输入输出流,自己做一个小的示例,对文件进行分割和合并. 下面是代 ...

  4. Java文件操作源码大全

    Java文件操作源码大全 1.创建文件夹 52.创建文件 53.删除文件 54.删除文件夹 65.删除一个文件下夹所有的文件夹 76.清空文件夹 87.读取文件 88.写入文件 99.写入随机文件 9 ...

  5. java BufferedImage 合成多张图片 - 因为JPEGImageEncoder 不能用

    java BufferedImage 合成多张图片 public void createPicTwo2(int x,int y) {     try     {       //读取第一张图片    ...

  6. JAVA上百实例源码以及开源项目

    简介 笔者当初为了学习JAVA,收集了很多经典源码,源码难易程度分为初级.中级.高级等,详情看源码列表,需要的可以直接下载! 这些源码反映了那时那景笔者对未来的盲目,对代码的热情.执着,对IT的憧憬. ...

  7. 安卓 SQLite数据库操作实例

    前段时间写了个安卓平台下SQLite数据库操作的实例 ,一直没得时间总结 ,今天把它弄出来了. 在Android 运行时环境包含了完整的 SQLite. 首先介绍一下SQLite这个数据库: SQLi ...

  8. 在安卓开发中使用SQLite数据库操作实例

    前段时间写了个安卓平台下SQLite数据库操作的实例 ,一直没得时间总结 ,今天把它弄出来了. 在Android 运行时环境包含了完整的 SQLite. 首先介绍一下SQLite这个数据库: SQLi ...

  9. JAVA字符串操作 (转)

    JAVA字符串操作 原帖地址:http://blog.163.com/hn_myj@126/blog/static/50555635200861133942947/ 参考:http://blog.cs ...

随机推荐

  1. K8S in Action

    1,容器的概念 镜像 镜像仓库 容器 镜像层:Docker镜像由多层构成.好处:网络分发效率,减少镜像的存储空间 1.2 k8s 主节点 ,它承载着 Kubernetes 控制和管理整个集群系统的控制 ...

  2. UVa 129 Krypton Factor (DFS && 回溯)

    题意 : 如果一个字符串包含两个相邻的重复子串,则称它是“容易的串”,其他串称为“困难的 串”.例如,BB.ABCDACABCAB.ABCDABCD都是容易的串,而D.DC.ABDAB. CBABCB ...

  3. wordcloud:让你的词语像云朵一样美

    介绍   对文本中出现频率较高的关键词给予视觉化的显示 使用 python import jieba import codecs import wordcloud file = r"C:\U ...

  4. BZOJ 1022 Luogu P4279 [SHOI2008]小约翰的游戏 (博弈论)

    题目链接: (bzoj) https://www.lydsy.com/JudgeOnline/problem.php?id=1022 (luogu) https://www.luogu.org/pro ...

  5. sun.misc.BASE64Decoder 替代

    加密解密经常用到sun.misc.BASE64Decoder处理,编译时会提示: sun.misc.BASE64Decoder是内部专用 API, 可能会在未来发行版中删除 解决办法: Java8以后 ...

  6. ubuntu16虚拟机迁移/移动/复制后无法上网

    修改grub配置 如果没有网卡,需要配置 sudo vi /etc/default/grub 将 GRUB_CMDLINE_LINUX="" 修改为 GRUB_CMDLINE_LI ...

  7. Codeforces Aim Tech Round4 (Div2) D

    题目链接: 题意: 给你一个严格升序的单链表,但是是用数组来存放的.对于每一个位置来说,你可以知道这个位置的值和下一个的位置.你每一个可以询问一个位置,机器会告诉你这个位置的值,和下一个位置的指针.要 ...

  8. HTTP协议初步认识

    1.基本概念: HTML:HyperText Transfer Protocol,中文名:超文本传输协议,基于请求/响应模式,基于TCP/IP协议,是一种,无连接,无状态协议: 2.HTTP传输过程: ...

  9. leetcode206 反转链表 两种做法(循环,递归)

    反转链表 leetcode206 方法1 循环 public ListNode reverseList(ListNode head) { if (head == null || head.next = ...

  10. 阶段2 JavaWeb+黑马旅游网_15-Maven基础_第3节 maven标准目录结构和常用命令_07maven常用命令

    以给的hellowordl的的代码为例. src/main/java下,这是主业务逻辑代码 里面的内容只有一个jsp的跳转 测试包下: 里面很简单的就输出了一句话 复制项目的目录 先cd进入复制的这个 ...