gpt4 book ai didi

java - 裁剪图像会降低质量并且边框看起来很糟糕

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:00:27 24 4
gpt4 key购买 nike

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

我的函数代码如下:

 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;
}

此功能运行良好,但出现了一些我无法解决的问题。

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

对于该问题的任何帮助,我将不胜感激。我必须承认我在数学方面不是最好的,可能应该有一个更好的公式来划定边界。

最佳答案

您的源代码很难阅读,因为它在变量名中混合了德语和英语。此外,您没有说明您使用的是哪个图像库,因此我们无法确切知道 Bitmap 和 Color 类的来源。

不管怎样,很明显,你只是在Bitmap上操作。位图是指将整个图像逐个像素地存储在 RAM 中。没有有损压缩。我在您的源代码中没有看到任何会影响图像质量的内容。

很有可能,答案就在您没有向我们展示的代码中。此外,您所描述的(两个问题)听起来像是非常典型的低质量 JPEG 压缩。我敢肯定,在您调用函数后的某个地方,您将图像转换/保存为 JPEG。 尝试在 BMP、TIFF 或 PNG 的那个位置执行此操作,然后看到错误神奇地消失了。也许您还可以在某处设置 JPEG 的质量级别来避免这种情况。

为了让其他人(也许)也更容易找到好的答案,请允许我将您的代码翻译成英文:

    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 sideLength,startx,starty;
if(width>height)
{
sideLength=height;
starty=0;

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

starty = middley - (sideLength/2);
}

int circleRadius = sideLength/2;
int middleX = startx + circleRadius;
int middleY = starty + circleRadius;
int border=2;
int sideDistance=55;

Bitmap bmOut = Bitmap.createBitmap(sideLength+sideDistance, sideLength+sideDistance, Bitmap.Config.ARGB_8888);
bmOut.setHasAlpha(true);

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

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+(sideDistance/2);
int aftery=y-starty+(sideDistance/2);

if(x < startx || y < starty || afterx>=sideLength+sideDistance || aftery>=sideLength+sideDistance) //margin
{
continue;
}
else if(distanceToMiddle > circleRadius)
{
color=0x00FFFFFF;
}
else if(distanceToMiddle > circleRadius-border && makeborder) //border
{
color = Color.argb(A, 0, 0, 0);
}
bmOut.setPixel(afterx, aftery, color);
}
}

return bmOut;
}

关于java - 裁剪图像会降低质量并且边框看起来很糟糕,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17704035/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com