настройка изображения в соответствии с сеткой - PullRequest
0 голосов
/ 16 февраля 2019

В настоящее время я делаю пользовательский вид, который используется для обрезки изображения. Вид - это, в основном, сетка, которая определяет область кадрирования, например 3x3,3x2,3x1, и меняет сетку в основном с 3x3 на 3x2 или один соответственно при нажатии кнопки.и еще один просмотр сенсорного изображения, где изображение сидит и изображение регулируется в соответствии с сеткой (пользовательский вид)

Теперь проблема заключается в том, что часть изображения не настраивается в 3х3, в основном все изображениенастраивается

Здесь см. изображение моего приложения

Image of my app

Как это должно быть на самом деле

what it actually should be

В этом проблема, и даже в 3x2,3x1 изображение обрезается, я думаю, что проблема с моим наблюдателем, где я поместил код для настройки изображения

private class CObserver implements ViewTreeObserver.OnGlobalLayoutListener {

    public void onGlobalLayout() {
        MainActivity.this.gridLineView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
        GridLineView.gridHeight = MainActivity.this.gridLineView.getGridHeight();
        Uri parse = Uri.parse(MainActivity.this.getIntent().getExtras().getString("imageUri"));
        Log.e("selectedImage", parse.toString());
        Point point = new Point();
        MainActivity.this.getWindowManager().getDefaultDisplay().getSize(point);
        int i = point.x;
        int i2 = point.y;
        if (i == 0 || i2 == 0) {
            DisplayMetrics displayMetrics = new DisplayMetrics();
            MainActivity.this.getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
            i = displayMetrics.widthPixels;
            i2 = displayMetrics.heightPixels;
        }
        try {
            MainActivity mainActivity = MainActivity.this;
            Context context = MainActivity.this;
            double d = (double) i;
            i = (int) (d * 1.5d);
            Log.e("i",i+"");
            Bitmap bitmap = MediaStore.Images.Media.getBitmap(context.getContentResolver() ,parse);
            Bitmap samplebitmap=scaleBitmap(bitmap,i,i2);
            //Bitmap samplebitmap = mainActivity.decodeSampledBitmapFromInputStream(context, parse, i, i2);
            //Bitmap samplebitmap = Bitmap.createScaledBitmap(bitmap,i,i2,false);
            MainActivity.this.origBitmap = samplebitmap;
            if (samplebitmap != null) {
                MainActivity.this.touchImageView.setImageBitmap(samplebitmap);
            }
        } catch (IOException e) {
            Log.e("Error", e.getMessage());
            e.printStackTrace();
        }
    }
}

так что если кто-нибудь может помочь мне с моим кодом исправить изображение, показанное в 3x3, и получить половину изображения в сетке 3x2

Вот мои все файлы проекта Файлы проекта

1 Ответ

0 голосов
/ 16 февраля 2019

Если вы хотите рисовать линии динамически в соответствии с размером экрана, вам следует использовать следующий код в классе предварительного просмотра камеры.

  @Override  
    protected void onDraw(Canvas canvas)  
    { 
        if(grid){
        //  Find Screen size first  
        DisplayMetrics metrics = Resources.getSystem().getDisplayMetrics();  
        int screenWidth = metrics.widthPixels;  
        int screenHeight = (int) (metrics.heightPixels*0.9);  

        //  Set paint options  
        paint.setAntiAlias(true);  
        paint.setStrokeWidth(3);  
        paint.setStyle(Paint.Style.STROKE);  
        paint.setColor(Color.argb(255, 255, 255, 255));  

        canvas.drawLine((screenWidth/3)*2,0,(screenWidth/3)*2,screenHeight,paint);
        canvas.drawLine((screenWidth/3),0,(screenWidth/3),screenHeight,paint);
        canvas.drawLine(0,(screenHeight/3)*2,screenWidth,(screenHeight/3)*2,paint);
        canvas.drawLine(0,(screenHeight/3),screenWidth,(screenHeight/3),paint);
        }
    } 

то, что мы пытаемся сделать в приведенном выше коде, - этоНарисуйте три линии по горизонтали и по вертикали с равным интервалом между ними в вашем коде внутри @OnDraw. Вы пытаетесь нарисовать окружность, которая вам не нужна, как указано в вопросе. Вам также необходимо добавить следующую строку в конструктор вашей камеры.класс предварительного просмотра:

this.setWillNotDraw(false);

ниже исходного кода: Разделите изображение на части

public ArrayList<Bitmap> splitBitmap(Bitmap bitmap, int xCount, int yCount) {
    ArrayList<Bitmap> pieces = new ArrayList<>(piecesNumber);
    int width, height;
    width = bitmap.getWidth() / xCount;
    height = bitmap.getHeight() / yCount;
    for(int x = 0; x < xCount; ++x) {
        for(int y = 0; y < yCount; ++y) {
            pieces.add(Bitmap.createBitmap(bitmap, x * width, y * height, width, height));
        }
    }
    return pieces;
}

Приведенный выше код разделит изображение на 9 равных частей

...