package org.rr.jeborker.converter; import java.awt.image.BufferedImage; import java.util.ArrayList; import java.util.Collections; import java.util.List; import org.rr.commons.mufs.IResourceHandler; import org.rr.jeborker.gui.ConverterPreferenceController; import org.rr.jeborker.metadata.IMetadataReader; import org.rr.jeborker.metadata.IMetadataWriter; import org.rr.jeborker.metadata.MetadataHandlerFactory; import org.rr.jeborker.metadata.MetadataProperty; import org.rr.pm.image.ImageUtils; public class ConverterUtils { /** * Transfers the main metadata between the given source and the target resource. */ public static void transferMetadata(final IResourceHandler sourceResource, final IResourceHandler targetResource) { IMetadataReader sourceReader = MetadataHandlerFactory.getReader(sourceResource); IMetadataReader targetReader = MetadataHandlerFactory.getReader(targetResource); List<MetadataProperty> sourceMetadata = sourceReader.readMetadata(); List<MetadataProperty> targetMetadata = new ArrayList<>(sourceMetadata.size()); for(IMetadataReader.COMMON_METADATA_TYPES type : IMetadataReader.COMMON_METADATA_TYPES.values()) { List<MetadataProperty> sourceMetadataByType = sourceReader.getMetadataByType(false, sourceMetadata, type); List<MetadataProperty> targetMetadataByType = targetReader.getMetadataByType(true, targetMetadata, type); if(!sourceMetadataByType.isEmpty()) { MetadataProperty sourceMetadataProperty = sourceMetadataByType.get(0); MetadataProperty targetMetadataProperty = targetMetadataByType.get(0); targetMetadataProperty.setPropertyClass(sourceMetadataProperty.getPropertyClass()); targetMetadataProperty.setValues(sourceMetadataProperty.getValues()); targetMetadata.add(targetMetadataProperty); } } IMetadataWriter writer = MetadataHandlerFactory.getWriter(targetResource); writer.writeMetadata(targetMetadata); } /** * Applies the image modifications from the given {@link ConverterPreferenceController}. * @param bufferedImage The image to be modified * @param converterPreferenceController The {@link ConverterPreferenceController} instance containing the user selections. * @return The processed images. Never returns <code>null</code>. */ static List<BufferedImage> processImageModifications(BufferedImage bufferedImage, int imageSize, ConverterPreferenceController converterPreferenceController) { if(imageSize < 99) { bufferedImage = ImageUtils.scalePercent(bufferedImage, (double)imageSize / 100); } final float imageWidth = ((float)bufferedImage.getWidth()); final float imageHeight = ((float)bufferedImage.getHeight()); if((double) imageWidth / (double)imageHeight > 1.2) { if(!converterPreferenceController.isLandscapePageRotate() && !converterPreferenceController.isLandscapePageSplit()) { //no rotation, no split, nothing to do return Collections.singletonList(bufferedImage); } else if(converterPreferenceController.isLandscapePageRotate()) { if(converterPreferenceController.isRotateClockwise()) { //rotate image clockwise return Collections.singletonList(ImageUtils.rotate90Degree(bufferedImage, true)); } else { //rotate image counterclockwise return Collections.singletonList(ImageUtils.rotate90Degree(bufferedImage, false)); } } else if(converterPreferenceController.isLandscapePageSplit()) { //split image List<BufferedImage> splitted = ImageUtils.splitHorizontal(bufferedImage, 2); if(converterPreferenceController.isMangaMode()) { Collections.reverse(splitted); } return splitted; } } return Collections.singletonList(bufferedImage); } /** * Test if the given name have an image file extension. */ static boolean isImageFileName(String imageName) { if(imageName.endsWith(".jpg") || imageName.endsWith(".jpeg") || imageName.endsWith(".png") || imageName.endsWith(".gif")) { return true; } return false; } }