Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/322.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.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
C# 在不知道x和y的情况下进行图像裁剪#_C#_Image - Fatal编程技术网

C# 在不知道x和y的情况下进行图像裁剪#

C# 在不知道x和y的情况下进行图像裁剪#,c#,image,C#,Image,我在网上做了一些搜索,但找不到解决问题的方法 我有各种tiff图像文件,它们都有白色背景,并包含一个小图像 示例tiff图像大小为2700 x 3500,小图像位于200200处,为300x300 我需要裁剪出图像的这一部分,现在这很容易,但我有很多tiff图像,tiff中包含的小图像可能位于不同的位置,大小不同 我确实试着检查每个像素,找到第一个非白色像素的实例,向下扫描到页面底部,然后继续扫描,这是一个非常繁重的过程,结果好坏参半,主要是因为我在寻找白色像素,有时tiff中包含的图像有白色部

我在网上做了一些搜索,但找不到解决问题的方法

我有各种tiff图像文件,它们都有白色背景,并包含一个小图像

示例tiff图像大小为2700 x 3500,小图像位于200200处,为300x300

我需要裁剪出图像的这一部分,现在这很容易,但我有很多tiff图像,tiff中包含的小图像可能位于不同的位置,大小不同

我确实试着检查每个像素,找到第一个非白色像素的实例,向下扫描到页面底部,然后继续扫描,这是一个非常繁重的过程,结果好坏参半,主要是因为我在寻找白色像素,有时tiff中包含的图像有白色部分

我不知道如何处理这个问题,任何帮助都将不胜感激

我确实试着检查每个像素,找到第一个非白色像素的实例,向下扫描到页面底部,然后继续扫描,这是一个非常繁重的过程,结果好坏参半,主要是因为我在寻找白色像素,有时tiff中包含的图像有白色部分

你们并没有发布你们的代码,所以我不能确定你们现在使用的是什么算法,但通过每个像素的一个循环就足以找到白色背景上的图像

示例代码:

int minX, minY, maxX, maxY;

minX = (int) image.Width;
minY = (int) image.Height;
maxX = maxY = 0;

for (int x = 0; x < image.Width; x++)
{
    for (int y = 0; y < image.Height; y++)
    {
        var color = GetPixelColor(image, x, y);
        if(color!=Colors.White)
        {
            minX = Math.Min(minX, x);
            maxX = Math.Max(maxX, x);
            minY = Math.Min(minY, y);
            maxY = Math.Max(maxY, y);
        }
    }
}
int minX,minY,maxX,maxY;
minX=(int)image.Width;
minY=(int)image.Height;
maxX=maxY=0;
对于(int x=0;x
在这里:

  • minX
    -X最顶部非白色像素的坐标
  • minY
    -Y最左侧非白色像素的坐标
  • maxX
    -X最低非白色像素的坐标
  • maxY
    -最右侧非白色像素的Y坐标
所需图像从
(minX,minY)
(maxX,maxY)


嵌套循环需要
Width*Height
步骤才能完成。您需要实现
GetPixelColor
方法来按坐标检查像素。算法的性能主要取决于
GetPixelColor
的实现。如果要在阵列中存储像素颜色,此算法对于大多数目的来说应该足够有效。

扫描一行/一列,如果它是相同的颜色,则删除它。这将消除末尾的任何边框。我可以删除位图中的行和列吗?如果可以的话,这可能是一个解决方案。请参阅“锁定”位图的示例,该示例可以让您更快地读取像素数据,如果您还没有这样做的话。您不必删除。您可以找到您的
x
y
,然后使用@King solution进行裁剪(如果可行的话)。这就是“为我编写算法”。你的问题不是C代码,而是定义一个算法。当然你可以想出一个更有效的方法来找到非白色像素?你必须检查每个像素,还是可以进行“二进制搜索”?就像从中心开始,然后测试边界和中心之间的像素,然后测试边界和中心之间的像素,等等。@CodeCaster从OP的描述来看,她/他似乎在做一些不必要的事情(三重嵌套循环或其他事情)<代码>10^6
操作不会花费太多时间。嘿,默认区域设置,谢谢你,我刚刚编写了类似的代码,但使用了get pixel,需要两个函数都返回一个点,好的是它一发现非白色像素就返回,图像越大,返回越快。您的实现要好得多,尽管它仍然贯穿每个像素,非常感谢。