Android位图将横幅图像缩放为纵向

时间:2016-07-08 18:46:12

标签: android bitmap imageview picasso

我从cms中提取图像并且它们是横幅样式(宽度= 900,高度= 250)。我必须在全屏肖像模式下使用它们,所以它们自然会被严重扭曲。我用xml尝试了很多不同的东西,调整位图大小,毕加索变换等等。但是不知道还有什么可以尝试。我唯一能够保持质量的是中心剪裁,但这不是一个选择。我需要图像来保持其纵横比。这甚至可以在不牺牲纵横比的情况下做到吗?我的星系s5上的图像宽高比为1.7,而期望值为0.5625。

编辑以获取更多详细信息:

这是一个专有项目,所以我不能包含我使用的图像,但它们是横幅样式。它们用于screenSizeHeight - toolbarHeightscreensizewidth / 1.2的图像视图。

这就是我尝试调整位图大小的方法。它虽然只是居中,而且太大了。

    public static final Bitmap scaleAndCropBitmapByPixelDimensions(final Context context, final Bitmap sourceBitmap, final int targetWidth, final int targetHeight)
{
    try
    {
        if (context != null && sourceBitmap != null)
        {
            int srcWidth = sourceBitmap.getWidth();
            int srcHeight = sourceBitmap.getHeight();

            float targetAspectRatio = (float)targetWidth / (float)targetHeight;
            float srcAspectRatio = (float)srcWidth / (float)srcHeight;

            int scaleWidth = targetWidth;
            int scaleHeight = targetHeight;
            int x = 0;
            int y = 0;


            if (srcAspectRatio < targetAspectRatio)
            {
                scaleWidth = targetWidth;
                scaleHeight = (int)((float)(1 / srcAspectRatio) * (float)scaleWidth);
                x = 0;
                y = (scaleHeight - targetHeight) / 2;
            }
            else
            {
                scaleHeight = targetHeight;
                scaleWidth = (int)((float)srcAspectRatio * (float)scaleHeight);
                x = (scaleWidth - targetWidth) / 2;
                y = 0;
            }


            Bitmap scaledBitmap = Bitmap.createScaledBitmap(sourceBitmap, scaleWidth, scaleHeight, true);
            Bitmap croppedBitmap = Bitmap.createBitmap(scaledBitmap, x, y, targetWidth, targetHeight);
            return croppedBitmap;
        }
    }
    catch (Exception ex)
    {
        //Log.e(LOG_TAG, "Error scaling and cropping bitmap", ex);
        ex.printStackTrace();
    }

    return null;
}

设置位图转换

@Override
            public Bitmap transform(Bitmap sourceBitmap) {
                i_bitmap = Utils.scaleAndCropBitmapByPixelDimensions(mContext,sourceBitmap,targetWidth,targetHeight);


                if (sourceBitmap != i_bitmap) {
                    // Same bitmap is returned if sizes are the same
                    sourceBitmap.recycle();
                }

                return i_bitmap;


            }

imageview xml

    <ImageView
    android:id="@+id/bg"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_gravity="center"
    android:scaleType="center"       />

并用毕加索加载图像     Picasso.with(mContext) .load(url) .transform(transformation) .into(getBg());

1 个答案:

答案 0 :(得分:0)

嗯,由于所需的宽高比与实际比例相反,您可以简单地旋转横幅图像(-90º或+90º)。

当然,这是一个非常天真的建议。也许如果您提供有关要显示的内容或任何其他约束的更多详细信息,我们将能够提供更好的解决方案。