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;
Graphics gbuf;
public ImageCanvas() {
makeUI();
}
// UI 구성
private BufferedImage 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);
public BufferedImage imageToBufferedImage(Image im) {
BufferedImage bi = new BufferedImage
(im.getWidth(null),im.getHeight(null),BufferedImage.TYPE_INT_RGB);
Graphics bg = bi.getGraphics();
bg.drawImage(im, 0, 0, null);
bg.dispose();
return bi;
}
this.addMouseListener(new MouseAdapter()
{
public void mouseClicked(MouseEvent e){
point.setText("X:"+e.getX() + "Y:" + e.getY());
int ImgRGB = imageToBufferedImage(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);
}
protected static int getRGB(int x, int y) {
// TODO Auto-generated method stub
return 0;
}
// 버튼 눌렸을 때 처리
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();
}
}
근데 public BufferedImage imageToBufferedImage(Image im) { 여기서 오류뜸..
이거 이미지를 띄워서 클릭이벤트로 좌표구해서 RGB값 구하려는건데... 좌표구하는거까진 했는데...ㅠㅠㅠ 안되네...
자바좀 할줄아는형들 조언도 갠찮고 뭐 해주면 좋겠지만 그럴 형들은 없응게 조언이라도 부탁해... 시벅거 3일동안 별로 진행률이없어 ㅠㅠ
댓글 영역
획득법
① NFT 발행
작성한 게시물을 NFT로 발행하면 일주일 동안 사용할 수 있습니다. (최초 1회)
② NFT 구매
다른 이용자의 NFT를 구매하면 한 달 동안 사용할 수 있습니다. (구매 시마다 갱신)
사용법
디시콘에서지갑연결시 바로 사용 가능합니다.