2015-03-13 71 views
-3

在磁盤上保存位圖後,會丟失詳細信息。相同的圖像可以有不同的尺寸。 如果圖像具有足夠的尺寸,我們有一個很好的畫面: http://prntscr.com/6g5ku0 否則圖像細節丟失 http://prntscr.com/6g5i09 是否有保存位圖質量無細節丟失任何算法? 我正在使用C#。如何防止在保存/縮放位圖後丟失行?

+2

無法保存的圖像分辨率較低,但把所有的細節,這是完全不可能的。當你改變分辨率(在這種情況下,我的意思是像素數的寬度和高度),你需要做一些重採樣,從原始圖像中挑選出像素或計算新的。無論哪種方式都不可能讓所有的像素,這意味着細節將會丟失。 – 2015-03-13 08:37:27

+0

這不是讓它失去細節的保存部分。這是縮小尺寸時的尺寸。 – Luaan 2015-03-13 08:37:30

+0

好的,但可能是我能在原創的基礎上用必要的分辨率製作新圖像嗎? – MaksimNikicin 2015-03-13 08:47:19

回答

0

一般來說這是不可能的。

但是,對於一些特殊情況,可以採取一些方法來解決基本規則。

如果你的圖片是典型的,那麼你可以試試這個:

創建一個由原始圖像的1個像素偏移正確的和/或拉下四次的重疊圖像。確保您使用DrawImage方法的SourceOverlay選項。

現在你可以減少一半的尺寸而不會丟失任何線條。

當然,基本規則仍然適用,如果您可以忍受疊加過程中發生的損失,解決方法纔可以工作:這裏所有小(1像素)的空白都用黑色填充。沒有黑線丟失,但很多白色的空白。

如果這是可以接受的,罰款,如果沒有,那麼基本規則表示:你可以在不降低一個位圖的一個像素的大小..

這裏有一個例子:首先是原單,那麼覆蓋層和最後的縮小圖像:

enter image description here

該代碼是直接的。唯一要注意的是,爲了覆蓋圖像的背景應該是透明的。我通過在整個圖像中將像素爲(0,0)的顏色設置爲透明來採用快捷方式。這如果)該像素確實是背景色和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 

} 
+0

這是正確的方法。非常感謝。 – MaksimNikicin 2015-03-13 10:45:18

+0

確保在處理完畢後處理位圖! – TaW 2015-03-13 14:28:02

0

如果要以較低的分辨率保存位圖,它將始終是有損的。您需要將其保存爲原始大小。

+1

這是一條評論,而不是一個答案! – TaW 2015-03-13 08:37:53

+2

在這種情況下,我不同意。這個問題的答案是「你做不到」。 – 2015-03-13 08:38:56

+0

這不是一個答案? – Vajura 2015-03-13 08:53:55