Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/268.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# 将图像转换为1bpp时的阈值?_C#_Image_Image Processing_Graphics_Crop - Fatal编程技术网

C# 将图像转换为1bpp时的阈值?

C# 将图像转换为1bpp时的阈值?,c#,image,image-processing,graphics,crop,C#,Image,Image Processing,Graphics,Crop,我不知道如何标记这个问题,如果可能,请编辑 作业:创建一个应用程序,该应用程序可以批量自动裁剪图像中的黑色边框。图像的质量在100-300dpi、1bpp-24bpp之间变化,一批图像的质量在10-10000之间变化 计划:将图像转换为1bpp(黑白双色,如果还没有),在“清理”白点/污垢/噪声后,找到黑色结束和白色开始的地方,这些是图像裁剪的新坐标,将它们应用于原始图像的克隆。删除旧图像,保存新图像 进展情况:以上所有工作都已完成,并且可以正常工作,但是 问题:转换为1bpp时,我无法控制“阈

我不知道如何标记这个问题,如果可能,请编辑

作业:创建一个应用程序,该应用程序可以批量自动裁剪图像中的黑色边框。图像的质量在100-300dpi、1bpp-24bpp之间变化,一批图像的质量在10-10000之间变化

计划:将图像转换为1bpp(黑白双色,如果还没有),在“清理”白点/污垢/噪声后,找到黑色结束和白色开始的地方,这些是图像裁剪的新坐标,将它们应用于原始图像的克隆。删除旧图像,保存新图像

进展情况:以上所有工作都已完成,并且可以正常工作,但是

问题:转换为1bpp时,我无法控制“阈值”。我需要这个。许多暗图像被裁剪得太多

尝试:我已经尝试过了

Bitmap imgBitonal=imgOriginal.Clone(新矩形(0,0,b.宽度,b.高度),PixelFormat.format1bpindexed)

还有。这两种方法都有效,但似乎都不能让我手动设置阈值。我需要用户能够设置此值,以及其他,并在运行批处理之前使用我的“预览”功能,以便查看设置是否良好

喊声:我在这里不知所措。我现在不知道该做什么或怎么做。请帮助一位编码员。向我指出一个方向,告诉我在链接中找到的代码中哪里有阈值(我没有找到阈值,或者不知道在哪里可以找到),或者给我一些有效的代码。非常感谢您的帮助。

请尝试以下方法:

从这里复制

私有静态无效转换(位图src、位图conv)
{
//在内存中锁定源和目标以进行不安全的访问
var bmbo=src.LockBits(新矩形(0,0,src.Width,src.Height),ImageLockMode.ReadOnly,
像素格式);
var bmdn=conv.LockBits(新矩形(0,0,conv.Width,conv.Height),ImageLockMode.ReadWrite,
conv.pixel格式);
var srcScan0=bmbo.Scan0;
var convScan0=bmdn.Scan0;
var srcStride=bmbo.Stride;
var convStride=bmdn.Stride;
字节*源像素=(字节*)(空*)srcScan0;
字节*destPixels=(字节*)(空*)convScan0;
var srcLineIdx=0;
var convLineIdx=0;
var hmax=src.Height-1;
var wmax=src.Width-1;
对于(int y=0;y0.01f)
if(!(sourcePixels[srcIdx]==0&&sourcePixels[srcIdx+1]==0&&sourcePixels[srcIdx+2]==0))
{
//像素的目标字节(1bpp,即每字节8像素)
var idx=convLineIdx+(x>>3);
//屏蔽目标字节中的像素位
destPixels[idx]|=(字节)(0x80>>(x&0x7));
}
}
}
src.解锁位(bmbo);
转换解锁位(bmdn);
}
提供了一些有用的答案。我尝试过bob Powell的代码()工作正常,我可以控制阈值。但是,它比我问题中的链接慢12-15倍。在处理成百上千的图像时,这确实是不可接受的。
        private static unsafe void Convert(Bitmap src, Bitmap conv)
        {
            // Lock source and destination in memory for unsafe access
            var bmbo = src.LockBits(new Rectangle(0, 0, src.Width, src.Height), ImageLockMode.ReadOnly,
                                     src.PixelFormat);
            var bmdn = conv.LockBits(new Rectangle(0, 0, conv.Width, conv.Height), ImageLockMode.ReadWrite,
                                     conv.PixelFormat);

            var srcScan0 = bmbo.Scan0;
            var convScan0 = bmdn.Scan0;

            var srcStride = bmbo.Stride;
            var convStride = bmdn.Stride;

            byte* sourcePixels = (byte*)(void*)srcScan0;
            byte* destPixels = (byte*)(void*)convScan0;

            var srcLineIdx = 0;
            var convLineIdx = 0;
            var hmax = src.Height-1;
            var wmax = src.Width-1;
            for (int y = 0; y < hmax; y++)
            {
                // find indexes for source/destination lines

                // use addition, not multiplication?
                srcLineIdx += srcStride;
                convLineIdx += convStride;

                var srcIdx = srcLineIdx;
                for (int x = 0; x < wmax; x++)
                {
                    // index for source pixel (32bbp, rgba format)
                    srcIdx += 4;
                    //var r = pixel[2];
                    //var g = pixel[1];
                    //var b = pixel[0];

                    // could just check directly?
                    //if (Color.FromArgb(r,g,b).GetBrightness() > 0.01f)
                    if (!(sourcePixels[srcIdx] == 0 && sourcePixels[srcIdx + 1] == 0 && sourcePixels[srcIdx + 2] == 0))
                    {
                        // destination byte for pixel (1bpp, ie 8pixels per byte)
                        var idx = convLineIdx + (x >> 3);
                        // mask out pixel bit in destination byte
                        destPixels[idx] |= (byte)(0x80 >> (x & 0x7));
                    }
                }
            }
            src.UnlockBits(bmbo);
            conv.UnlockBits(bmdn);
        }