안드로이드 소프트웨어 개발의 고스 모호 문제

앞서 안드로이드 소프트웨어에서 IOS 시스템과 유사한 모호한 효과가 사용되는 것을 보고 궁리하다가 하나 만들려고 인터넷에서 관련 자료를 많이 검색한 결과 이 블로그'안드로이드 고급 모호한 기술'이 특히 잘 쓰여져 있다는 것을 알고 연구를 시작했다.
내가 이 기능을 소프트웨어까지 할 때까지 기다렸다가 문제가 생겼는데 무슨 문제가 생겼을까?
원래 희미한 그림을 소프트웨어 전체 화면 인터페이스의 배경으로 하려고 했지만 레이아웃에 나타난 희미한 그림은 오른쪽 아래 가장자리에 검은색 변이 계속 나타나서 전체 화면을 가득 채울 수 없다.처음에는 희미한 매개 변수인 줄 알았는데 희미한 그림이 작아졌지만 희미한 그림의 하이라이트와 width를 프린트해 보니 문제가 없었다.
나중에 나는 실제 사용한 그림이 화면의 크기보다 조금 작고 모호하게 처리되기 전에 그림의 크기를 조정하지 않았기 때문에 출력된 모호한 그림은 보기(스크린)의 크기와 일치하지만 그림의 모호한 구역은 원래의 그림과 같은 크기로 남아서 남은 부분인 검은색의 가장자리를 남겼다고 생각했다.그래서 그림을 축소하는 도구 종류를 썼습니다. 모호하게 처리하기 전에 그림과 보기(스크린)의 크기를 동기화하고 문제를 해결합니다!
FastBlur.java
이 파일은 그림이 모호한 픽셀 처리 클래스로 프로젝트에 직접 넣습니다
package com.kuk.tools;
import android.graphics.Bitmap;
public class FastBlur {
    public static Bitmap doBlur(Bitmap sentBitmap, int radius, boolean canReuseInBitmap) {
        // Stack Blur v1.0 from
        // http://www.quasimondo.com/StackBlurForCanvas/StackBlurDemo.html
        //
        // Java Author: Mario Klingemann <mario at quasimondo.com>
        // http://incubator.quasimondo.com
        // created Feburary 29, 2004
        // Android port : Yahel Bouaziz <yahel at kayenko.com>
        // http://www.kayenko.com
        // ported april 5th, 2012
        // This is a compromise between Gaussian Blur and Box blur
        // It creates much better looking blurs than Box Blur, but is
        // 7x faster than my Gaussian Blur implementation.
        //
        // I called it Stack Blur because this describes best how this
        // filter works internally: it creates a kind of moving stack
        // of colors whilst scanning through the image. Thereby it
        // just has to add one new block of color to the right side
        // of the stack and remove the leftmost color. The remaining
        // colors on the topmost layer of the stack are either added on
        // or reduced by one, depending on if they are on the right or
        // on the left side of the stack.
        //
        // If you are using this algorithm in your code please add
        // the following line:
        //
        // Stack Blur Algorithm by Mario Klingemann <[email protected]>
        Bitmap bitmap;
        if (canReuseInBitmap) {
            bitmap = sentBitmap;
        } else {
            bitmap = sentBitmap.copy(sentBitmap.getConfig(), true);
        }
        if (radius < 1) {
            return (null);
        }
        int w = bitmap.getWidth();
        int h = bitmap.getHeight();
        int[] pix = new int[w * h];
        bitmap.getPixels(pix, 0, w, 0, 0, w, h);
        int wm = w - 1;
        int hm = h - 1;
        int wh = w * h;
        int div = radius + radius + 1;
        int r[] = new int[wh];
        int g[] = new int[wh];
        int b[] = new int[wh];
        int rsum, gsum, bsum, x, y, i, p, yp, yi, yw;
        int vmin[] = new int[Math.max(w, h)];
        int divsum = (div + 1) >> 1;
        divsum *= divsum;
        int dv[] = new int[256 * divsum];
        for (i = 0; i < 256 * divsum; i++) {
            dv[i] = (i / divsum);
        }
        yw = yi = 0;
        int[][] stack = new int[div][3];
        int stackpointer;
        int stackstart;
        int[] sir;
        int rbs;
        int r1 = radius + 1;
        int routsum, goutsum, boutsum;
        int rinsum, ginsum, binsum;
        for (y = 0; y < h; y++) {
            rinsum = ginsum = binsum = routsum = goutsum = boutsum = rsum = gsum = bsum = 0;
            for (i = -radius; i <= radius; i++) {
                p = pix[yi + Math.min(wm, Math.max(i, 0))];
                sir = stack[i + radius];
                sir[0] = (p & 0xff0000) >> 16;
                sir[1] = (p & 0x00ff00) >> 8;
                sir[2] = (p & 0x0000ff);
                rbs = r1 - Math.abs(i);
                rsum += sir[0] * rbs;
                gsum += sir[1] * rbs;
                bsum += sir[2] * rbs;
                if (i > 0) {
                    rinsum += sir[0];
                    ginsum += sir[1];
                    binsum += sir[2];
                } else {
                    routsum += sir[0];
                    goutsum += sir[1];
                    boutsum += sir[2];
                }
            }
            stackpointer = radius;
            for (x = 0; x < w; x++) {
                r[yi] = dv[rsum];
                g[yi] = dv[gsum];
                b[yi] = dv[bsum];
                rsum -= routsum;
                gsum -= goutsum;
                bsum -= boutsum;
                stackstart = stackpointer - radius + div;
                sir = stack[stackstart % div];
                routsum -= sir[0];
                goutsum -= sir[1];
                boutsum -= sir[2];
                if (y == 0) {
                    vmin[x] = Math.min(x + radius + 1, wm);
                }
                p = pix[yw + vmin[x]];
                sir[0] = (p & 0xff0000) >> 16;
                sir[1] = (p & 0x00ff00) >> 8;
                sir[2] = (p & 0x0000ff);
                rinsum += sir[0];
                ginsum += sir[1];
                binsum += sir[2];
                rsum += rinsum;
                gsum += ginsum;
                bsum += binsum;
                stackpointer = (stackpointer + 1) % div;
                sir = stack[(stackpointer) % div];
                routsum += sir[0];
                goutsum += sir[1];
                boutsum += sir[2];
                rinsum -= sir[0];
                ginsum -= sir[1];
                binsum -= sir[2];
                yi++;
            }
            yw += w;
        }
        for (x = 0; x < w; x++) {
            rinsum = ginsum = binsum = routsum = goutsum = boutsum = rsum = gsum = bsum = 0;
            yp = -radius * w;
            for (i = -radius; i <= radius; i++) {
                yi = Math.max(0, yp) + x;
                sir = stack[i + radius];
                sir[0] = r[yi];
                sir[1] = g[yi];
                sir[2] = b[yi];
                rbs = r1 - Math.abs(i);
                rsum += r[yi] * rbs;
                gsum += g[yi] * rbs;
                bsum += b[yi] * rbs;
                if (i > 0) {
                    rinsum += sir[0];
                    ginsum += sir[1];
                    binsum += sir[2];
                } else {
                    routsum += sir[0];
                    goutsum += sir[1];
                    boutsum += sir[2];
                }
                if (i < hm) {
                    yp += w;
                }
            }
            yi = x;
            stackpointer = radius;
            for (y = 0; y < h; y++) {
                // Preserve alpha channel: ( 0xff000000 & pix[yi] )
                pix[yi] = (0xff000000 & pix[yi]) | (dv[rsum] << 16) | (dv[gsum] << 8) | dv[bsum];
                rsum -= routsum;
                gsum -= goutsum;
                bsum -= boutsum;
                stackstart = stackpointer - radius + div;
                sir = stack[stackstart % div];
                routsum -= sir[0];
                goutsum -= sir[1];
                boutsum -= sir[2];
                if (x == 0) {
                    vmin[y] = Math.min(y + r1, hm) * w;
                }
                p = x + vmin[y];
                sir[0] = r[p];
                sir[1] = g[p];
                sir[2] = b[p];
                rinsum += sir[0];
                ginsum += sir[1];
                binsum += sir[2];
                rsum += rinsum;
                gsum += ginsum;
                bsum += binsum;
                stackpointer = (stackpointer + 1) % div;
                sir = stack[stackpointer];
                routsum += sir[0];
                goutsum += sir[1];
                boutsum += sir[2];
                rinsum -= sir[0];
                ginsum -= sir[1];
                binsum -= sir[2];
                yi += w;
            }
        }
        bitmap.setPixels(pix, 0, w, 0, 0, w, h);
        return (bitmap);
    }
}

PictureZoom.java
그림% 1개의 캡션을 편집했습니다.
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Matrix;
/**
 *             
 * <p>
 *               ,                
 * </p>
 * @author Macneil.Gu
 */
public class PictureZoom {
    private Context context;
    public PictureZoom(Context context) {
        this.context = context;
    }
    
    /**
     *           
     * 
     * @param bitmap Bitmap     
     * @param x     
     * @param y     
     * @return           
     */
    public Bitmap Zoom(Bitmap bitmap, float x, float y) {
        //      
        int width = bitmap.getWidth();
        int height = bitmap.getHeight();
        
        //           (   ),  / 
        float sx = x / width;
        float sy = y / height;
        
        //      
        Matrix mtr = new Matrix();
        mtr.postScale(sx, sy);
        
        //      
        Bitmap bm = Bitmap.createBitmap(bitmap, 0, 0, width, height, mtr, true);
        return bm;
    }
}

MainActivity.java
고스 모호 처리 함수
/**
     *       
     * <p>
     * <code>      1/8       ,             ,        </code>
     * </p>
     * @param bitmap          
     * @param view        
     */
    private void blur(Bitmap bitmap, View view) {
        float scaleFactor = 8;
        float radius = 2;
        Bitmap overlay = Bitmap.createBitmap(
                (int) (view.getMeasuredWidth() / scaleFactor),
                (int) (view.getMeasuredHeight() / scaleFactor),
                Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas(overlay);
        canvas.translate(-view.getLeft() / scaleFactor, -view.getTop()
                / scaleFactor);
        canvas.scale(1 / scaleFactor, 1 / scaleFactor);
        Paint paint = new Paint();
        paint.setFlags(Paint.FILTER_BITMAP_FLAG); //      
        canvas.drawBitmap(bitmap, 0, 0, paint);
        overlay = FastBlur.doBlur(overlay, (int) radius, true);
        view.setBackgroundDrawable(new BitmapDrawable(getResources(), overlay));
    }

>> 원 블로그의 주석:
● scaleFactor는 축소해야 할 등급을 제공합니다. 코드에서bitmap의 사이즈를 원도의 1/8로 축소합니다.이bitmap은 모호 처리를 할 때 먼저 축소된 다음에 확대되기 때문에 나의 모호 알고리즘에서radius라는 인자를 사용하지 않기 때문에 2로 설정합니다.
● 이어서 비트맵을 만들어야 한다. 이 비트맵은 마지막에 필요한 것보다 8배 작다.
● 제가 Paint에 FILTER를 제공했음을 주의하세요BITMAP_FLAG 표시, 이렇게 하면bitmap 축소를 처리할 때 이중 버퍼 효과를 얻을 수 있고 모호 처리 과정이 더욱 원활해진다.
● 그 다음에 이전과 같이 모호처리 작업을 했는데 이번 그림은 많이 작아졌고 폭도 많이 낮아져서 모호과정이 매우 빠르다.
● 흐릿하게 처리된 그림을 배경으로 하면 자동으로 확대 작업을 한다.
위의 모호 처리 함수를 호출하여 지정된 그림에 대한 모호 처리를 레이아웃의 ImageView에 표시합니다.
//       
 WindowManager wm = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
 
 //     
 PictureZoom pz = new PictureZoom(this);
 //            
 Bitmap mybm = pz.Zoom(bm, wm.getDefaultDisplay().getWidth(), wm.getDefaultDisplay().getHeight());
 //     ,blurImage ImageView  ,          
 blur(mybm, blurImage);

>> 위의 세 파일을 같은 패키지 아래에 두고 사용하지 않으면 파일을 가져와서 사용해야 합니다.만약 모두가 꼬치꼬치 캐묻는 것을 좋아한다면, 원박문을 자세히 읽을 수 있다.

좋은 웹페이지 즐겨찾기