sclass PNGFile extends Concept {
  S pngPath; // program ID + "/" + file name
  Rect r; // optional, rectangle that was shot
  
  *() {} // for persistance
  *(S *pngPath) {}
  *(BufferedImage img) {
    savePNG(pngFile(), img);
  }
  ifclass RGBImage
    *(RGBImage img) { this(img.getBufferedImage()); }
  endif

  File pngFile() {
    if (pngPath == null) {
      pngPath = _programID() + "/" + id + ".png";
      change();
    }
    ret prepareFile(new File(javaxDataDir(), pngPath));
  }
  
  BufferedImage loadImage() { ret loadImage2(pngFile()); }
  BufferedImage getImage() { ret loadImage(); }
  BufferedImage getImageSafe() { pcall { ret loadImage(); } null; }
  S md5() { ret md5OfBufferedImage(getImage()); }
  
  bool hasImage() {
    ret pngFile().exists();
  }
}