根据网格设置图像
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 等份
目前我正在制作用于裁剪图像的自定义视图 该视图基本上是一个网格,它定义了裁剪区域,如 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 等份