import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Color;
import java.awt.FileDialog;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Panel;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import java.awt.image.ColorModel;
import javax.swing.*;
public class ImageCanvas extends Frame implements ActionListener {
private Button openButton; // 버튼
private Image image; // 이미지
private TextField point;
//BufferedImage Bimg;
//Graphics gbuf;
public ImageCanvas() {
makeUI();
}
// UI 구성
private void makeUI() {
this.setTitle("Image Canvas");
this.setLayout(new BorderLayout());
this.setSize(800, 800);
this.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent we) {
System.exit(0);
}
}
);
// 이미지 불러오기 버튼
Panel pnl = new Panel();
point = new TextField(10);
setBackground (Color.gray);
this.addMouseListener(new MouseAdapter()
{
public void mouseClicked(MouseEvent e){
point.setText("X:"+e.getX() + "Y:" + e.getY());
int ImgRGB = ((BufferedImage) image).getRGB(e.getX(), e.getY()); // 이미지 좌표별 RGB값 추출 // <이부분이 잘못된건가?
int red = (ImgRGB & 0x00FF0000) >> 16;
// 2^8으로 구성되어있는데, RGB로 구성있기 때문에 16만큼 쉬프트하면 RED
// 8만큼 쉬프트 하면 G
// 쉬프트를 하지 않으면 B 값을 추출할 수 있습니다.
// [R=2^8] [B=2^8] [G]
int green = (ImgRGB & 0x0000FF00) >> 8;
int blue = (ImgRGB & 0x000000FF);
point.setText("r: "+red+" ,g: "+green+" , b: "+blue);
}
private int getRGB(int x, int y) {
// TODO Auto-generated method stub
return 0;
}
}
);
//프레임에 배치
openButton = new Button("Load Image");
pnl.add(openButton);
add(point,"North");
openButton.addActionListener(this);
this.add(pnl, BorderLayout.SOUTH);
this.setVisible(true);
}
// 버튼 눌렸을 때 처리
public void actionPerformed(ActionEvent ae) {
if (ae.getSource() == openButton) {
// 파일 선택 다이얼로그 생성
FileDialog fd = new FileDialog(this);
fd.setTitle("Select Image");
fd.setSize(300, 100);
fd.setVisible(true);
// 파일 선택 후 이미지 불러오기
loadImage(fd.getDirectory() + fd.getFile());
}
}
//이미지 불러오기
private void loadImage(String filePath) {
//파일 다이얼로그로부터 선택된 파일 경로로 이미지 파일 생성
Image img = Toolkit.getDefaultToolkit().getImage(filePath);
//null이 아니면 전역 변수에 할당
if (img != null) {
image = img;
//이미지 새로 그리기
repaint();
}
}
//그리는 메소드
public void paint(Graphics g) {
//이미지가 null이 아니면 이미지 그리기
if (image != null)
//파라미터: 이미지, X좌표, Y좌표, 이미지 관찰자(생략 가능)
//g.drawImage(image, 0, 50, this);
//파라미터: 이미지, X좌표, Y좌표, 이미지 가로 크기, 이미지 세로 크기, 이미지 관찰자(생략 가능)
//this는 Frame을 상속받은 ImageCanvas 객체 자체로서
//Frame으로부터 상속받은 가로와 세로의 크기를 알 수 있는 메소드를 사용 가능합니다.
g.drawImage(image, 0, 0, this.getWidth(), this.getHeight(), this);
}
public static void main(String[] args) {
new ImageCanvas();
}
}
실행까지는 잘 되는데 실행시키고 마우스 클릭하면 좌표는 뜨고 RGB값을 못받아오네;;
이 무식한 새기는 어제부터 이거하나 붙잡고 진도가 안나간다...
형들 어디가 잘못된건지좀 갈켜줘 ㅠㅠ
한 형이 ToolKitImage는 BufferedImage가 아님 라고 했는디 그럼 같이 쓰면 안되는긴가??
((BufferedImage) image) 이부분에 뭘 써야할지 모르겠네;;
시불, 메세지 그대로 형변환 안되는거구만 [...]
그러면 어케 해야하는거야 떙칠이형?