Używając jakiejś matematyki, stworzyłem następującą funkcję java, aby wprowadzić bitmapę, i wyciąć kwadrat wyśrodkowany, w którym kółko jest wykadrowane ponownie z czarną obwódką wokół niego . Reszta kwadratu powinna być przezroczysta. Co więcej, odległość między bokami jest przezroczysta, aby nie uszkodzić podglądu podczas wysyłania obrazu za pośrednictwem Posłańców.Kadrowanie obrazu obniża jakość, a obramowanie wygląda źle
Kod z mojej funkcji jest następująca:
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;
}
Ta funkcja działa prawidłowo, ale są pewne problemy występujące, że nie był w stanie jeszcze rozwiązać.
- Jakość obrazu jest znacznie spadła
- Granica naprawdę nie jest okrągła, ale wydaje się być płaska na krawędziach obrazu (na niektórych urządzeniach ?!)
I” doceniamy każdą pomoc dotyczącą tych problemów. Muszę przyznać, że nie jestem najlepszy w matematyce i prawdopodobnie powinna istnieć lepsza formuła zakończenia granicy.
+1 do tłumaczenia –