应用程序C#图像质量

应用程序C#图像质量,c#,image,image-processing,C#,Image,Image Processing,我正在用C#开发一个应用程序。在我开发的应用程序中,我使用用户选择的图片文件,并将图片传输到表单上 在这一步之后,我想对图片的位图进行更改。例如,以小尺寸调整图像大小并转换为1bpp颜色格式 我现在可以做这些,我可以调整图像大小并将其转换为1bpp颜色格式,但在这一点上,我认为我有质量问题 例如,当我拍摄文本的屏幕截图并将其发送到程序时,当我以调整大小的1bpp颜色格式查看文本时,我发现文本中的字母明显不好 我展示了我使用的算法和应用程序的屏幕截图: Bitmap bmp = new Bitma

我正在用C#开发一个应用程序。在我开发的应用程序中,我使用用户选择的图片文件,并将图片传输到表单上

在这一步之后,我想对图片的位图进行更改。例如,以小尺寸调整图像大小并转换为1bpp颜色格式

我现在可以做这些,我可以调整图像大小并将其转换为1bpp颜色格式,但在这一点上,我认为我有质量问题

例如,当我拍摄文本的屏幕截图并将其发送到程序时,当我以调整大小的1bpp颜色格式查看文本时,我发现文本中的字母明显不好

我展示了我使用的算法和应用程序的屏幕截图:

Bitmap bmp = new Bitmap(ResizeImage.filePath);
Bitmap bmpOriginalRGB = Helper.ImageResize(bmp, 512, 384);
pcbox1.Image = bmpOriginalRGB;

Bitmap bmpResizeRGB = Helper.ImageResize(bmp, ResizeWidth, ResizeHeight);
pcbox2.Image = bmpResizeRGB;

Bitmap bmpResize1BPP_1 = Helper.ConvertTo1BppImage(Helper.ImageResize(bmp, ResizeWidth, ResizeHeight));
pcbox3.Image = bmpResize1BPP_1;

Bitmap bmpResize1BPP_2 = bmpResizeRGB.Clone(new Rectangle(0, 0, ResizeWidth, ResizeHeight), PixelFormat.Format1bppIndexed);
pcbox4.Image = bmpResize1BPP_2;
Bitmap oledBitmap = bmpResize1BPP_2;




例如,在第二个屏幕图像中,女性的阴影显示为黑色。我不想那样。我想看到更清晰的黑白图像

你认为有可能进一步提高这张照片的质量吗


编辑:很抱歉翻译..

我不认为你的问题在于大小调整的质量,而是从灰度到黑白的转换

调整大小时,将相邻像素的颜色平均在一起,以获得近似像素集的新颜色。因此,从200x200像素的图像到100x100像素的图像,一组4个像素变成一个像素。它看起来仍然相当不错,但是纯黑色文本将变成一系列灰色像素。精确公式将因使用的插值方法而异。但是,当调整一段漂亮的黑白文本的大小时,文本最终会变得更亮或更灰(这在以后会很重要)

但是,当从灰度(或全色)变为黑白时,每个像素最终都是黑白的,没有其他选项,但有不同的算法用于确定哪些像素最终是黑白的,通常称为抖动。()

您的第一张黑白图像似乎使用了某种形式的错误扩散,很可能是Floyd Steinberg。它往往在真实世界的图像上工作得相当好,并将灰色区域转换为间隔开的黑色像素,视觉上近似于它们所在区域的灰色

您的第二张黑白图像似乎是一个简单的阈值算法。基本上,比某一颜色暗的像素最终会变成黑色,而所有其他像素最终都会变成白色。只需设置用作阈值的颜色,即可调整图像。通常这对文本很有效,但您需要调整用作阈值的值,但我不知道您使用的库是否允许这样做。我发现,通过编程选择阈值的有效方法是,将每种颜色的像素总数加起来,然后假设某个百分比为黑色(文本通常为白色),然后选择提供该黑色像素数的阈值

还有很多其他的抖动算法可以尝试,还有边缘检测算法。在转换为黑白之前,您还可以尝试调整图像的对比度


但是,在一天结束时,当分辨率较低(每个字符的像素数)时,可能无法轻松地将其转换为b/w并使其仍然可读(只需尝试在标准模式下在传真机上传真小文本)。请记住,调整大小删除了大量信息,从8位到1位的转换又删除了调整大小图片中87%的信息。

为什么要使用1bpp?您已经发布了此问题。删除并重新发布封闭式问题违反了社区规则。不要那样做。当你的问题结束时,你的工作就是首先解决导致问题结束的问题,然后等待社区再次评估。如果您对它进行了足够的改进,它将被重新打开。如果您的问题是转换为1bpp,那么您应该真正添加实际的函数。您发布了
ImageResize
one,但没有发布
converto1bppimage
one。
public static Bitmap ImageResize(Image image, int width, int height)
{
    var destRect = new Rectangle(0, 0, width, height);
    var destImage = new Bitmap(width, height);

    destImage.SetResolution(image.HorizontalResolution, image.VerticalResolution);

    using (var graphics = Graphics.FromImage(destImage))
    {
        graphics.CompositingMode = CompositingMode.SourceCopy;
        graphics.CompositingQuality = CompositingQuality.HighQuality;
        graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
        graphics.SmoothingMode = SmoothingMode.HighQuality;
        graphics.PixelOffsetMode = PixelOffsetMode.HighQuality;

        using (var wrapMode = new ImageAttributes())
        {
            wrapMode.SetWrapMode(WrapMode.TileFlipXY);
            graphics.DrawImage(image, destRect, 0, 0, image.Width, image.Height, GraphicsUnit.Pixel, wrapMode);
        }
    }
    return destImage;
}