【问题标题】:Scale Down Large Image With AspectRatio android Canvas使用 AspectRatio android Canvas 缩小大图像
【发布时间】:2015-01-23 11:44:21
【问题描述】:

我想将大图像缩小为位图并将其放入画布中。我找到了一个效果很好的解决方案,但是它给位图带来了黑色背景的问题。我只想要具有透明背景的图像..!这是代码..

Bitmap scaleDownLargeImageWithAspectRatio(Bitmap image)
{
    int imaheVerticalAspectRatio,imageHorizontalAspectRatio;
    float bestFitScalingFactor=0;
    float percesionValue=(float) 0.2;

    //getAspect Ratio of Image
    int imageHeight=(int) (Math.ceil((double) image.getHeight()/100)*100);
    int imageWidth=(int) (Math.ceil((double) image.getWidth()/100)*100);
    int GCD=BigInteger.valueOf(imageHeight).gcd(BigInteger.valueOf(imageWidth)).intValue();
    imaheVerticalAspectRatio=imageHeight/GCD;
    imageHorizontalAspectRatio=imageWidth/GCD;
    Log.i("scaleDownLargeImageWIthAspectRatio","Image Dimensions(W:H): "+imageWidth+":"+imageHeight);
    Log.i("scaleDownLargeImageWIthAspectRatio","Image AspectRatio(W:H): "+imageHorizontalAspectRatio+":"+imaheVerticalAspectRatio);

    //getContainer Dimensions
    int displayWidth = getWindowManager().getDefaultDisplay().getWidth();
    int displayHeight = getWindowManager().getDefaultDisplay().getHeight();
   //I wanted to show the image to fit the entire device, as a best case. So my ccontainer dimensions were displayWidth & displayHeight. For your case, you will need to fetch container dimensions at run time or you can pass static values to these two parameters 

    int leftMargin = 0;
    int rightMargin = 0;
    int topMargin = 0;
    int bottomMargin = 0;
    int containerWidth = displayWidth - (leftMargin + rightMargin);
    int containerHeight = displayHeight - (topMargin + bottomMargin);
    Log.i("scaleDownLargeImageWIthAspectRatio","Container dimensions(W:H): "+containerWidth+":"+containerHeight);

    //iterate to get bestFitScaleFactor per constraints
    while((imageHorizontalAspectRatio*bestFitScalingFactor <= containerWidth) && 
            (imaheVerticalAspectRatio*bestFitScalingFactor<= containerHeight))
    {
        bestFitScalingFactor+=percesionValue;
    }

    //return bestFit bitmap
    int bestFitHeight=(int) (imaheVerticalAspectRatio*bestFitScalingFactor);
    int bestFitWidth=(int) (imageHorizontalAspectRatio*bestFitScalingFactor);
    Log.i("scaleDownLargeImageWIthAspectRatio","bestFitScalingFactor: "+bestFitScalingFactor);
    Log.i("scaleDownLargeImageWIthAspectRatio","bestFitOutPutDimesions(W:H): "+bestFitWidth+":"+bestFitHeight);
    image=Bitmap.createScaledBitmap(image, bestFitWidth,bestFitHeight, true);
    int leftPadding=(containerWidth-image.getWidth())/2;
    int topPadding=(containerHeight-image.getHeight())/4;
    Bitmap backDrop=Bitmap.createBitmap(containerWidth, containerHeight, Bitmap.Config.RGB_565);
    Canvas can = new Canvas(backDrop);
    can.drawBitmap(image, leftPadding, topPadding, null);
    return backDrop;
}

【问题讨论】:

    标签: android canvas bitmap resize


    【解决方案1】:

    好的。只需删除

    int leftPadding=(containerWidth-image.getWidth())/2;
    
    int topPadding=(containerHeight-image.getHeight())/4;
    

    这两行并检查。

    【讨论】:

    • 如果这不起作用然后位图 backDrop=Bitmap.createBitmap(containerWidth, containerHeight, Bitmap.Config.RGB_565);然后将 Config.RGB_565 更改为其他值
    • 不要删除 leftPadding 和 topPadding 只需将它们设置为 0。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-12
    • 2013-07-18
    • 2021-12-23
    • 1970-01-01
    • 2020-04-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多