사용자가 마우스를 클릭하고 드래그하여 이미지를 그릴 수있는 웹 사이트 용 Java 애플릿을 만듭니다. 그런 다음이 이미지를 1과 0이있는 2 차원 배열의 형태로 흑백 이미지로 변환하려고합니다. 드로잉 부분을 만들었지 만 애플릿에서 2 차원 배열로 어떻게 이동해야하는지 모르겠습니다. 어떤 제안?Java 애플릿을 흑백 이미지로 변환
답변
먼저 화면을 BufferedImage
으로 변환하면 픽셀 데이터에 액세스 할 수 있습니다.
뭔가 같은 ...
BufferedImage buffer = new BufferedImage(getWidth(), getHeight(), BufferedImage.TYPE_INT_RGB);
Graphics2D g2d = buffer.createGraphics();
printAll(g2d);
g2d.dispose();
다음으로, 당신은 당신이 원시 데이터에 액세스 할 수 있습니다, 지금은 ... 검은 색과 흰색 이미지
BufferedImage bwImage = new BufferedImage(
buffer .getWidth(),
buffer .getHeight(),
BufferedImage.TYPE_BYTE_BINARY);
Graphics2D g2d = bwImage.createGraphics();
g2d.drawImage(buffer , 0, 0, null);
g2d.dispose();
을 그 변환해야 ...
for (int y = 0; y < bwImage.getHeight(); y++) {
for (int x = 0; x < bwImage.getWidth(); x++) {
Color color = new Color(bwImage.getRGB(x, y));
// You should only be interested in colors of 0,0,0 RGB
}
}
는 예에 UPDATED 617,451,515,
이것은 내가
public class MyPaint {
public static void main(String[] args) {
new MyPaint();
}
public MyPaint() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(500, 600);
frame.getContentPane().setBackground(Color.DARK_GRAY);
frame.setLocationRelativeTo(null);
frame.setLayout(new GridBagLayout());
final PaintSurfacePane surface = new PaintSurfacePane();
JPanel pnlButtons = new JPanel(new GridBagLayout());
pnlButtons.setOpaque(false);
JButton saveFromImage = new JButton("Save From Image");
JButton saveFromGraphics = new JButton("Save From Grpahics");
pnlButtons.add(saveFromImage);
pnlButtons.add(saveFromGraphics);
saveFromGraphics.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
BufferedImage buffer = new BufferedImage(surface.getWidth(), surface.getHeight(), BufferedImage.TYPE_INT_RGB);
Graphics2D g2d = buffer.createGraphics();
surface.printAll(g2d);
g2d.dispose();
renderBlackWhite(buffer);
}
});
saveFromImage.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
BufferedImage buffer = new BufferedImage(surface.getWidth(), surface.getHeight(), BufferedImage.TYPE_INT_RGB);
Graphics2D g2d = buffer.createGraphics();
g2d.drawImage(surface.getPaintSurface(), 0, 0, surface);
g2d.dispose();
renderBlackWhite(buffer);
}
});
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 0;
gbc.weightx = 1;
gbc.weighty = 1;
frame.add(surface, gbc);
gbc.gridy++;
gbc.weighty = 0;
frame.add(pnlButtons, gbc);
frame.setVisible(true);
}
});
}
public static void renderBlackWhite(BufferedImage buffer) {
BufferedImage bwImage = new BufferedImage(
buffer.getWidth(),
buffer.getHeight(),
BufferedImage.TYPE_BYTE_BINARY);
Graphics2D g2d = bwImage.createGraphics();
g2d.drawImage(buffer, 0, 0, null);
g2d.dispose();
JFrame frame = new JFrame("Black and White");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.add(new JLabel(new ImageIcon(bwImage)));
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public class PaintSurfacePane extends JPanel {
private BufferedImage paintSurface;
public PaintSurfacePane() {
// This will produce a buffered image that will render faster...
GraphicsConfiguration gc = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().getDefaultConfiguration();
paintSurface = gc.createCompatibleImage(400, 400, Transparency.OPAQUE);
Graphics2D g2d = paintSurface.createGraphics();
g2d.setColor(Color.WHITE);
g2d.fillRect(0, 0, 400, 400);
g2d.dispose();
MouseHandler handler = new MouseHandler();
addMouseListener(handler);
addMouseMotionListener(handler);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(paintSurface, 0, 0, this);
}
@Override
public Dimension getPreferredSize() {
return new Dimension(400, 400);
}
@Override
public Dimension getMinimumSize() {
return getPreferredSize();
}
@Override
public Dimension getMaximumSize() {
return getPreferredSize();
}
public BufferedImage getPaintSurface() {
return paintSurface;
}
protected class MouseHandler extends MouseAdapter implements MouseMotionListener {
private Point startPoint;
@Override
public void mouseReleased(MouseEvent e) {
startPoint = null;
}
@Override
public void mouseDragged(MouseEvent e) {
Point endPoint = e.getPoint();
if (startPoint != null) {
Graphics2D g2d = paintSurface.createGraphics();
g2d.setColor(Color.RED);
g2d.draw(new Line2D.Float(startPoint, endPoint));
g2d.dispose();
repaint();
}
startPoint = endPoint;
}
@Override
public void mouseMoved(MouseEvent e) {
}
}
}
}
은 본질적으로는 "직접 버퍼에서"접근 방식과 그래픽을 변환 할 수있는 "페인트"접근 방식을 사용하는 이전 질문에서 채택 된 예입니다 흑백으로.
두 번째 BufferedImage를 bwImage 대신 이미지로 선언 하시겠습니까? 나중에 변수 이름 이미지를 사용하여 해당 이미지를 참조하기 때문입니다. 또한,이 코드를 시도했지만,이 새로운 이미지를 화면에 표시 할 때 검은 색 대신에 완전히 검은 색 화면을 얻었습니다. 다른 곳에서는 흰색을 그렸습니다. 이렇게하려면 "g.drawImage (image, 0,0, null);"명령을 사용했습니다. 여기서 g는 내 Graphics 객체입니다. 이 올바른지? – Nate
첫째, 참조 오류를 수정하는 코드를 업데이트했습니다. 실수였습니다. 죄송합니다. 둘째로, 나는 당신이 애플릿의 그래픽 컨텍스트 (paint 메서드 중 하나를 재정의)에 직접적으로 이끌었다 고 가정합니다. 백업 버퍼를 사용했다면 첫 번째 단계를 건너 뛰고 바로 사용하십시오. 'getGraphics'를 사용했다면 문제가 생깁니다. – MadProgrammer
나는 페인트 법을 오버라이드하여 getGraphics를 내 코드 전체에서 호출했습니다. getGraphics를 사용할 때의 문제점은 무엇입니까? 추가 코멘트, 위의 코드를 사용할 때 픽셀 값을 분석했는데 단일 값이 아닌 경우 1입니다. – Nate
- 1. 2D 이진 행렬을 흑백 이미지로 변환
- 2. 아이폰 SDK에서 이미지를 흑백 이미지로 변환
- 3. qr 코드를 인식하기 위해 Xoom 카메라에서 흑백 이미지로 변환
- 4. 아이폰에서 이미지의 회색 스케일을 사용하지 않고 이미지를 흑백 이미지로 변환
- 5. RGB에서 흑백 변환
- 6. Java - JTextArea의 문자열을 이미지로 변환
- 7. Java 애플릿을 사용하여 파일 업로드
- 8. HTML을 이미지로 변환
- 9. UIImagePNGRepresentation 흑백
- 10. JavaFX가 Java 애플릿을 대체합니까?
- 11. Java 애플릿을 내보내는 방법
- 12. 자바 애플릿을 플래시/플렉스로 변환
- 13. PDF를 Java의 축소판 이미지로 변환
- 14. 아스키 흑백 흑백 BMP, 압축
- 15. 흑백 이미지를 흰색 및 투명색으로 변환
- 16. 흑백 이미지를 직접 변환하십시오 : 3 채널을 1 채널로 변환 하시겠습니까?
- 17. 페이지 범위의 이미지로 PDF 변환
- 18. C#. 이미지로 .ppt 변환
- 19. HTML을 이미지로 변환
- 20. 문서의 페이지를 이미지로 변환
- 21. 파이썬 : 바이너리에서 이미지로 변환
- 22. 문자열을 jQuery로 이미지로 변환
- 23. 텍스트를 이미지로 변환
- 24. uiview를 .png 이미지로 변환
- 25. ABCpdf가 텍스트를 이미지로 변환
- 26. jQuery SVG에서 이미지로 변환
- 27. netcdf를 이미지로 변환
- 28. PDF를 TBitmap 이미지로 변환
- 29. 첨부 파일을 이미지로 변환
- 30. PDF를 PDF의 이미지로 변환
나는 이미지를 이미지로 만드는 것이 더 낫다고 생각합니다. 여기에 당신이하려고하는 것에 대한 [가까운 동등 물] (http://stackoverflow.com/questions/12683533/drawing-a-rectangle-that-wont-disappear-in-next-paint/12683632#12683632) 페인팅 서피스로'BufferedImage'를 사용합니다. 그런 접근법이 마음에 든다면 나는 그것을 답으로 여기에 넣을 수 있습니다. OTOH - 당신이하려고하는 것보다 문자 그대로 [[ComponentImageCapture'] (http://stackoverflow.com/a/5853992/418556)도 참조하십시오. –