根据网格设置图像

setting the image according to the grid

目前我正在制作用于裁剪图像的自定义视图 该视图基本上是一个网格,它定义了裁剪区域,如 3x3、3x2、3x1 并基本上将网格从 3x3 更改为 3x2,或者分别在单击按钮时更改网格,然后再查看触摸图像,其中图像就位并根据网格调整图像(自定义视图)

现在的问题是一些图像在 3x3 中没有得到调整,大部分图像都得到了调整

在此处查看我的应用程序图片

它实际上应该是什么样的

这就是问题所在,即使在 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 网格中获得一半图像

这是我所有的项目文件Project Files

如果您想根据屏幕尺寸动态绘制线条,那么您应该在相机预览中使用以下代码 class。

  @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 中的代码中,您正在尝试绘制一个您不需要的圆圈,如问题中所述 您还需要在相机预览的构造函数中添加以下行 class:

this.setWillNotDraw(false);

下面的代码源:Divide Image into parts

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 等份