1、实现抽象类AbstractBufferedImageOp ——————读取和写入像素数据操作

package chapter4;

import java.awt.image.BufferedImage;

public class AbstractBufferedImageOp {

//读取像素数据
public int[] getRGB(BufferedImage image,int x, int y, int width, int height,int[] pixels){
int type = image.getType();
if(type == BufferedImage.TYPE_INT_ARGB || type == BufferedImage.TYPE_INT_RGB){
return (int[]) image.getRaster().getDataElements(x,y,width,height,pixels);
}else{
return image.getRGB(x,y,width,height,pixels,0,width);
}
}
//写入像素数据
public void setRGB(BufferedImage image,int x, int y, int width, int height, int[] pixels){
int type =image.getType();
if(type == BufferedImage.TYPE_INT_ARGB || type == BufferedImage.TYPE_INT_RGB){
image.getRaster().setDataElements(x,y,width,height,pixels);
}else {
image.setRGB(x,y,width,height,pixels,0,width);
}
}
public BufferedImage creatCompatibleDestImage(BufferedImage src,BufferedImage dest){

return new BufferedImage(src.getWidth(),src.getHeight(),BufferedImage.TYPE_INT_RGB);
}
}

2、实现照片泛黄代码————SepiaToneFilter类

package chapter4;

import java.awt.image.BufferedImage;

public class SepiaToneFilter extends AbstractBufferedImageOp{
public BufferedImage filter(BufferedImage src, BufferedImage dest){
int width = src.getWidth();
int height = src.getHeight();

if(dest == null){
dest = creatCompatibleDestImage(src,null);
}
int[] inpixels = new int[width*height];
int[] outpixels = new int[width*height];
getRGB(src,0,0,width,height,inpixels);
int index = 0;
for(int row=0;row<height;row++){
int ta=0, tr=0, tg=0,tb=0;
for(int col=0;col<width;col++){
index = row*width+col;
ta = (inpixels[index] >> 24) & 0xff;
tr = (inpixels[index] >> 16) & 0xff;
tg = (inpixels[index] >> 8) & 0xff;
tb = (inpixels[index]) & 0xff;

int fr = (int) colorBlend(noise(),(tr*0.393)+(tg*0.769)+(tb*0.189),tr);
int fg = (int) colorBlend(noise(),(tr*0.349)+(tg*0.686)+(tb*0.189),tg);
int fb = (int) colorBlend(noise(),(tr*0.272)+(tg*0.534)+(tb*0.131),tb);

outpixels[index] = (ta<<24) | clamp(fr) << 16 | clamp(fg) << 8 | clamp(fb);
}
}
setRGB(dest,0,0,width,height,outpixels);
return dest;
}
//设置权重系数
public double noise(){
return Math.random()*0.5+0.5;
}
//计算新的像素值=新的像素值+原来像素值-原来像素值*权重系数
public double colorBlend(double scale, double dest, double src){
return (scale*dest+(1-scale)*src);
}
/* c<0 0
c>255 255
* 0<c<255 c
* */
public static int clamp(int c){
return c>255 ? 255:((c<0) ? 0:c);
}
public String toString(){
return "Sepia Tone Effect - Effect from Photoshop App";
}
}

3、在ImagePanel类上加入滤镜操作

package chapter4;

import javax.swing.*;
import java.awt.*;
import java.awt.image.BufferedImage;

public class ImageJPanel extends JPanel {
private static final long serialVersionUID = 1L;
private BufferedImage sourceImage;
private BufferedImage destImage;

public ImageJPanel(){}
public BufferedImage getSourceImage() {
return sourceImage;
}

public void setSourceImage(BufferedImage sourceImage) {
this.sourceImage = sourceImage;
}

public BufferedImage getDestImage() {
return destImage;
}

public void setDestImage(BufferedImage destImage) {
this.destImage = destImage;
}

public void process(){
SepiaToneFilter filter = new SepiaToneFilter();
destImage = filter.filter(sourceImage,null);
}

public void paintComponent(Graphics g){
Graphics2D g2d = (Graphics2D) g.create();
g2d.clearRect(0,0,this.getWidth(),this.getHeight());

if(sourceImage != null){
g2d.drawImage(sourceImage,0,0,sourceImage.getWidth(),sourceImage.getHeight(),null);
if(destImage != null){
g2d.drawImage(destImage,sourceImage.getWidth()+10,0,destImage.getWidth(),destImage.getHeight(),null);
}
}

}

}

4、在UI_MainUI类中运行

package chapter4;

import javax.imageio.ImageIO;
import javax.swing.*;
import javax.swing.filechooser.FileNameExtensionFilter;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

/**
* Created by LENOVO on 18-1-29.
*/
public class UI_MainUI extends JFrame implements ActionListener{
private static final long serialVersionUID = 1L;
private static final String IMG_CMD = "选择图像...";
private static final String PROCESS_CMD = "处理";

private JButton imgBtn;
private JButton processBtn;
private ImageJPanel imageJPanel;

private BufferedImage srcImage;
public UI_MainUI(){
setTitle("JFrame UI —演示");
imgBtn = new JButton(IMG_CMD);
processBtn = new JButton(PROCESS_CMD);

JPanel btnJpanel = new JPanel();
btnJpanel.setLayout(new FlowLayout(FlowLayout.RIGHT));
btnJpanel.add(imgBtn);
btnJpanel.add(processBtn);

imageJPanel = new ImageJPanel();
getContentPane().setLayout(new BorderLayout());
getContentPane().add(imageJPanel,BorderLayout.CENTER);
getContentPane().add(btnJpanel,BorderLayout.SOUTH);

setupActionListener();

}

public void setupActionListener(){
imgBtn.addActionListener(this);
processBtn.addActionListener(this);
}

@Override
public void actionPerformed(ActionEvent e) {
if(SwingUtilities.isEventDispatchThread()){
System.out.println("Event Dispatch Thred!!");
}
if(srcImage == null){

try {
JOptionPane.showMessageDialog(this,"请先选择图像源文件");
JFileChooser chooser = new JFileChooser();
chooser.showOpenDialog(null);
setFileTypeFilter(chooser);
File f = chooser.getSelectedFile();
if(f != null){
srcImage = ImageIO.read(f);
imageJPanel.setSourceImage(srcImage);//图像面板添加图像
imageJPanel.repaint();
}
} catch (IOException e1) {
e1.printStackTrace();
}
return ;
}
if (IMG_CMD.equals(e.getActionCommand())){
if(srcImage == null){

try {
JOptionPane.showMessageDialog(this,"请先选择图像源文件");
JFileChooser chooser = new JFileChooser();
chooser.showOpenDialog(null);
File f = chooser.getSelectedFile();
if(f != null){
srcImage = ImageIO.read(f);
imageJPanel.setSourceImage(srcImage);//图像面板添加图像
imageJPanel.repaint();
}
} catch (IOException e1) {
e1.printStackTrace();
}
}
}else if(PROCESS_CMD.equals(e.getActionCommand())){
imageJPanel.process();
imageJPanel.repaint();
}
}
public void setFileTypeFilter(JFileChooser chooser){
FileNameExtensionFilter filter = new FileNameExtensionFilter("JPG & PNG Images","jpg","png");
chooser.setFileFilter(filter);
}
public void openView(){
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setPreferredSize(new Dimension(800,600));
pack();
setVisible(true);
}
public static void main(String args[]){
UI_MainUI ui = new UI_MainUI();
ui.openView();
}
}

转载于:https://www.cnblogs.com/bigdream6/p/8377499.html

图像属性——老照片特效相关推荐

  1. PHP7Grafika,PHP图片处理库Grafika详细教程(3):图像属性处理

    该文章是接着上篇文章,<PHP极其强大的图片处理库Grafika详细教程(2):图像特效处理模块>,由于grafika功能太多,所以分开写,其他的点击这里 该文章主要写grafika的图像 ...

  2. PHP极其强大的图片处理库Grafika详细教程(3):图像属性处理

    该文章是接着上篇文章,<PHP极其强大的图片处理库Grafika详细教程(2):图像特效处理模块>,由于grafika功能太多,所以分开写,其他的点击这里 <1.图像基本处理> ...

  3. opencv python3 找图片色块_Python 图像处理 OpenCV (3):图像属性、图像感兴趣 ROI 区域及通道处理...

    前文传送门: 图像属性 图像属性包括行数,列数和通道数,图像数据类型,像素数等. 1. 形状:shape 图像的形状可以通过 shape 关键字进行获取,使用 shape 关键的后,获取的信息包括行数 ...

  4. 老照片特效 php,一键制作破旧复古老照片特效PS动作

    一键制作破旧复古老照片特效PS动作 动作链接:http://www.mo-yu.com/thread-3789-1-1.html 智能化是产品的表象,相对应的,用户对智能化的特征感受是多方面的,与用户 ...

  5. html表格背景图片格式,HTML表格标记教程(8):背景图像属性BACKGROUND

    HTML表格标记教程(8):背景图像属性BACKGROUND 互联网   发布时间:2008-10-17 18:56:21   作者:佚名   我要评论 为表格设置背景图像,可以使用任何的GIF或者J ...

  6. Python 数据分析三剑客之 Matplotlib(三):图例 / LaTeX / 刻度 / 子图 / 补丁等基本图像属性

    CSDN 课程推荐:<Python 数据分析与挖掘>,讲师刘顺祥,浙江工商大学统计学硕士,数据分析师,曾担任唯品会大数据部担任数据分析师一职,负责支付环节的数据分析业务.曾与联想.亨氏.网 ...

  7. Python 数据分析三剑客之 Matplotlib(二):文本描述 / 中文支持 / 画布 / 网格等基本图像属性

    CSDN 课程推荐:<Python 数据分析与挖掘>,讲师刘顺祥,浙江工商大学统计学硕士,数据分析师,曾担任唯品会大数据部担任数据分析师一职,负责支付环节的数据分析业务.曾与联想.亨氏.网 ...

  8. opencv python教程简书_OpenCV-Python系列二:常用的图像属性

    对于图像,我们经常需要知道关于图像的特殊属性,比如宽度,高度,面积,像素点数目等等,那么在opencv-python中,这些信息如何获取呢? 本文结构: 1.基本图像属性 2. 对于opencv中的特 ...

  9. FCPX插件:半调图像高级马赛克特效Yanobox Mosaic

    FCPX插件:Yanobox Mosaic 共100种半调图像高级马赛克特效,可以放到标题,图像,视频和生成器上,可以在屏幕上或屏幕外进行视频特效制作,不一样的马赛克总有你喜欢的一款哦!! 插件仅适用 ...

最新文章

  1. SAP EWM - 其他主数据 - 运输主数据-2
  2. ICML2021|超越SE、CBAM,中山大学开源SAM:无参Attention!
  3. 阿里云服务器学习笔记【远程连接、Xshell使用】
  4. tkmybatis 子查询_真假童子命符箓道长教你如何查询
  5. guns框架字典取值_10分钟搞定Guns快速开发平台
  6. Swagger原理解析
  7. Autodesk面试技术题解答
  8. linux安装pdo mysql扩展_linux下php安装pdo_mysql扩展
  9. 唐雄燕点评NFV产业进程:2016年将迎来试点年
  10. 苹果手机上网速度慢_手机信号明明满格却上不去网?4招帮你搞定它!
  11. mysql用户创建、授权
  12. repeater 实现分列(两列的简单办法)
  13. 实验五 Flash在线编程实验
  14. win10+Ubuntu18.04双系统安装后无法进入win10或者无法进入Ubuntu的解决方案
  15. 小白可以来看看磁盘与文件管理实验
  16. 微信公众号调起微信支付
  17. pandas算加权平均值_python – 为pandas中的不规则时间序列创建加权平均值
  18. 亚马逊后台付款表(Custom Transaction)详解
  19. 解决Rabbitmq连接超时问题
  20. 带你领略3D转换的魅力~

热门文章

  1. html 注释 实例,超详细的HTML !–…– 注释标签使用实例
  2. 使用PC端谷歌Chrome浏览器浏览手机网页 修改PC端谷歌Chrome浏览器UA
  3. CC00007.CloudOpenStack——|OpenStack组件.V02|——|openstack-keystone|controller节点下部署Key
  4. APICloud数据云3.0使用教程
  5. fckeditor 上传图片 php_FCKeditor上传文件重命名for php
  6. java实现数字转大写
  7. 怎么给自己的电脑连接打印机
  8. 系统集成16真题解析
  9. C#实现时间戳与标准时间的互转学习通http://www.bdgxy.com/
  10. 三维地图渲染技术工程实践 高德前端技术专家 GMTC 开讲啦