package infosistema.openbaas.dataaccess.files; import infosistema.openbaas.data.enums.ModelEnum; import infosistema.openbaas.data.models.Image; import infosistema.openbaas.dataaccess.models.AppModel; import infosistema.openbaas.utils.Const; import infosistema.openbaas.utils.Log; import java.awt.Color; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.InputStream; import javax.imageio.ImageIO; public class FilesUtils { private static final String DIR_PATH_FORMAT = "%sapps/%s/media/%s"; private static final String FILE_PATH_FORMAT = "%s/%s.%s"; private static final String FILE_PATH_QUAL_FORMAT = "%s/%s_%s_%s.%s"; private static FilesUtils instance; private static AppModel appModel =null; static final String ORIGINAL = "original"; public static FilesUtils getInstance() { if (instance == null) instance = new FilesUtils(); appModel = AppModel.getInstance(); return instance; } private FilesUtils() { } public static String getDirPath(String appId, ModelEnum type) { return String.format(DIR_PATH_FORMAT, Const.getLocalStoragePath(), appId, type); } public static String getFilePath(String dirPath, String id, String extension) { return String.format(FILE_PATH_FORMAT, dirPath, id, extension); } public static String getFilePathWithQuality(String dirPath, String id,String quality, String extension,String bars) { return String.format(FILE_PATH_QUAL_FORMAT, dirPath, id,bars, quality, extension); } public byte[] resizeFile(String appId, byte[] byteArray, String quality, ModelEnum type, File file, String extension, String filePath, String bars) { byte[] res=null; try { if(quality.equals(ORIGINAL)) return byteArray; else{ if(type.equals(ModelEnum.image)){ int IMG_WIDTH=100; int IMG_HEIGHT=100; String barsRes = appModel.getFileQuality(appId, ModelEnum.bars, bars); String[] qualityArray = quality.split("X"); IMG_WIDTH = Integer.parseInt(qualityArray[0]); IMG_HEIGHT = Integer.parseInt(qualityArray[1]); InputStream in = new ByteArrayInputStream(byteArray); BufferedImage originalImage = ImageIO.read(in); //BufferedImage originalImage = ImageIO.read(file); int fileType = originalImage.getType() == 0? BufferedImage.TYPE_INT_ARGB : originalImage.getType(); res = resizeImage(originalImage, fileType, IMG_WIDTH, IMG_HEIGHT, Image.EXTENSION, filePath,barsRes); } if(type.equals(ModelEnum.video)){ res = byteArray; } if(type.equals(ModelEnum.storage)){ res = byteArray; } if(type.equals(ModelEnum.audio)){ res = byteArray; } } } catch (Exception e) { Log.error("", this, "resize file", "An error ocorred.", e); } return res; } private byte[] resizeImage(BufferedImage originalImage, int type, int finalWidth, int finalHeight, String extension, String filePath, String bars){ byte[] imageInByte = null; try { int originalWidth = originalImage.getWidth(); int originalHeight = originalImage.getHeight(); int newWidth; int newHeight; double aspectRatio = (double) originalWidth / (double) originalHeight; double boundaryAspect = (double) finalWidth / (double) finalHeight; if (aspectRatio > boundaryAspect) { newWidth = finalWidth; newHeight = (int) Math.round(newWidth / aspectRatio); } else { newHeight = finalHeight; newWidth = (int) Math.round(aspectRatio * newHeight); } int xOffset = (finalWidth - newWidth) / 2; int yOffset = (finalHeight - newHeight) / 2; BufferedImage intermediateImage=null; if(bars!=null){ intermediateImage = new BufferedImage(finalWidth, finalHeight, BufferedImage.TYPE_INT_ARGB); Graphics2D gi = intermediateImage.createGraphics(); Color color1 = Color.decode("0x"+bars.substring(0, 6)); Color color2 = new Color(color1.getRed(), color1.getGreen(), color1.getBlue(), Integer.parseInt(bars.substring(6),16)); gi.setColor(color2); gi.fillRect(0, 0, finalWidth, finalHeight); gi.drawImage(originalImage, xOffset, yOffset, xOffset + newWidth, yOffset + newHeight, 0, 0, originalWidth, originalHeight, null); }else{ intermediateImage = new BufferedImage(finalWidth, finalHeight, type); Graphics2D gi = intermediateImage.createGraphics(); gi.drawImage(originalImage, 0, 0, finalWidth, finalWidth, null); gi.dispose(); } ByteArrayOutputStream baos = new ByteArrayOutputStream(); ImageIO.write(intermediateImage, extension, baos); baos.flush(); imageInByte = baos.toByteArray(); baos.close(); } catch (Exception e) { Log.error("", this, "resize image", "An error ocorred.", e); } return imageInByte; } }