OP의 세 가지 질문을 다루지 않고 많은 답변을 볼 수 있습니다.
1) 성능에 관한 단어 : 바이트 배열은 디스플레이 어댑터의 현재 해상도 및 색상 깊이와 일치하는 정확한 픽셀 바이트 순서를 사용할 수 없다면 비효율적입니다.
최상의 그리기 성능을 얻으려면 이미지를 현재 그래픽 구성에 해당하는 유형으로 생성 된 BufferedImage로 변환하십시오. https://docs.oracle.com/javase/tutorial/2d/images/drawonimage.html 에서 createCompatibleImage를 참조하십시오.
이러한 이미지는 프로그래밍 노력없이 몇 번 그린 후 디스플레이 카드 메모리에 자동으로 캐시되므로 (Java 6 이후 Swing의 표준 임) 이미지를 변경하지 않은 경우 실제 드로잉에는 시간이 거의 걸리지 않습니다. .
이미지를 변경하면 주 메모리와 GPU 메모리 사이에 추가 메모리 전송이 제공되며 속도가 느립니다. 이미지를 BufferedImage에 "다시 그리기"하지 말고 getPixel 및 setPixel을 수행하지 마십시오.
예를 들어, 게임을 개발하는 경우 모든 게임 액터를 BufferedImage에 그리고 JPanel에 그리는 대신 모든 액터를 더 작은 BufferedImage로로드하고 JPanel 코드에서 하나씩 하나씩 그리는 것이 훨씬 빠릅니다. 올바른 위치-이 방법으로 캐싱을위한 이미지의 초기 전송을 제외하고 메인 메모리와 GPU 메모리간에 추가 데이터 전송이 없습니다.
ImageIcon은 후드 아래에서 BufferedImage를 사용하지만 기본적으로 적절한 그래픽 모드 를 사용하여 BufferedImage를 할당하는 것이 중요하며이를 올바르게 수행하기위한 노력이 없습니다.
2) 일반적인 방법은 JPanel의 재정의 된 paintComponent 메소드에서 BufferedImage를 그리는 것입니다. Java는 GPU 메모리에 캐시 된 VolatileImages를 제어하는 버퍼 체인과 같은 많은 양의 추가 기능을 지원하지만, Java 6부터는 GPU 가속에 대한 세부 사항을 모두 노출하지 않고도 상당히 좋은 작업을 수행 할 필요가 없습니다.
반투명 이미지 확장과 같은 특정 작업에서는 GPU 가속이 작동하지 않을 수 있습니다.
3) 추가하지 마십시오. 위에서 언급 한대로 페인트하십시오.
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(image, 0, 0, this);
}
이미지가 레이아웃의 일부인 경우 "추가"가 의미가 있습니다. JPanel을 채우는 배경 또는 전경 이미지로 이것을 필요로하는 경우 paintComponent를 그립니다. 이미지를 표시 할 수있는 일반 Swing 구성 요소를 추출하려는 경우 동일한 내용입니다 (JComponent를 사용하고 paintComponent 메서드를 재정의 할 수 있음)-GUI 구성 요소의 레이아웃에 추가 하십시오 .
4) 배열을 버퍼 이미지로 변환하는 방법
바이트 배열을 PNG로 변환 한 다음로드하는 데 많은 리소스가 필요합니다. 더 좋은 방법은 기존 바이트 배열을 BufferedImage로 변환하는 것입니다.
이를 위해 : 루프에 사용하지 않고 픽셀을 복사하십시오. 매우 느립니다. 대신 :
- BufferedImage의 선호 바이트 구조를 배우십시오 (현재 RGB 또는 RGBA (픽셀 당 4 바이트)라고 가정하는 것이 안전합니다)
- 사용중인 스캔 라인 및 스캔 크기를 익히십시오 (예 : 너비가 142 픽셀 일 수 있지만 GPU 하드웨어에 의해 처리되지 않고 사용되지 않은 픽셀을 마스크하는 것이 더 빠르기 때문에 실제로는 256 픽셀 너비의 바이트 배열로 저장 됨) )
- 그런 다음 이러한 원칙에 따라 배열을 구축하면 BufferedImage의 setRGB 배열 메소드가 배열을 BufferedImage에 복사 할 수 있습니다.
MemoryImageSource
하여 JPEG 또는 PNG 형식으로 변환 한 다음ImageIO
대부분의 답변에서 제시 하는 대로 읽는 것이 더 효율적일 수 있습니다 . 을 사용하여 이미지 데이터로 구성Image
된 것을 얻을 수 있으며 답변 중 하나에서 제안 된대로 표시 할 수 있습니다.MemoryImageSource
createImage