根据网格设置图像

问题描述 投票:0回答:1

目前我正在制作用于裁剪图像的自定义视图视图基本上是一个网格,它定义了裁剪区域,如3x3,3x2,3x1,并且在按钮点击时基本上将网格从3x3更改为3x2或一个查看图像所在的触摸图像,并根据网格调整图像(自定义视图)

现在问题是一些图像没有在3x3中调整,大多数图像都在调整

这里看到我的应用程序的图像

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网格中的半图像

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

android image view android-canvas
1个回答
2
投票

如果要根据屏幕大小动态绘制线条,则应在相机预览类中使用以下代码。

  @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);

下面的代码来源: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个相等的部分剪切图像

© www.soinside.com 2019 - 2024. All rights reserved.