package org.horaapps.leafpic.util; import android.content.Context; import android.graphics.Bitmap; import android.graphics.Canvas; import android.media.MediaScannerConnection; import android.os.Environment; import android.util.Log; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.util.ArrayList; /** * Created by Jibo on 09/05/2016. */ public class Affix { private static final String DIRECTORY_NAME = "AffixedPictures"; public static void AffixBitmapList(Context ctx, ArrayList<Bitmap> bitmapArray, Options options){ Bitmap unionBitmap; if (options.isVertical()) unionBitmap = Bitmap.createBitmap(getMaxBitmapWidth(bitmapArray),getBitmapsHeight(bitmapArray), Bitmap.Config.ARGB_8888); else unionBitmap = Bitmap.createBitmap(getBitmapsWidth(bitmapArray), getMaxBitmapHeight(bitmapArray), Bitmap.Config.ARGB_8888); Canvas comboImage = new Canvas(unionBitmap); combineBitmap(comboImage, bitmapArray, options.isVertical()); saveFile(ctx, unionBitmap, options); } private static Canvas combineBitmap(Canvas cs, ArrayList<Bitmap> bpmList, boolean vertical){ if (vertical){ int height = bpmList.get(0).getHeight(); cs.drawBitmap(bpmList.get(0), 0f, 0f, null); for (int i = 1; i < bpmList.size(); i++) { cs.drawBitmap(bpmList.get(i), 0f, height, null); height += bpmList.get(i).getHeight(); } return cs; } else { int width = bpmList.get(0).getWidth(); cs.drawBitmap(bpmList.get(0), 0f, 0f, null); for (int i = 1; i < bpmList.size(); i++) { cs.drawBitmap(bpmList.get(i), width, 0f, null); width += bpmList.get(i).getWidth(); } return cs; } } private static void saveFile(Context context, Bitmap bmp, Options options){ try { File file = new File(options.getFolderPath(), System.currentTimeMillis() + "." + options.getExtensionFormat()); if (file.createNewFile()) { OutputStream os = new FileOutputStream(file); bmp.compress(options.getFormat(), options.getQuality(), os); os.close(); MediaScannerConnection.scanFile(context, new String[]{ file.getAbsolutePath() }, null, null); } } catch(IOException e) { Log.e("combineImages", "problem combining images", e); } } private static int getMaxBitmapWidth(ArrayList<Bitmap> bpmHeightArray){ int width = bpmHeightArray.get(0).getWidth(); for (int i=1;i<bpmHeightArray.size();i++){ if(width<bpmHeightArray.get(i).getWidth()) width=bpmHeightArray.get(i).getWidth(); } return width; } private static int getBitmapsWidth(ArrayList<Bitmap> bpmHeightArray){ int width=0; for (int i=0;i<bpmHeightArray.size();i++){ width+=bpmHeightArray.get(i).getWidth(); } return width; } private static int getMaxBitmapHeight(ArrayList<Bitmap> bpmHeightArray){ int height = bpmHeightArray.get(0).getHeight(); for (int i=1;i<bpmHeightArray.size();i++){ if(height<bpmHeightArray.get(i).getHeight()) height=bpmHeightArray.get(i).getHeight(); } return height; } private static int getBitmapsHeight(ArrayList<Bitmap> bpmHeightArray){ int height=0; for (int i=0;i<bpmHeightArray.size();i++){ height+=bpmHeightArray.get(i).getHeight(); } return height; } public static String getDefaultDirectoryPath() { File dir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES) + File.separator + DIRECTORY_NAME); if (!dir.exists()) dir.mkdir(); return dir.getAbsolutePath(); } public static class Options { /** * Specifies the known formats a bitmap can be compressed into */ private String folderPath = null; private Bitmap.CompressFormat format = Bitmap.CompressFormat.JPEG; private int quality = 90; private boolean vertical = false; public Options(String folderPath, Bitmap.CompressFormat format, int quality, boolean vertical) { this.folderPath = folderPath; this.format = format; this.quality = quality; this.vertical = vertical; } String getFolderPath() { return folderPath; } public boolean isVertical() { return vertical; } public Bitmap.CompressFormat getFormat() { return format; } String getExtensionFormat() { switch (format) { case JPEG: default: return "jpg"; case PNG: return "png"; case WEBP: return "webp"; } } int getQuality() { return quality; } } }