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

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

作业:创建一个应用程序,可以在批处理运行中自动裁剪图像中的黑色边框。 图像质量从100-300dpi,1bpp-24bpp不等,批次可以从10-10000个图像变化。

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

进展:以上所有都已完成,并且有效,但……

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

尝试:我试过了

Bitmap imgBitonal = imgOriginal.Clone(new Rectangle(0, 0, b.Width, b.Height), PixelFormat.Format1bppIndexed)

还有这个 。 两者都有效,但似乎没有人给我手动设置阈值的可能性。 我需要用户能够设置此值,并在运行批处理之前使用我的“预览”function,以查看设置是否有用。

哭泣:我在这里不知所措。 我现在不做该做什么或怎么做。 请帮助编码员。 指向一个方向,告诉我链接中找到的代码在哪里找到一个阈值(我没有找到一个,或者不知道在哪里看)或者只是给我一些有用的代码。 任何帮助表示赞赏。

试试这个,从非常快的1bpp转换 :

从这里复制将24bpp位图转换为1bpp

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