Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java.lang.IllegalArgumentException:宽度(-2147483647)和高度(-2147483647)不能为<;=0_Java_Image Processing - Fatal编程技术网

java.lang.IllegalArgumentException:宽度(-2147483647)和高度(-2147483647)不能为<;=0

java.lang.IllegalArgumentException:宽度(-2147483647)和高度(-2147483647)不能为<;=0,java,image-processing,Java,Image Processing,此问题与以下自动裁剪方法有关: 在Eclipse中尝试运行以下Java代码时,我遇到以下异常: Exception in thread "main" java.lang.IllegalArgumentException: Width (-2147483647) and height (-2147483647) cannot be <= 0 at java.awt.image.DirectColorModel.createCompatibleWritableRaster(Unkno

此问题与以下自动裁剪方法有关:

在Eclipse中尝试运行以下Java代码时,我遇到以下异常:

     Exception in thread "main" java.lang.IllegalArgumentException: Width (-2147483647) and height (-2147483647) cannot be <= 0
at java.awt.image.DirectColorModel.createCompatibleWritableRaster(Unknown Source)
at java.awt.image.BufferedImage.<init>(Unknown Source)
at getCroppedImage.getCropImage(getCroppedImage.java:44)
at getCroppedImage.<init>(getCroppedImage.java:16)
at getCroppedImage.main(getCroppedImage.java:79)

线程“main”java.lang.IllegalArgumentException中的异常:宽度(-2147483647)和高度(-2147483647)不能为

BufferedImage destination = new BufferedImage((bottomX - topX + 1),
                (bottomY - topY + 1), BufferedImage.TYPE_INT_ARGB);
当我在这一行之前添加一个print语句时,如下所示

System.out.println((bottomX - topX + 1) + " " + (bottomY - topY + 1));
int topY = Integer.MAX_VALUE, topX = Integer.MAX_VALUE;
它打印了-2147483647-2147483647
。然后我看到,您已经初始化了
topY
topX
,如下所示

System.out.println((bottomX - topX + 1) + " " + (bottomY - topY + 1));
int topY = Integer.MAX_VALUE, topX = Integer.MAX_VALUE;
实际上,没有一个变量-
topX
topY
bottomX
bottomY
没有得到更新,因为以下
if
条件的计算结果从来都不是
True

if (colorWithinTolerance(baseColor, source.getRGB(x, y), tolerance)) {
    // your code goes here
}
当我检查您的
colorWithInstitution()
函数时,我发现以下问题

private boolean colorWithinTolerance(int a, int b, double tolerance) {
    // your code
    return (percentAway > tolerance);
}
此条件应为-
percentAway
。因为如果
percentAway
大于
公差
,则在检查距离是否在给定公差限制范围内时,函数应返回
False


我编写了调试过程,以便您可以从下次开始调试自己的代码。

算法说明:

该算法将左上角点视为白色,并查找与之至少相差%的所有像素(远离>):这将导致与白色不同的区域,因为您希望裁剪出白色,而白色应该是您的有效区域

唯一的问题是公差应该是百分之一,因为

percentAway = distance / 510.0d
不能超过一个(这是颜色距离的标准化数量)

因此,如果将公差定义为十进制

比如说

BufferedImage resultImage1 = getCropImage(image, 0.2);
应该有用


(条件保持在percentAway>tolerance)

Hi我检查过,在触发问题代码之前,宽度和高度不是负值。如中所述,如果我在输入引起问题的if颜色公差行之前打印宽度和高度,它既不是负数也不是零。我也尝试过使用具有相同问题的不同图像文件,问题可能是我读取图像文件的方式吗?您能提一下在哪一行中出现错误吗?如果(ColorWithInsertainment(baseColor,source.getRGB(x,y,tolerance))导致problem@lahronin你说得对,这是
if
语句(间接),因为如果条件从来都不是
true
,那么
topY
bottomY
会保留它们的初始值,所以
bottomY-topY+1
=
-1-MAX_值+1
=
-MAX_值
=-2147483647
,这就是你看到的。哎哟!!当你想回答这个问题的时候,我投票决定以typo.OP结束这个问题检查某个值是否在某个公差范围内,然后您应该检查该值是否较低,而不是较高。感谢您的解释,我对图像处理是新手,您的评论肯定有帮助。现在确实发生了裁剪,但我不太明白为什么输出图片会失真,因为颜色公差部分只是为了他lp确定新的x和y坐标,我看不出代码是如何导致颜色变化的?只是为了提供一些上下文,我试图从文档的照片中裁剪出文档,也许这不是预期的目的。然而,你是否认为在应用新坐标之前,制作一份副本来确定坐标e原件可以解决这个问题?或者先将此副本转换为黑白/灰度可以提高准确性?