Java實作圖片渲染
- 方法改進
- ImageUI
- ImageListener
- ImageUtils
- 演示影片
方法改進
緊接上一篇實作圖片渲染鏈接: 圖片渲染(影像編碼原理).
可以發現:只前在繪畫圖片的時候速度非常的慢,那是因為每次只要一獲得像素就立即將其繪畫出來,
g.setColor(color);
g.fillRect(i, j,1, 1)
在記憶體中執行代碼后,會向GPU請求重繪螢屏,一張圖片有成千上萬個像素,那么螢屏就會連續重繪很多次,速度非常慢,例如,如果電腦螢屏的重繪率是60赫茲的話,意味著一秒鐘螢屏會重繪60次,放到這里來講的話,一秒鐘最多顯示60個像素,對于解析度極高的圖片,要加載出來,可想而知等的時間也就會越久,
所以,就要用一種方法一次性將所有的像素畫出來,BufferedImage是一個帶緩沖區影像類,主要作用是將一幅圖片加載到記憶體中(BufferedImage生成的圖片在記憶體里有一個影像緩沖區,利用這個緩沖區我們可以很方便地操作這個圖片)
在請求重繪螢屏之前,現將所有的像素設定完畢,然后一次性將緩沖區的像素全部畫出來(重繪一次螢屏),有兩種方法來設定緩沖區,
第一:直接設定緩沖區相應位置像素的RGB值,
實作如下:
//繪畫原圖改進方法
public BufferedImage paint1(Graphics g,int[][] arrpixel)
{
BufferedImage buffimage=new BufferedImage(arrpixel.length, arrpixel[0].length,BufferedImage.TYPE_INT_RGB);
for(int i=0;i<arrpixel.length;i++)
{
for(int j=0;j<arrpixel[0].length;j++)
{
int value=arrpixel[i][j];
buffimage.setRGB(i, j, value);//一次性將所有像素存盤完成
}
}
g.drawImage(buffimage, 0, 0, null);//一次性畫完
return buffimage;
}
第二:通過緩沖區獲得畫筆,將畫筆賦相應的RGB值,然后通過fillRect方法來填充矩形小像素,這種方法還可以方便我們實作渲染(如后面的馬賽克等)
實作如下:
//原圖改進方法
public BufferedImage paint1(Graphics g,int[][] arrpixel)
{
BufferedImage buffimage=new BufferedImage(arrpixel.length, arrpixel[0].length,BufferedImage.TYPE_INT_RGB);
Graphics ng=buffimage.getGraphics();
for(int i=0;i<arrpixel.length;i++)
{
for(int j=0;j<arrpixel[0].length;j++)
{
int value=arrpixel[i][j];
if(i==0&&j==0)
{ System.out.println("arrpixel:"+value);}
ng.setColor(new Color(value));
ng.fillRect(i, j, 1, 1);
}
}
g.drawImage(buffimage, 0, 0, null);
}
之后就可以把其他的渲染方法逐個改進,以下是圖片渲染程式的源代碼,
ImageUI
public class ImageUI extends JPanel {
String []bt= {"原圖","方形馬賽克","灰度","二值化","輪廓檢測","油畫繪制","拖動原圖馬賽克","拖動彩色馬賽克","截圖","放大","縮小","撤回上一步","清空圖片"};
ImageListener listener=new ImageListener();//什么時候static final
JFrame nj=new JFrame();//截圖確認視窗
public void initUI()
{
JFrame jf=new JFrame();
jf.setSize(1500,780);
jf.setTitle("圖片處理");
jf.setDefaultCloseOperation(3);
jf.setLocationRelativeTo(null);
//按鈕功能區面板
JPanel jp1=new JPanel();
jp1.setBackground(new Color(0xafeeee));
Dimension dm=new Dimension(200,780);
jp1.setPreferredSize(dm);
Dimension btdm=new Dimension(190,40);
for(int i=0;i<bt.length;i++)
{
JButton jb =new JButton(bt[i]);
jb.setPreferredSize(btdm);
jb.setBackground(Color.white);
Font font= new Font("黑體",Font.BOLD,20);
jb.setFont(font);
jb.setForeground(new Color(0x000080));
jb.setBackground(new Color(0xf0fff0));
jb.addActionListener(listener);
jp1.add(jb);
}
//繪圖區jframe默認邊框布局
this.setBackground(new Color(0xffffe0));
jf.add(jp1,BorderLayout.EAST);
jf.add(this,BorderLayout.CENTER);
this.addMouseListener(listener);
this.addMouseMotionListener(listener);
this.addKeyListener(listener);
jf.setVisible(true);
//從jp2 獲得畫筆
Graphics g=jf.getRootPane().getGraphics();
listener.setgraphics(g);
listener.setjpanel(this);
nj.setTitle("提示");
nj.setSize(300, 150);
//nj.setDefaultCloseOperation(3);
//這里彈出視窗點叉不能設定關閉程式,否則主界面也會跟著關閉
nj.setLocationRelativeTo(jf);
nj.setResizable(false);
JLabel txt =new JLabel("是否確認截圖",JLabel.CENTER);
Font fnt= new Font("黑體",Font.BOLD,30);
txt.setFont(fnt);
nj.setLayout(new FlowLayout());
nj.add(txt);
Font fnt2=new Font("黑體", Font.CENTER_BASELINE, 15);
JButton bt =new JButton("確認");
bt.addActionListener(listener);
bt.setPreferredSize(new Dimension(100, 30));
bt.setFont(fnt2);
nj.add(bt);
JButton bt2=new JButton("取消");
bt2.addActionListener(listener);
bt2.setPreferredSize(new Dimension(100, 30));
bt2.setFont(fnt2);
nj.add(bt2);
nj.addWindowListener(listener);
}
@Override
public void paint(Graphics g) {
// TODO Auto-generated method stub
super.paint(g);
System.out.println("fresh"+!listener.freshbuff.isEmpty());
if( !listener.freshbuff.isEmpty())
{
BufferedImage top=( BufferedImage)listener.freshbuff.peek();
g.drawImage(top,0,0,top.getWidth(),top.getHeight() ,null);
System.out.println("呼叫paint");
}
}
public void clear(Graphics g)
{
super.paint(g);
}
public static void main(String[] args) {
new ImageUI().initUI();
}
}
ImageListener
#前提說明:
①如果一個類需要的介面太多,且介面中的方法又有很
多,且大部分無用,而這個類又不需要繼承,那么就可以考慮做一個工具類——實作所有的介面, 然后用所需的類繼承這個工具類,選擇性的重寫方法,
這里監聽器類為ImageListener,繼承監聽器工具類ListenerUtils ,選擇性重寫介面方法:
public class ImageListener extends ListenerUtils
{
//選擇性重寫
... ...
}
public class ListenerUtils implements ActionListener,MouseListener,MouseMotionListener
,KeyListener,ChangeListener,WindowListener{
@Override
public void stateChanged(ChangeEvent e) {
// TODO Auto-generated method stub
}
... ... ... ... ..
②為了更好得實作回傳上一步功能,定義了兩個BufferedImage堆疊,考慮到,視窗改變執行的peek()操作,回傳上一步執行的是pop()操作,所以用一個堆疊不容易將功能正確實作,(讀者也可以自己定義不同的資料型別存盤BufferedImage,可能會更加方便)
重繪堆疊:
視窗改變大小實作圖片重繪,
public Stack<BufferedImage> freshbuff=new Stack<BufferedImage>();
操作堆疊:
記錄每一次的執行結果,以實作回傳上一步功能,
public Stack<BufferedImage> buffstack =new Stack<BufferedImage>();
具體代碼如下:
public class ImageListener extends ListenerUtils {
int[][] imgarr;
String btn="";
String path="E:\\java\\eclipse\\eclipse javaee\\workspace\\Yu java\\66.jpg";
private Graphics g;
ImageUtils imageff;
ImageUI jp;
public Stack<BufferedImage> buffstack =new Stack<BufferedImage>();
public Stack<BufferedImage> freshbuff=new Stack<BufferedImage>();
int index;
int p_x,p_y;
int r_x,r_y;
int d_x,d_y;
public void setgraphics(Graphics g)
{
this.g=g;
}
public void setjpanel(ImageUI jp)
{
this.jp=jp;
}
//初始化監聽器
ImageListener()
{
imageff=new ImageUtils();
imgarr=imageff.getImagePixel(path);
System.out.println("初始化成功"+imgarr.length);
}
@Override
public void windowClosing(WindowEvent e) {
// TODO Auto-generated method stub
super.windowClosed(e);
jp.paint(g);
}
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
System.out.println("當前"+btn);
//System.out.println("呼叫actionperformed");
btn=e.getActionCommand();
if(btn.equals("原圖"))
{
jp.clear(g);
BufferedImage img= imageff.paint1(g,imgarr);
buffstack.push(img);
freshbuff.push(img);
System.out.println("堆疊頂"+buffstack.peek().getWidth());
System.out.println("堆疊內元素數"+buffstack.size());
}
else if(btn.equals("方形馬賽克"))
{
jp.clear(g);
imageff.paint2(g, freshbuff,buffstack);
}
else if(btn.equals("灰度"))
{
jp.clear(g);
imageff.paint3(g, freshbuff,buffstack);
}
else if(btn.equals("二值化"))
{
jp.clear(g);
imageff.paint4(g, freshbuff,buffstack);
}
else if(btn.equals("輪廓檢測"))
{
jp.clear(g);
imageff.paint5(g, freshbuff,buffstack);
}
else if(btn.equals("油畫繪制"))
{
jp.clear(g);
imageff.paint6(g, freshbuff,buffstack);
}
else if(btn.equals("放大"))
{
jp.clear(g);
imageff.piant7(g, freshbuff,buffstack);
jp.paint(g);
}
else if(btn.equals("縮小"))
{
jp.clear(g);
imageff.paint8(g,freshbuff,buffstack );
jp.paint(g);
}
else if(btn.equals("清空圖片"))
{
jp.clear(g);
imageff.withdraw(g,jp,buffstack,freshbuff);
}
else if (btn.equals("撤回上一步"))
{
jp.clear(g);
freshbuff.push(imageff.backward(buffstack,g));
}
else if(btn.equals("確認"))
{
jp.clear(g);
imageff.paint12(g, freshbuff, buffstack,p_x,p_y,r_x,r_y);
System.out.println("截圖完成");
jp.nj.dispose();
}
else if(btn.equals("取消"))
{
jp.nj.dispose();
jp.paint(g);
}
}
@Override
public void mousePressed(MouseEvent e) {
// TODO Auto-generated method stub
super.mousePressed(e);
p_x=e.getX();
p_y=e.getY();
d_x=e.getX();
d_y=e.getY();
}
@Override
public void mouseReleased(MouseEvent e) {
// TODO Auto-generated method stub
super.mouseReleased(e);
r_x=e.getX();
r_y=e.getY();
if(btn.equals("截圖"))
{
Graphics2D g2d=(Graphics2D)g;
g2d.setStroke(new BasicStroke(2.5f, BasicStroke.CAP_BUTT,
BasicStroke.JOIN_ROUND, 3.5f, new float[] { 10, 5 }, 0f));
g2d.setColor(Color.GREEN);
g2d.drawRect(Math.min(p_x, r_x), Math.min(p_y, r_y),Math.abs(r_x-p_x) ,Math.abs(r_y-p_y));
jp.nj.setVisible(true);
}
}
@Override
public void mouseDragged(MouseEvent e) {
// TODO Auto-generated method stub
super.mouseDragged(e);
int x=e.getX();
int y=e.getY();
if(btn.equals("拖動原圖馬賽克"))
{
if(Math.abs(x-d_x)>10||Math.abs(y-d_y)>10)
{ imageff.paint9(g,freshbuff,buffstack,x,y);
d_x=x;d_y=y;
}
}
if(btn.equals("拖動彩色馬賽克"))
{
if(Math.abs(x-d_x)>10||Math.abs(y-d_y)>10)
{ imageff.paint10(g,freshbuff,buffstack,x,y);
d_x=x;d_y=y;
}
}
}
@Override
public void keyPressed(KeyEvent e) {
// TODO Auto-generated method stub
super.keyPressed(e);
}
}
ImageUtils
圖片的渲染代碼:
#說明
這里定義一個當前類的布爾全域變數flag,用來判斷在回傳上一步這個操作中,應該是對操作堆疊buffstack執行pop()操作還是peek(),例如:因為操作堆疊中堆疊頂還存著當前畫圖結果,如果堆疊中元素>1的話,得執行兩次pop()方法才能回傳上一步,這樣就得按兩次按鈕才能實作理想效果,flag等于true表示當前渲染過后的圖片還在操作堆疊中,就得執行兩次pop,
public class ImageUtils {
boolean flag=true;
String name="";
//讀取檔案,獲得圖片像素
public int[][] getImagePixel(String path)
{
//讀取檔案的資料
File file =new File(path);
//imageIO操作將圖片檔案的輸入輸出,
//讀取檔案資料
BufferedImage buffimage=null;
try {
buffimage=ImageIO.read(file);
}catch (IOException e) {
e.printStackTrace();
System.err.println("影像讀取失敗");
}
//獲取緩沖圖片的大小,初始化保存像素值得二維陣列
int w=buffimage.getWidth();
int h=buffimage.getHeight();
int [][]arrPixel=new int[w][h];
for(int i=0;i<w;i++)
{
for(int j=0;j<h;j++)
{
int pixel=buffimage.getRGB(i, j);
arrPixel[i][j]=pixel;
}
}
return arrPixel;
}
//清空圖片
public void withdraw(Graphics g,ImageUI jp,Stack<BufferedImage> buff,Stack<BufferedImage> freshbuff)
{
jp.clear(g);
buff.clear();
freshbuff.clear();
flag=true;
}
//原圖方法
public BufferedImage paint1(Graphics g,int[][] arrpixel)
{
BufferedImage buffimage=new BufferedImage(arrpixel.length, arrpixel[0].length,BufferedImage.TYPE_INT_RGB);
Graphics ng=buffimage.getGraphics();
for(int i=0;i<arrpixel.length;i++)
{
for(int j=0;j<arrpixel[0].length;j++)
{
int value=arrpixel[i][j];
if(i==0&&j==0)
{ System.out.println("arrpixel:"+value);}
ng.setColor(new Color(value));
ng.fillRect(i, j, 1, 1);
//buffimage.setRGB(i, j, value);//一次性將所有像素存盤完成
}
}
g.drawImage(buffimage, 0, 0, null);
flag=true;
return buffimage;
}
//方形馬賽克改進演算法
public void paint2(Graphics g,Stack<BufferedImage> freshbuff,Stack<BufferedImage> stackbuff)
{
if(!freshbuff.isEmpty())
{
BufferedImage buff=freshbuff.peek();
int newwidth=buff.getWidth();
int newheight=buff.getHeight();
BufferedImage buffimage=new BufferedImage(newwidth,newheight,BufferedImage.TYPE_INT_RGB);
Graphics ng=buffimage.getGraphics();
for(int i=0;i<newwidth;i+=10)
{
for(int j=0;j<newheight;j+=10)
{
int rgb=buff.getRGB(i, j);
ng.setColor(new Color(rgb));
ng.fillRect(i, j, 10, 10);
}
}
g.drawImage(buffimage, 0, 0, null);
flag=true;
freshbuff.push(buffimage);
stackbuff.push(buffimage);
}
}
//灰度方法
public void paint3(Graphics g,Stack<BufferedImage> freshbuff,Stack<BufferedImage> stackbuff)
{
if(!freshbuff.isEmpty())
{
BufferedImage buff=freshbuff.peek();
int newwidth=buff.getWidth();
int newheight=buff.getHeight();
BufferedImage buffimage=new BufferedImage(newwidth,newheight,BufferedImage.TYPE_INT_RGB);
for(int i=0;i<buff.getWidth();i++)
{
for(int j=0;j<buff.getHeight();j++)
{
int value =buff.getRGB(i, j);
int red=(value>>16)&0xFF;
int green=(value>>8)&0xFF;
int blue=(value>>0)&0xFF;
int gray =(red+green+blue)/3;
int newvalue=(gray<<16)+(gray<<8)+(gray<<0);
buffimage.setRGB(i, j, newvalue);//一次性將所有像素存盤完成
}
}
g.drawImage(buffimage, 0, 0, null);
flag=true;
freshbuff.push(buffimage);
stackbuff.push(buffimage);
}
}
//二值化方法
public void paint4(Graphics g,Stack<BufferedImage> freshbuff,Stack<BufferedImage> stackbuff)
{
if(!freshbuff.isEmpty())
{
BufferedImage buff=freshbuff.peek();
int newwidth=buff.getWidth();
int newheight=buff.getHeight();
BufferedImage buffimage=new BufferedImage(newwidth,newheight,BufferedImage.TYPE_INT_RGB);
for(int i=0;i<newwidth;i++)
{
for(int j=0;j<newheight;j++)
{
int value =buff.getRGB(i, j);
int red=(value>>16)&0xFF;
int green=(value>>8)&0xFF;
int blue=(value>>0)&0xFF;
int gray=(int)(red*0.4+green*0.5+blue*0.6);
// int newvalue=(gray<<16)+(gray<<8)+(gray<<0);
if(gray<150)
{
buffimage.setRGB(i, j, Color.black.getRGB());
}
else
{
buffimage.setRGB(i, j, Color.white.getRGB());
}
}
}
g.drawImage(buffimage, 0, 0, null);
flag=true;
freshbuff.push(buffimage);
stackbuff.push(buffimage);
}
}
//輪廓檢測
//相鄰之間的像素點進行比較
public void paint5(Graphics g ,Stack<BufferedImage> freshbuff,Stack<BufferedImage> stackbuff)
{
if(!freshbuff.isEmpty())
{
BufferedImage buff=freshbuff.peek();
int newwidth=buff.getWidth();
int newheight=buff.getHeight();
BufferedImage buffimage=new BufferedImage(newwidth,newheight,BufferedImage.TYPE_INT_RGB);
for(int i=0;i<newwidth-2;i++)
{
for(int j=0;j<newheight-2;j++)
{
int value =buff.getRGB(i, j);
int red=(value>>16)&0xFF;
int green=(value>>8)&0xFF;
int blue=(value>>0)&0xFF;
int valuen=buff.getRGB(i+2, j+2);
int redn=(valuen>>16)&0xFF;
int greenn=(valuen>>8)&0xFF;
int bluen=(valuen>>0)&0xFF;
//int gray =(red+green+blue)/3;
int gray =(int)(red*0.41+green*0.28+blue*0.31);
int grayn =(int)(redn*0.41+greenn*0.28+bluen*0.31);
if(Math.abs(gray-grayn)>15){
buffimage.setRGB(i, j, Color.pink.getRGB());
}else{
buffimage.setRGB(i, j, Color.white.getRGB());
}
}
}
g.drawImage(buffimage, 0, 0, null);
flag=true;
freshbuff.push(buffimage);
stackbuff.push(buffimage);
}
}
//油畫演算法
public void paint6(Graphics g ,Stack<BufferedImage> freshbuff,Stack<BufferedImage> stackbuff)
{
if(!freshbuff.isEmpty())
{
BufferedImage buff=freshbuff.peek();
int newwidth=buff.getWidth();
int newheight=buff.getHeight();
BufferedImage buffimage=new BufferedImage(newwidth,newheight,BufferedImage.TYPE_INT_RGB);
Random random = new Random();
int size=random.nextInt(5);
for(int i=0;i<newwidth;i+=3)
{
for(int j=0;j<newheight;j+=3)
{
int pixel=buff.getRGB(i, j);
int h=i,m=j;
for(int k=0;k<3;k++)
{
for(int p=0;p<3;p++)
{
if(h<newwidth&&m<newheight)
buffimage.setRGB(h,m++,pixel);
}
h++;
m=j+size;
}
}
}
g.drawImage(buffimage, 0, 0, null);
flag=true;
freshbuff.push(buffimage);
stackbuff.push(buffimage);
}
}
//截圖
public void paint12(Graphics g,Stack<BufferedImage> freshbuff,Stack<BufferedImage> stackbuff,int px,int py,int rx,int ry)
{
if(!freshbuff.isEmpty())
{
BufferedImage buff=freshbuff.peek();
int newwidth=Math.abs(px-rx);
int newheight=Math.abs(py-ry);
BufferedImage buffimage=new BufferedImage(newwidth, newheight, BufferedImage.TYPE_INT_RGB);
int minx=Math.min(rx, px);
int maxx=Math.max(rx, px);
int miny=Math.min(ry, py);
int maxy=Math.max(ry, py);
System.out.println("minx"+minx+"maxx"+maxx+"miny"+miny+"maxy"+maxy);
int h=0,m=0;
for(int i=minx;i<=maxx;i++)
{
for(int j=miny;j<=maxy;j++)
{
int rgb=buff.getRGB(i, j);
if(h<newwidth&&m<newheight)
{
buffimage.setRGB(h, m++, rgb);
}
}
h++;
m=0;
}
g.drawImage(buffimage, 0, 0, null);
flag=true;
freshbuff.push(buffimage);
stackbuff.push(buffimage);
}
}
//放大
public void piant7(Graphics g,Stack<BufferedImage> freshbuff,Stack<BufferedImage> stackbuff)
{
if(!freshbuff.isEmpty())
{
BufferedImage buff=freshbuff.peek();
int newwidth=buff.getWidth()+(int)((buff.getWidth()*20)/100);
int newheight=buff.getHeight()+(int)((buff.getHeight()*20)/100);
BufferedImage buffimage=new BufferedImage(newwidth, newheight, BufferedImage.TYPE_INT_RGB);
Graphics ng=buffimage.getGraphics();
ng.drawImage(buff,0,0, newwidth, newheight, null);
g.drawImage(buffimage,0,0, null);
flag=true;
freshbuff.push(buffimage);
stackbuff.push(buffimage);
}
}
//縮小
public void paint8(Graphics g,Stack<BufferedImage> freshbuff,Stack<BufferedImage> stackbuff)
{
if(!freshbuff.isEmpty())
{
BufferedImage buff=freshbuff.peek();
int newwidth=(int)((buff.getWidth()*80)/100);
int newheight=(int)((buff.getHeight()*80)/100);
BufferedImage buffimage=new BufferedImage(newwidth, newheight,BufferedImage.TYPE_INT_RGB );
Graphics ng=buffimage.getGraphics();
ng.drawImage(buff, 0,0,newwidth, newheight, null);//一定要注明起點0,0
g.drawImage(buffimage,0,0, null);
flag=true;
freshbuff.push(buffimage);
stackbuff.push(buffimage);
}
}
//拖動馬賽克
public void paint9(Graphics g,Stack<BufferedImage> freshbuff,Stack<BufferedImage> stackbuff,int x,int y)
{
if(!stackbuff.isEmpty())
{
BufferedImage buff= stackbuff.peek();
BufferedImage buffimage=new BufferedImage(buff.getWidth(), buff.getHeight(), BufferedImage.TYPE_INT_RGB);
if(buff.getWidth()<x||buff.getHeight()<y)
return;
int rgb=buff.getRGB(x, y);
for(int i=0;i<buff.getWidth();i++)
{
for(int j=0;j<buff.getHeight();j++)
{
int RGB=buff.getRGB(i, j);
buffimage.setRGB(i,j , RGB);
}
}
for(int i=x;i<x+20;i++)
{
for(int j=y;j<y+20;j++)
{
if(i<buffimage.getWidth()&&j<buffimage.getHeight())
buffimage.setRGB(i, j, rgb);
}
}
g.drawImage(buffimage, 0, 0,buffimage.getWidth(),buffimage.getHeight(), null);
freshbuff.push(buffimage);
stackbuff.push(buffimage);
System.out.println("stack"+stackbuff.size());
flag=true;
}
}
//拖動彩色馬賽克
public void paint10(Graphics g,Stack<BufferedImage> freshbuff,Stack<BufferedImage> stackbuff,int x,int y)
{
if(!stackbuff.isEmpty())
{
BufferedImage buff= stackbuff.peek();
if(buff.getWidth()<x||buff.getHeight()<y)
return;
BufferedImage buffimage=new BufferedImage(buff.getWidth(), buff.getHeight(), BufferedImage.TYPE_INT_RGB);
for(int i=0;i<buff.getWidth();i++)
{
for(int j=0;j<buff.getHeight();j++)
{
int RGB=buff.getRGB(i, j);
buffimage.setRGB(i,j , RGB);
}
}
Random ram=new Random();
int rgb=ram.nextInt(0xffffff);
Graphics ng=buffimage.getGraphics();
ng.setColor(new Color(rgb));
ng.fillOval(x, y, 20, 20);
g.drawImage(buffimage, 0, 0,buffimage.getWidth(),buffimage.getHeight(), null);
freshbuff.push(buffimage);
stackbuff.push(buffimage);
System.out.println("stack"+stackbuff.size());
flag=true;
}
}
//回傳上一步
public BufferedImage backward(Stack<BufferedImage> buff,Graphics g)
{
BufferedImage top=null;
if(!buff.isEmpty())
System.out.println("stack"+buff.size());
{
if(buff.size()==1)
{
top=buff.peek();
g.drawImage(top,0,0,top.getWidth(),top.getHeight(),null);
}
else
{
if(flag==true&&buff.size()>1)
{
top=buff.pop();
if(buff.size()==1)
{
top=buff.peek();
g.drawImage(top,0,0,top.getWidth(),top.getHeight(),null);
}
else
{
top=buff.pop();
g.drawImage(top,0,0,top.getWidth(),top.getHeight(),null);
}
}
if(flag==false&&buff.size()>1)
{
top=buff.pop();
g.drawImage(top,0,0,top.getWidth(),top.getHeight(),null);
}
}
}
flag=false;
System.out.println("stack"+buff.size());
return top;
}
}
演示影片
圖片處理 2021-07-21 23-18-15
由于錄屏問題,彈出界面沒顯示,截屏如下

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/289705.html
標籤:其他
