保存/缩放Bitmap后如何防止线路丢失?

时间:2015-03-13 08:34:51

标签: c# .net image

在磁盘上保存位图后,会丢失细节。相同的图像可以具有不同的尺寸。 如果图像有足够的尺寸,我们有一个很好的图片: http://prntscr.com/6g5ku0 否则图像会丢失细节 http://prntscr.com/6g5i09 是否存在质量保存位图的算法而不丢失细节? 我正在使用C#。

2 个答案:

答案 0 :(得分:0)

如果要以较低的分辨率保存位图,它将始终是有损的。您需要将其保存为原始大小。

答案 1 :(得分:0)

一般来说,这是不可能的。

但是,对于某些特殊情况,有办法解决基本规则。

如果您的图片是典型的,那么您可以试试这个:

创建一个叠加图像,该图像由原始图像绘制四次,向右和/或向下一个像素偏移。请务必使用SourceOverlay方法的DrawImage选项。

现在你可以减半尺寸而不会丢失任何线条。

当然,基本规则仍然适用,只有在你可以忍受叠加期间发生的损失时,解决方法才有效:这里所有小的(1个像素)白色空间都充满了黑色。没有黑线丢失,但有许多白色间隙。

如果可以接受,那很好,如果没有,那么基本规则就是:你不能减小位图中一个像素的大小。

这是一个例子:首先是原始的,然后是叠加,最后是缩小的图像:

enter image description here

代码很简单。唯一需要注意的是,为了进行叠加,图像的背景应该是透明的。我通过在整个图像中将像素(0,0)中找到的颜色设置为透明来获取快捷方式。这只有在a)该像素确实是背景颜色且b)背景仅为一个颜色时才有效。

private void button2_Click(object sender, EventArgs e)
{

    Bitmap bmp1 = new Bitmap("D:\\fineline.png");
    pictureBox1.Image = bmp1;

    Bitmap bmp2 = (Bitmap)bmp1.Clone();
    bmp2.MakeTransparent(bmp2.GetPixel(0, 0));
    Bitmap bmp3 = (Bitmap)bmp2.Clone();
    using (Graphics G = Graphics.FromImage(bmp3))
    {
        G.CompositingMode = CompositingMode.SourceOver;
        G.CompositingQuality = CompositingQuality.HighQuality;
        G.DrawImage(bmp2, 0, 1);
        G.DrawImage(bmp2, 1, 1);
        G.DrawImage(bmp2, 1, 0);
    }
    pictureBox2.Image = bmp3;

    Bitmap bmp4 = new Bitmap(bmp3.Width / 2, bmp3.Height / 2);
    using (Graphics G = Graphics.FromImage(bmp4))
    {
        G.Clear(bmp1.GetPixel(0, 0));
        G.DrawImage(bmp3, 0, 0, bmp4.Width, bmp4.Height);
    }
    pictureBox3.Image = bmp4;

    // do dispose of all bitmaps when no longer needed!!
    bmp2.Dispose(); // in the test the others still sit in the PictureBoxes

}