디스크에 픽셀 배열을 쓰고 동일한 응용 프로그램에서 해당 파일을 다시 읽어야합니다. 어떤 이유로 응용 프로그램이 종료 될 때까지 파일이 디스크에 기록되지 않습니다. (그런 다음에 만 저장되는 디렉토리에 표시됩니다.) 그것이 IntelliJ IDEA에이 응용 프로그램을 작성하는 것이 어떤 식 으로든 알아두면 유용합니다.응용 프로그램이 종료되기 전에 이미지를 디스크에 저장하는 방법은 무엇입니까?
파일이 즉시 디스크에 기록되도록하려면 어떻게해야합니까? 여기 내 코드는 다음과 같습니다.
protected void savePixelstoPNG(int[] pixels, String fileName) {
BufferedImage image = new BufferedImage(getMapWidth(), getMapHeight(), BufferedImage.TYPE_INT_RGB);
Graphics graphics = image.getGraphics();
for(int y = 0; y < getMapHeight(); y++) {
for(int x = 0; x < getMapWidth(); x++) {
graphics.setColor(new Color(pixels[x + y * getMapWidth()]));
graphics.fillRect(x, y, 1, 1);
}
}
try {
File file = new File(fileName);
ImageIO.write(image, "PNG", file);
} catch(IOException e) {
e.printStackTrace();
}
}
EDIT : 나는 실제로 디스크에 즉시 기록됩니다. 그러나 이러한 변경 사항은 응용 프로그램이 종료 될 때까지 프로젝트 디렉토리 (파일은 Java 패키지에 저장 됨)에 반영되지 않습니다. 따라서 파일을 저장 한 후 동일한 응용 프로그램 수명 내에서 해당 파일을 읽으려고하면 응용 프로그램에서 파일을 찾을 수 없습니다 (디스크에 있더라도).
EDIT 2 : 다음은 상대 디렉토리 경로를 사용하여 클래스 경로에서 파일을 읽는 데 사용하는 코드입니다. 초기 자원은 클래스 경로에서 읽습니다. 그들이가 업데이트 될 때 원래의 자원이 덮어 쓰기되지 않도록 원래의 자원이 처음 응용 프로그램이 새로 실행될 때마다 읽을 수 있도록되어 있기 때문에, 그들은, 클래스 패스에 다른 디렉토리에 기록됩니다
void myLoadMethod() {
loadMapTiles("resource/tilemap_1-1.png");
loadTriggerTiles("resource/triggermap_1-1.png");
}
protected void loadMapTiles(@NotNull String path) {
URL url = getClass().getClassLoader().getResource(path);
loadTiles(url, mapTiles);
}
protected void loadTriggerTiles(@NotNull String path) {
URL url = getClaass().getClassLoader().getResource(path);
loadTiles(url, triggerTiles);
}
protected void loadTiles(@NotNull URL url, @Nullable int[] dest) {
try {
System.out.println("Trying to load: " + url.toString() + "...");
BufferedImage map = ImageIO.read(url);
int[] pixels = new int[mapWidth * mapHeight];
map.getRGB(0, 0, mapWidth, mapHeight, pixels, 0, mapWidth);
System.arraycopy(pixels, 0, dest, 0, dest.length);
System.out.println("Success!");
} catch (IOException e) {
System.out.println("failed...");
e.printStackTrace();
}
}
}
주 mapTiles
을 그 및 triggerTiles
은 보유하는 클래스에 포함 된 필드입니다. loadMapTiles
loadTriggerTiles
및 loadTiles
AFAIK하지만'ImageIO에서 번호의 write'에 정적 호출을 자동으로 – DayTripperID
어떻게 당신이 그 (것)들을 읽으려고 않음을 수행합니다 당신이 절대적으로 URL을해야 할 경우 당신은 이런 식으로 할 수 있습니까? 파일이 수업 경로 또는 외부에 있다고 가정합니까? "파일이 자바 패키지에 저장되기 때문에"당신은 (소스) 디렉토리에 쓸 수 있지만 클래스 경로에서 읽으려고 할 수 있으며 일단 IntelliJ에서 새로운 실행을 시작하면 클래스 패스로 복사됩니다. . – cello
예! 상대 경로로 인스턴스화 된 URL을 사용하여 classpath에서 읽는 중입니다. 상대 디렉토리에 쓰는 방법을 알 수 없기 때문에 절대 디렉토리에 썼습니다. 상대 디렉토리를 인식하지 못했습니다. 디렉토리를 찾을 수 없습니다. 그래서 상대 디렉토리에 파일을 쓰는 방법을 알아야합니까? – DayTripperID