裁剪图像会降低质量,边框看起来很糟糕

Jam*_*ron 6 java android

使用一些数学,我创建了下面的java函数,输入一个Bitmap,并让它裁剪出一个居中的正方形,在该正方形的圆周上再次裁剪出一个黑色边框.广场的其余部分应该是透明的.此外,通过信使发送图像时,两侧的透明距离不会损坏预览.

我的功能代码如下:

 public static Bitmap edit_image(Bitmap src,boolean makeborder) {
        int width = src.getWidth();
        int height = src.getHeight();
        int A, R, G, B;
        int pixel;

        int middlex = width/2;
        int middley = height/2;

        int seitenlaenge,startx,starty;
        if(width>height) 
        {
            seitenlaenge=height;
            starty=0;

            startx = middlex - (seitenlaenge/2);
        }
        else 
        {
            seitenlaenge=width; 
            startx=0;

            starty = middley - (seitenlaenge/2);
        }

        int kreisradius = seitenlaenge/2;
        int mittx = startx + kreisradius;
        int mitty = starty + kreisradius;
        int border=2;
        int seitenabstand=55;

        Bitmap bmOut = Bitmap.createBitmap(seitenlaenge+seitenabstand, seitenlaenge+seitenabstand, Bitmap.Config.ARGB_8888);
        bmOut.setHasAlpha(true);

        for(int x = 0; x < width; ++x) {
            for(int y = 0; y < height; ++y) {
                int distzumitte = (int) (Math.pow(mittx-x,2) + Math.pow(mitty-y,2)); // (Xm-Xp)^2 + (Ym-Yp)^2 = dist^2
                distzumitte = (int) Math.sqrt(distzumitte);

                pixel = src.getPixel(x, y);

                A = Color.alpha(pixel);
                R = (int)Color.red(pixel);
                G = (int)Color.green(pixel);
                B = (int)Color.blue(pixel);
                int color = Color.argb(A, R, G, B);

                int afterx=x-startx+(seitenabstand/2);
                int aftery=y-starty+(seitenabstand/2);

                if(x < startx || y < starty || afterx>=seitenlaenge+seitenabstand || aftery>=seitenlaenge+seitenabstand) //seitenrand
                {
                    continue;
                }
                else if(distzumitte > kreisradius)
                {
                    color=0x00FFFFFF;
                }
                else if(distzumitte > kreisradius-border && makeborder) //border
                {
                    color = Color.argb(A, 0, 0, 0);
                }
                bmOut.setPixel(afterx, aftery, color);
            }
        }

        return bmOut;
    }
Run Code Online (Sandbox Code Playgroud)

这个功能工作正常,但是有一些问题,我还无法解决.

  • 图像质量显着下降
  • 边框不是真正的圆形,但在图像的边缘看起来是平的(在某些设备上?!)

我很感激有关这些问题的任何帮助.我不得不承认,我不是最好的数学,应该有一个更好的公式来终止边界.

小智 1

我认为您需要检查 PorterDuffXferMode。

您可以在此处找到一些有关合成图像模式的技术信息。

这里有一些制作带有圆角边缘的位图的好例子。您只需要稍微调整一下源代码,就可以开始了……

希望它会有所帮助。