Android Open Source - GreenDroid Scale Image Processor






From Project

Back to project page GreenDroid.

License

The source code is released under:

Apache License

If you think the Android project GreenDroid listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.

Java Source Code

/*
 * Copyright (C) 2011 Cyril Mottier (http://www.cyrilmottier.com)
 *//w  w w .ja va  2  s  .com
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package greendroid.image;

import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.RectF;
import android.widget.ImageView.ScaleType;

/**
 * Scales Bitmaps according to a given width and height. The scaling method may
 * be one of the ScaleType values
 * 
 * @author Cyril Mottier
 * @author kennydude
 */
public class ScaleImageProcessor implements ImageProcessor {

    private int mWidth;
    private int mHeight;
    private ScaleType mScaleType;
    private final Matrix mMatrix = new Matrix();

    private final RectF mTempSrc = new RectF();
    private final RectF mTempDst = new RectF();

    /**
     * Create a new ScaleImageProcessor.
     * 
     * @param width The width of the final surrounding box
     * @param height The height of the final surrounding box
     * @param scaleType The ScaleType method used to scale the original Bitmap
     */
    public ScaleImageProcessor(int width, int height, ScaleType scaleType) {
        mWidth = width;
        mHeight = height;
        mScaleType = scaleType;
    }

    public Bitmap processImage(Bitmap bitmap) {

        if (bitmap == null) {
            return null;
        }

        mMatrix.reset();

        final int bWidth = bitmap.getWidth();
        final int bHeight = bitmap.getHeight();

        switch (mScaleType) {

            case CENTER_CROP: {
                // Center and scale the bitmap so that it entirely fills the
                // given space. The bitmap ratio remains unchanged
                float scale;
                float dx = 0, dy = 0;

                if (bWidth * mHeight > mWidth * bHeight) {
                    scale = (float) mHeight / (float) bHeight;
                    dx = (mWidth - bWidth * scale) * 0.5f;
                } else {
                    scale = (float) mWidth / (float) bWidth;
                    dy = (mHeight - bHeight * scale) * 0.5f;
                }

                mMatrix.setScale(scale, scale);
                mMatrix.postTranslate((int) (dx + 0.5f), (int) (dy + 0.5f));
                break;
            }

            case CENTER: {
                // Center bitmap without scaling
                final int dx = (int) ((mWidth - bWidth) * 0.5f + 0.5f);
                final int dy = (int) ((mHeight - bHeight) * 0.5f + 0.5f);
                mMatrix.setTranslate(dx, dy);
                break;
            }

            case CENTER_INSIDE: {
                // Center and scale the bitmap so that it entirely fits into the
                // given space.
                float scale;
                float dx;
                float dy;

                if (bWidth <= mWidth && bHeight <= mHeight) {
                    scale = 1.0f;
                } else {
                    scale = Math.min((float) mWidth / (float) bWidth, (float) mHeight / (float) bHeight);
                }

                dx = (int) ((mWidth - bWidth * scale) * 0.5f + 0.5f);
                dy = (int) ((mHeight - bHeight * scale) * 0.5f + 0.5f);

                mMatrix.setScale(scale, scale);
                mMatrix.postTranslate(dx, dy);
                break;
            }

            case FIT_XY:
            default:
                // Entirely fills the space without respecting bitmap's ratio.
                mTempSrc.set(0, 0, bWidth, bHeight);
                mTempDst.set(0, 0, mWidth, mHeight);

                mMatrix.setRectToRect(mTempSrc, mTempDst, Matrix.ScaleToFit.FILL);
                break;
        }

        Bitmap result = Bitmap.createBitmap(mWidth, mHeight, Config.ARGB_8888);
        Canvas canvas = new Canvas(result);
        canvas.drawBitmap(bitmap, mMatrix, null);

        return result;
    }
}




Java Source Code List

com.cyrilmottier.android.gdcatalog.AboutActivity.java
com.cyrilmottier.android.gdcatalog.ActionBarActivity.java
com.cyrilmottier.android.gdcatalog.AsyncImageViewListActivity.java
com.cyrilmottier.android.gdcatalog.BasicItemActivity.java
com.cyrilmottier.android.gdcatalog.CatalogActivity.java
com.cyrilmottier.android.gdcatalog.CatalogApplication.java
com.cyrilmottier.android.gdcatalog.InfoTabActivity.java
com.cyrilmottier.android.gdcatalog.MapPinMapActivity.java
com.cyrilmottier.android.gdcatalog.PagedViewActivity.java
com.cyrilmottier.android.gdcatalog.QuickActionActivity.java
com.cyrilmottier.android.gdcatalog.SegmentedActivity.java
com.cyrilmottier.android.gdcatalog.SimpleAsyncImageViewActivity.java
com.cyrilmottier.android.gdcatalog.TabbedActionBarActivity.java
com.cyrilmottier.android.gdcatalog.TweakedItemViewActivity.java
com.cyrilmottier.android.gdcatalog.WebContentActivity.java
com.cyrilmottier.android.gdcatalog.XmlItemActivity.java
com.cyrilmottier.android.gdcatalog.widget.HeadedTextItemView.java
com.cyrilmottier.android.gdcatalog.widget.HeadedTextItem.java
greendroid.app.ActionBarActivity.java
greendroid.app.GDActivity.java
greendroid.app.GDApplication.java
greendroid.app.GDExpandableListActivity.java
greendroid.app.GDListActivity.java
greendroid.app.GDMapActivity.java
greendroid.app.GDTabActivity.java
greendroid.graphics.drawable.ActionBarDrawable.java
greendroid.graphics.drawable.DrawableStateSet.java
greendroid.graphics.drawable.MapPinDrawable.java
greendroid.image.ChainImageProcessor.java
greendroid.image.ImageCache.java
greendroid.image.ImageLoader.java
greendroid.image.ImageProcessor.java
greendroid.image.ImageRequest.java
greendroid.image.MaskImageProcessor.java
greendroid.image.ScaleImageProcessor.java
greendroid.util.Config.java
greendroid.util.GDUtils.java
greendroid.util.Md5Util.java
greendroid.util.Time.java
greendroid.widget.ActionBarHost.java
greendroid.widget.ActionBarItem.java
greendroid.widget.ActionBar.java
greendroid.widget.AsyncImageView.java
greendroid.widget.ItemAdapter.java
greendroid.widget.LoaderActionBarItem.java
greendroid.widget.NormalActionBarItem.java
greendroid.widget.PageIndicator.java
greendroid.widget.PagedAdapter.java
greendroid.widget.PagedView.java
greendroid.widget.QuickActionBar.java
greendroid.widget.QuickActionGrid.java
greendroid.widget.QuickActionWidget.java
greendroid.widget.QuickAction.java
greendroid.widget.SegmentedAdapter.java
greendroid.widget.SegmentedBar.java
greendroid.widget.SegmentedHost.java
greendroid.widget.item.DescriptionItem.java
greendroid.widget.item.DrawableItem.java
greendroid.widget.item.Item.java
greendroid.widget.item.LongTextItem.java
greendroid.widget.item.ProgressItem.java
greendroid.widget.item.SeparatorItem.java
greendroid.widget.item.SubtextItem.java
greendroid.widget.item.SubtitleItem.java
greendroid.widget.item.TextItem.java
greendroid.widget.item.ThumbnailItem.java
greendroid.widget.itemview.DescriptionItemView.java
greendroid.widget.itemview.DrawableItemView.java
greendroid.widget.itemview.ItemView.java
greendroid.widget.itemview.LongTextItemView.java
greendroid.widget.itemview.ProgressItemView.java
greendroid.widget.itemview.SeparatorItemView.java
greendroid.widget.itemview.SubtextItemView.java
greendroid.widget.itemview.SubtitleItemView.java
greendroid.widget.itemview.TextItemView.java
greendroid.widget.itemview.ThumbnailItemView.java