In the Phimpme Android application, users can perform various operations on images such as editing an image, sharing an image, moving the image to another folder, printing a pdf version of the image and many more. However, another important functionality that has been implemented is the option to compress an image. Two modes of compress operation have been implemented namely compress by size and compress by dimensions. In the previous blog post I discussed the implementation of compress by size operation. So in this blog post, I will be discussing how we achieved the functionality to compress any image by resolution.
Step 1
First, we need to add an option in the bottombar menu(in the SingleMediaActivity) to compress the image being viewed. The option to compress an image has been added by implementing the following lines of code in the menu_bottom_view_pager.xml file.
<item
android:id=“@+id/action_compress”
android:orderInCategory=“2”
app:showAsAction=“always”
android:icon=“@drawable/compressicn”
android:title=“Compress”/> |
Step 2
Now on selecting the compress option, the user would be prompted to choose the compress mode i.e compress by size or compress by dimension. Once the user opts for compressing the image by resolution, a dialog containing the various resolutions options to choose from is to be displayed. Code snippets used to implement the dialog along with seekbar is displayed below.
<android.support.v7.widget.CardView
xmlns:android=“http://schemas.android.com/apk/res/android”
xmlns:app=“http://schemas.android.com/apk/vn.mbm.phimp.me”
android:layout_width=“match_parent”
android:layout_height=“wrap_content”
app:cardCornerRadius=“2dp”
android:id=“@+id/dialog_chose_provider_title”>
<LinearLayout
android:layout_width=“match_parent”
android:layout_height=“wrap_content”
android:orientation=“vertical”>
<TextView
android:id=“@+id/compress_title”
android:layout_width=“match_parent”
android:layout_height=“wrap_content”
android:padding=“24dp”
android:text=“@string/compress_by_dimension”
android:textColor=“@color/md_dark_primary_text”
android:textSize=“18sp”
android:textStyle=“bold” />
<ListView
android:id=“@+id/listview”
android:layout_width=“match_parent”
android:layout_height=“321dp”
android:layout_alignParentStart=“true”
android:layout_centerVertical=“true”/>
</LinearLayout>
</android.support.v7.widget.CardView> |
A screenshot displaying the resolutions option dialog is provided below.
Step 3
Now in this final step as mentioned for the compress by size post, we would use the image compression library Compressor to obtain the compress by resolution functionality. After the user has specified the new resolution required, the Compressor class of the library is instantiated by passing-in the context as the parameter and some of its functions are invoked simaltaneously. The functions invoked are setMaxWidth(), setMaxHeight(), setCompressFormat(), setDestinationDirectoryPath(), compressToFile().
setMaxWidth() – to set the width of the output image.
setMaxHeight() – to set the height of the output image.
setCompressFormat(Bitmap.CompressFormat) – to determine the format of the output compressed image.
setDestinationDirectoryPath(File) – to specify the path to which the compressed image is to be saved.
compressToFile(File) – to perform the compress operation, passing-in the file object of the corresponding image to be compressed.
The compressToFile() function performs the final compress operation and saves the compressed image to the specified path.
Code snippets to implement the above mentioned operations are given below
private void compressDim() {
ListCompressAdapter lviewAdapter;
ArrayList<String> compress_option= new ArrayList<String>();
MediaDetailsMap<String,String> mediaDetailsMap = SingleMediaActivity.mediacompress.getMainDetails(this);
//gives in the form like 1632×1224 (2.0 MP) , getting width and height of it
String dim[]=mediaDetailsMap.get(“Resolution”).split(“x”);
int width= Integer.parseInt(dim[0].replaceAll(” “,“”));
String ht[]=dim[1].split(” “);
int height= Integer.parseInt(ht[0]);
LayoutInflater inflater = getLayoutInflater();
final View dialogLayout = inflater.inflate(R.layout.dialog_compresspixel, null);
TextView title = (TextView) dialogLayout.findViewById(R.id.compress_title);
title.setBackgroundColor(getPrimaryColor());
//create options of compress in dimensions in multiple of 2
int awidth=width;
int aheight=height;
ListView listView = (ListView)dialogLayout.findViewById(R.id.listview);
while ((width%2==0)&&(height%2==0)) {
compress_option.add(width + ” X “ + height);
width=width/2;
height=height/2;
}
lviewAdapter = new ListCompressAdapter(this, compress_option);
listView.setAdapter(lviewAdapter);
final int finalWidth = awidth;
final int finalHeight = aheight;
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
if (position==0){
cwidth[0] = finalWidth ;
cheight[0] = finalHeight;}
else{
cwidth[0] = finalWidth /(position*2);
cheight[0] = finalHeight /(position*2);}
view.setBackgroundColor(R.color.md_light_blue_A400);
new SaveCompressedImage().execute(“Resolution”);
finish();
}
}); |
new Compressor(getApplicationContext())
.setMaxWidth(cwidth[0])
.setMaxHeight(cheight[0])
.setCompressFormat(Bitmap.CompressFormat.JPEG)
.setDestinationDirectoryPath( FileUtilsCompress.createFolders().getPath())
.compressToFile(new File(saveFilePath)); |
This is how we have implemented the functionality to compress an image by size in the Phimpme Android application. To get the full source code, please refer to the Phimpme Android Github repository listed in the resource section below.
Resources
- Android Developer documentation –https://developer.android.com/reference/java/io/File
- Github-Phimpme Android Repository – https://github.com/fossasia/phimpme-android/
- Compressor Library – https://github.com/zetbaitsu/Compressor
You must be logged in to post a comment.