인터넷 url 이미지를 복사해서 자바 스윙의 화면으로 뿌려주기

안녕하세요

이번 시간에는 좀 재밌는 예제를 올려봅니다.

이번 예제는 먼저 결과 사진을 보면서 설명해드리겠씁니다.


먼저 화면은 위와 같습니다.

원본 이미지 파일 아래에 'pin.png' 라는 원본 파일이 있어야

아래의 목적 이미지 파일이 생성됩니다

사전에 이미지 파일을 하나 챙기세요~




목적 이미지 파일은 텍스트로 수정 가능하니

반드시 target.png 형태로 저장 될 필요는 없습니다.





중간에 Copy 버튼을 누르면 나비 모양의 pic.png 이미지가 하단에 출력이 됨과 동시에

target.png 라는 파일이 생길겁니다. 

패키지 익스플로러 창에서 F5 키 누르면 됩니다




두번째 기능은 인터넷 URL 이미지 복사 기능인데

원격 이미지 파일의 url에 제가 사전에 정의해놓은 경로가 있습니다.

바로 밑에 원격에서 Copy라는 버튼을 누르면..



아래와 같이 인터넷 이미지를 출력하게 됩니다.

자 그럼 이것을 어떻게 구현하냐 하면..

아래와 같이 하시면 됩니다.

소스 코드를 이해하시면서 봐야지 도움이 됩니다~!



public class ImageCopyGui extends JFrame {
JTextField tf1, tf2, tfUrl;
JButton btCopy, btUrlCopy; JProgressBar pb; JLabel lbImage;
FileInputStream fis; FileOutputStream fos;
File file1, file2;
public ImageCopyGui() {
super("::ImageCopyGui::");
Container cp = getContentPane();
cp.setLayout(new GridLayout(2,1));
JPanel p = new JPanel(new GridLayout(0,1));
cp.add(p);
lbImage=new JLabel("*^.^*", JLabel.CENTER);
cp.add(new JScrollPane(lbImage));
lbImage.setBorder(new LineBorder(Color.magenta));
tf1=new JTextField("pic.png"); tf2=new JTextField("target.jpg");
tfUrl=new JTextField("http://imgmovie.naver.com/design/preview01/1610/evnet_african/image//img_02.jpg");
btCopy=new JButton("Copy"); btUrlCopy=new JButton("원격에서 Copy");
pb=new JProgressBar();
p.add(tf1); p.add(tf2); p.add(tfUrl); 
JPanel p2 = new JPanel(); p.add(p2);
p2.add(btCopy); p2.add(btUrlCopy);
p.add(pb);
pb.setStringPainted(true); // 프로그레스바 몇%인지 보여줌
tf1.setBorder(new TitledBorder("원본 이미지 파일"));
tf2.setBorder(new TitledBorder("목적 이미지 파일"));
tfUrl.setBorder(new TitledBorder("원격 이미지 파일의 URL"));
btCopy.setMnemonic('C'); 
p.setBorder(new BevelBorder(BevelBorder.RAISED)); // 패널을 입체적으로 보여줌 
// 이미지를 복사하는 버튼 이벤트 리스너
btCopy.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
String srcStr = tf1.getText(); // tf1의 이미지 pic.png(원본 이미지)
String targetStr=tf2.getText(); // // tf2의 이미지 target.png(복사 될 이미지)
file1=new File(srcStr); file2= new File(targetStr);
Thread tr = new Thread(){
@Override
public void run(){
fileCopy(file1, file2); // 사용자 정의 메소드
}
};
tr.start();
}
});
// 인터넷 이미지 url 주소의 이미지를 복사하는 버튼 이벤트 리스너
btUrlCopy.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
String urlStr = tfUrl.getText();
new Thread(){
public void run(){
urlFileCopy(urlStr); // 사용자 정의 메소드
}
}.start();
}
});
setSize(500, 500);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public synchronized void fileCopy(File srcFile, File tarFile){
// 스트림 연결 => 노드 스트림 => 필터 스트림
String msg="";
long fsize=srcFile.length(); // 원본 파일의 크기를 반환
setTitle("원본 파일 크기 : "+fsize+"bytes");
//pb의 최대값을 원본 파일 크기로 잡는다.
pb.setMaximum(0); pb.setMaximum((int)fsize);
try{
fis = new FileInputStream(srcFile);
fos = new FileOutputStream(tarFile);
//BuffredInputStream으로 처리하면 더 빠르다
// 반복문 돌면서 읽어들이고 내보낸다.
int input=0, count=0;
byte[] data = new byte[1024];
// 원본 이미지 복사
while((input=fis.read(data))!=-1){
fos.write(data, 0, input);
fos.flush();
count+=input;
pb.setValue(count);
Thread.sleep(10);
}
msg=count+"bytes 카피 완료";
// 스트림 닫기
fis.close(); fos.close();
lbImage.setIcon(new ImageIcon(tarFile.getAbsolutePath()));
}catch(FileNotFoundException e){
msg="없는 파일이에요: "+e.getMessage();
}catch(InterruptedException e){
msg="Interrupted 오류"+e.getMessage();
}catch(IOException e){
msg="오류 : "+e.getMessage();
}
JOptionPane.showMessageDialog(this, msg);
}
public void urlFileCopy(String urlStr){
// throws로 하면 다른 쪽에서 예외 처리를 해줘야함
try{
java.net.URL url = new java.net.URL(urlStr);
InputStream is = url.openStream();
java.net.URLConnection con = url.openConnection();
// url에 있는 파일의 크기를 반환한다.
int fsize = con.getContentLength();
setTitle(fsize+"bytes");
// 해당 url과 노드 연결된 입력 스트림을 반환한다.
BufferedInputStream bis = new BufferedInputStream(is);
file2 = new File(tf2.getText());
fos = new FileOutputStream(file2);
BufferedOutputStream bos = new BufferedOutputStream(fos);
int input=0, count=0;
byte[] data = new byte[3000];
while((input=bis.read(data))!=-1){
bos.write(data, 0, input);
bos.flush();
count+=input;
pb.setValue(count);
Thread.sleep(10);
}
bis.close(); bos.close();
is.close(); fos.close();
lbImage.setIcon(new ImageIcon(file2.getAbsolutePath()));
}catch(MalformedURLException e){
e.printStackTrace();
}catch(Exception e){
e.printStackTrace();
}
}

public static void main(String[] args) throws IOException {
new ImageCopyGui();
}

}

댓글 없음:

댓글 쓰기