use of org.mycore.iiif.image.impl.MCRIIIFImageProvidingException in project mycore by MyCoRe-Org.
the class MCRIIIFImageResource method getInfo.
@GET
@Produces(MCRIIIFMediaType.APPLICATION_LD_JSON)
@Path("{" + IDENTIFIER_PARAM + "}/info.json")
public Response getInfo(@PathParam(IMPL_PARAM) String implString, @PathParam(IDENTIFIER_PARAM) String identifier) {
try {
MCRIIIFImageImpl impl = getImpl(implString);
MCRIIIFImageInformation information = impl.getInformation(identifier);
MCRIIIFImageProfile profile = getProfile(impl);
information.profile.add(IIIF_IMAGE_API_2_LEVEL2);
information.profile.add(profile);
Gson gson = new GsonBuilder().setPrettyPrinting().create();
return Response.ok().header("Access-Control-Allow-Origin", "*").header("Link", buildCanonicalURL(impl, identifier)).header("Profile", buildProfileURL()).entity(gson.toJson(information)).build();
} catch (MCRIIIFImageNotFoundException e) {
return Response.status(Response.Status.NOT_FOUND).entity(e.getMessage()).build();
} catch (MCRIIIFImageProvidingException | UnsupportedEncodingException e) {
return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(e.getMessage()).build();
} catch (MCRAccessException e) {
return Response.status(Response.Status.FORBIDDEN).entity(e.getMessage()).build();
}
}
use of org.mycore.iiif.image.impl.MCRIIIFImageProvidingException in project mycore by MyCoRe-Org.
the class MCRMetsMods2IIIFConverter method convert.
public MCRIIIFManifest convert() {
MCRIIIFManifest manifest = new MCRIIIFManifest();
// root chapter ^= manifest metadata
LogicalStructMap logicalStructMap = (LogicalStructMap) mets.getStructMap("LOGICAL");
LogicalDiv divContainer = logicalStructMap.getDivContainer();
List<MCRIIIFMetadata> metadata = extractMedataFromLogicalDiv(mets, divContainer);
manifest.metadata = metadata;
manifest.setId(this.identifier);
PhysicalStructMap physicalStructMap = (PhysicalStructMap) mets.getStructMap("PHYSICAL");
PhysicalDiv physicalDivContainer = physicalStructMap.getDivContainer();
String id = physicalDivContainer.getId();
MCRIIIFSequence sequence = new MCRIIIFSequence(id);
List<PhysicalSubDiv> children = physicalDivContainer.getChildren();
MCRIIIFImageImpl imageImpl = MCRIIIFImageImpl.getInstance(getImageImplName());
MCRIIIFImageProfile profile = imageImpl.getProfile();
profile.setId(MCRIIIFImageUtil.getProfileLink(imageImpl));
sequence.canvases = children.stream().map(physicalSubDiv -> {
String order = physicalSubDiv.asElement().getAttributeValue("ORDER");
String orderLabel = physicalSubDiv.getOrderLabel();
String contentids = physicalSubDiv.getContentids();
String label = Stream.of(order, orderLabel, contentids).filter(o -> o != null && !o.isEmpty()).collect(Collectors.joining(" - "));
String identifier = this.physicalIdentifierMap.get(physicalSubDiv);
try {
MCRIIIFImageInformation information = imageImpl.getInformation(identifier);
MCRIIIFCanvas canvas = new MCRIIIFCanvas(identifier, label, information.width, information.height);
MCRIIIFAnnotation annotation = new MCRIIIFAnnotation(identifier, canvas);
canvas.images.add(annotation);
MCRIIIFResource resource = new MCRIIIFResource(information.getId(), MCRDCMIType.Image);
resource.setWidth(information.width);
resource.setHeight(information.height);
MCRIIIFService service = new MCRIIIFService(information.getId(), profile.getContext());
service.profile = MCRIIIFImageProfile.IIIF_PROFILE_2_0;
resource.setService(service);
annotation.setResource(resource);
return canvas;
} catch (MCRIIIFImageNotFoundException | MCRIIIFImageProvidingException e) {
throw new MCRException("Error while providing ImageInfo for " + identifier, e);
} catch (MCRAccessException e) {
LOGGER.warn("User has no access to {}", identifier);
return null;
}
}).filter(Objects::nonNull).collect(Collectors.toList());
manifest.sequences.add(sequence);
List<MCRIIIFRange> complete = new ArrayList<>();
processDivContainer(complete, divContainer);
manifest.structures.addAll(complete);
manifest.setLabel(metadata.stream().filter(m -> m.getLabel().equals("title")).findFirst().get().getStringValue().get());
return manifest;
}
use of org.mycore.iiif.image.impl.MCRIIIFImageProvidingException in project mycore by MyCoRe-Org.
the class MCRIVIEWIIIFImageImpl method provide.
@Override
public BufferedImage provide(String identifier, MCRIIIFImageSourceRegion region, MCRIIIFImageTargetSize targetSize, MCRIIIFImageTargetRotation rotation, MCRIIIFImageQuality imageQuality, String format) throws MCRIIIFImageNotFoundException, MCRIIIFImageProvidingException, MCRIIIFUnsupportedFormatException, MCRAccessException {
long resultingSize = (long) targetSize.getHeight() * targetSize.getWidth() * (imageQuality.equals(MCRIIIFImageQuality.color) ? 3 : 1);
long maxImageSize = MCRConfiguration.instance().getLong(MAX_BYTES);
if (resultingSize > maxImageSize) {
throw new MCRIIIFImageProvidingException("Maximal image size is " + (maxImageSize / 1024 / 1024) + "MB. [" + resultingSize + "/" + maxImageSize + "]");
}
if (!SUPPORTED_FORMATS.contains(format.toLowerCase(Locale.ENGLISH))) {
throw new MCRIIIFUnsupportedFormatException(format);
}
Path tiledFile = tileFileProvider.getTiledFile(identifier);
MCRTiledPictureProps tiledPictureProps = getTiledPictureProps(tiledFile);
int sourceWidth = region.getX2() - region.getX1();
int sourceHeight = region.getY2() - region.getY1();
double targetWidth = targetSize.getWidth();
double targetHeight = targetSize.getHeight();
double rotatationRadians = Math.toRadians(rotation.getDegrees());
double sinRotation = Math.sin(rotatationRadians);
double cosRotation = Math.cos(rotatationRadians);
final int height = (int) (Math.abs(targetWidth * sinRotation) + Math.abs(targetHeight * cosRotation));
final int width = (int) (Math.abs(targetWidth * cosRotation) + Math.abs(targetHeight * sinRotation));
BufferedImage targetImage;
switch(imageQuality) {
case bitonal:
targetImage = new BufferedImage(width, height, BufferedImage.TYPE_BYTE_BINARY);
break;
case gray:
targetImage = new BufferedImage(width, height, BufferedImage.TYPE_BYTE_GRAY);
break;
case color:
default:
if (transparentFormats.contains(format)) {
targetImage = new BufferedImage(width, height, BufferedImage.TYPE_4BYTE_ABGR);
} else {
targetImage = new BufferedImage(width, height, BufferedImage.TYPE_3BYTE_BGR);
}
}
// this value determines the zoom level!
double largestScaling = Math.max(targetWidth / sourceWidth, targetHeight / sourceHeight);
// We always want to use the the best needed zoom level!
int sourceZoomLevel = (int) Math.min(Math.max(0, Math.ceil(tiledPictureProps.getZoomlevel() - Math.log(largestScaling) / LOG_HALF)), tiledPictureProps.getZoomlevel());
// largestScaling is the real scale which is needed! zoomLevelScale is the scale of the nearest zoom level!
double zoomLevelScale = Math.min(1.0, Math.pow(0.5, tiledPictureProps.getZoomlevel() - sourceZoomLevel));
// this is the scale which is needed from the nearest zoom level to the required size of image
double drawScaleX = (targetWidth / (sourceWidth * zoomLevelScale)), drawScaleY = (targetHeight / (sourceHeight * zoomLevelScale));
// absolute region in zoom level this nearest zoom level
double x1 = region.getX1() * zoomLevelScale, x2 = region.getX2() * zoomLevelScale, y1 = region.getY1() * zoomLevelScale, y2 = region.getY2() * zoomLevelScale;
// now we detect the tiles to draw!
int x1Tile = (int) Math.floor(x1 / 256), y1Tile = (int) Math.floor(y1 / 256), x2Tile = (int) Math.ceil(x2 / 256), y2Tile = (int) Math.ceil(y2 / 256);
try (FileSystem zipFileSystem = MCRIView2Tools.getFileSystem(tileFileProvider.getTiledFile(identifier))) {
Path rootPath = zipFileSystem.getPath("/");
Graphics2D graphics = targetImage.createGraphics();
if (rotation.isMirrored()) {
graphics.scale(-1, 1);
graphics.translate(-width, 0);
}
int xt = (int) ((targetWidth - 1) / 2), yt = (int) ((targetHeight - 1) / 2);
graphics.translate((width - targetWidth) / 2, (height - targetHeight) / 2);
graphics.rotate(rotatationRadians, xt, yt);
graphics.scale(drawScaleX, drawScaleY);
graphics.translate(-x1, -y1);
graphics.scale(zoomLevelScale, zoomLevelScale);
graphics.setClip(region.getX1(), region.getY1(), sourceWidth, sourceHeight);
graphics.scale(1 / zoomLevelScale, 1 / zoomLevelScale);
LOGGER.info(String.format(Locale.ROOT, "Using zoom-level: %d and scales %s/%s!", sourceZoomLevel, drawScaleX, drawScaleY));
for (int x = x1Tile; x < x2Tile; x++) {
for (int y = y1Tile; y < y2Tile; y++) {
ImageReader imageReader = MCRIView2Tools.getTileImageReader();
BufferedImage tile = MCRIView2Tools.readTile(rootPath, imageReader, sourceZoomLevel, x, y);
graphics.drawImage(tile, x * 256, y * 256, null);
}
}
} catch (IOException e) {
throw new MCRIIIFImageProvidingException("Error while reading tiles!", e);
}
return targetImage;
}
Aggregations