public RPFImage[] deproject(int frameNumber, BufferedImage frame) { // Effectively a no-op for non-polar frames. RPFImage[] image = new RPFImage[1]; Sector sector = computeFrameCoverage(frameNumber); image[0] = new RPFImage(sector, frame); return(image); }
public RPFImage[] deproject(int frameNumber, BufferedImage frame) { if (frame == null) { String message = Logging.getMessage("nullValue.ImageSource"); Logging.logger().severe(message); throw new ArgumentException(message); } PixelTransformer pt = (this.zoneCode == '9') ? northernPixels : southernPixels; RPFImage[] images; if (isDatelineSpanningFrame(frameNumber, pt)) { if (pt == northernPixels) { images = deprojectNorthernDatelineFrames(frameNumber, frame, pt); } else { images = deprojectSouthernDatelineFrames(frameNumber, frame, pt); } } else { // non-dateline spanning frames are more straightforward... Sector sector = computeFrameCoverage(frameNumber); BufferedImage destImage = new BufferedImage(frame.getWidth(), frame.getHeight(), BufferedImage.TYPE_4BYTE_ABGR); resampleFrameFile(sector, frame, destImage, frameNumber, pt); images = new RPFImage[1]; images[0] = new RPFImage(sector, destImage); } return(images); }
private RPFImage[] deprojectSouthernDatelineFrames(int frameNumber, BufferedImage frame, PixelTransformer pt) { // We have to split this frame at the dateline. RPFImage[] images = new RPFImage[2]; // Compute a tight bounds for western half... int minX = pixelColumn(0, frameNumber, this.frameStructure.getPixelRowsPerFrame(), this.frameStructure.getPolarFrames()); int maxX = pixelColumn(this.frameStructure.getPixelRowsPerFrame(), frameNumber, this.frameStructure.getPixelRowsPerFrame(), this.frameStructure.getPolarFrames()); int minY = pixelRow(0, frameNumber, this.frameStructure.getPixelRowsPerFrame(), this.frameStructure.getPolarFrames()); int maxY = pixelRow(this.frameStructure.getPixelRowsPerFrame(), frameNumber, this.frameStructure.getPixelRowsPerFrame(), this.frameStructure.getPolarFrames()); int midX = (minX + maxX) / 2; int midY = (minY + maxY) / 2; // Below we are using knowledge about the frames that make up the lower 1/2 part of the middle // column, and which borders and edges constitute the extrema... MinMaxLatLon bndsWest = new MinMaxLatLon(); bndsWest.minLon = -180.; // center-most frame is different... if (isCenterFrame(frameNumber)) { bndsWest.maxLon = 0.; // here max lat is at center of frame bndsWest.maxLat = pt.pixel2Latitude(midX, midY, this.frameStructure.getPolarPixelConstant()); // min lat is at an arbitrary corner... bndsWest.minLat = pt.pixel2Latitude(minX, minY, this.frameStructure.getPolarPixelConstant()); } else { // min lat is one of the lower corners... bndsWest.minLat = pt.pixel2Latitude(minX, maxY, this.frameStructure.getPolarPixelConstant()); // max lat is center of top edge... bndsWest.maxLat = pt.pixel2Latitude(midX, minY, this.frameStructure.getPolarPixelConstant()); // UL corner of frame gives us max lon... bndsWest.maxLon = pt.pixel2Longitude(minX, minY); } Sector sector = Sector.fromDegrees(bndsWest.minLat, bndsWest.maxLat, bndsWest.minLon, bndsWest.maxLon); BufferedImage destImage = new BufferedImage(frame.getWidth(), frame.getHeight(), BufferedImage.TYPE_4BYTE_ABGR); resampleFrameFile(sector, frame, destImage, frameNumber, pt); images[0] = new RPFImage(sector, destImage); // East half... MinMaxLatLon bndsEast = new MinMaxLatLon(); // has same latitude bounds... bndsEast.minLat = bndsWest.minLat; bndsEast.maxLat = bndsWest.maxLat; // max lon is LR corner, unless we're center frame... if (isCenterFrame(frameNumber)) { bndsEast.minLon = 0.; bndsEast.maxLon = 180.; } else { bndsEast.minLon = pt.pixel2Longitude(maxX, minY); bndsEast.maxLon = 180.; } sector = Sector.fromDegrees(bndsEast.minLat, bndsEast.maxLat, bndsEast.minLon, bndsEast.maxLon); destImage = new BufferedImage(frame.getWidth(), frame.getHeight(), BufferedImage.TYPE_4BYTE_ABGR); resampleFrameFile(sector, frame, destImage, frameNumber, pt); images[1] = new RPFImage(sector, destImage); return(images); }