在磁盘上保存位图后,会丢失细节。相同的图像可以具有不同的尺寸。 如果图像有足够的尺寸,我们有一个很好的图片: http://prntscr.com/6g5ku0 否则图像会丢失细节 http://prntscr.com/6g5i09 是否存在质量保存位图的算法而不丢失细节? 我正在使用C#。
答案 0 :(得分:0)
如果要以较低的分辨率保存位图,它将始终是有损的。您需要将其保存为原始大小。
答案 1 :(得分:0)
一般来说,这是不可能的。
但是,对于某些特殊情况,有办法解决基本规则。
如果您的图片是典型的,那么您可以试试这个:
创建一个叠加图像,该图像由原始图像绘制四次,向右和/或向下一个像素偏移。请务必使用SourceOverlay
方法的DrawImage
选项。
现在你可以减半尺寸而不会丢失任何线条。
当然,基本规则仍然适用,只有在你可以忍受叠加期间发生的损失时,解决方法才有效:这里所有小的(1个像素)白色空间都充满了黑色。没有黑线丢失,但有许多白色间隙。
如果可以接受,那很好,如果没有,那么基本规则就是:你不能减小位图中一个像素的大小。
这是一个例子:首先是原始的,然后是叠加,最后是缩小的图像:
代码很简单。唯一需要注意的是,为了进行叠加,图像的背景应该是透明的。我通过在整个图像中将像素(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
}