2015-03-13 2 views
-3

После сохранения растровых изображений на диске происходит потеря деталей. Одно и то же изображение может иметь разные размеры. Если изображение имеет достаточно измерения, мы имеем хорошую картину: http://prntscr.com/6g5ku0 остального изображения теряет деталь http://prntscr.com/6g5i09 Есть ли алгоритмы качества сохранения растрового изображения без потери деталей? Я использую C#.Как предотвратить потерю строк после сохранения/масштабирования растрового изображения?

+2

Вы не можете сохранить изображение с более низким разрешением, но сохранить все детали, это совершенно невозможно. Когда вы меняете разрешение (и этим в этом контексте я подразумеваю количество пикселей и высоту), вам нужно сделать какую-то передискретизацию, либо выбирая пиксели из исходного изображения, либо вычисляя новые. В любом случае невозможно охватить все пиксели, что означает, что детали будут потеряны. –

+0

Это не спасительная часть, которая заставляет ее потерять детали. Это масштабирование при уменьшении размеров. – Luaan

+0

ОК, но может быть, я могу сделать новое изображение с необходимым разрешением на основе оригинала? – MaksimNikicin

ответ

0

В целом это невозможно.

Однако для некоторых особых случаев существуют способы обхода основного правила.

Если ваши изображения типичны, то вы можете попробовать это:

Создать Облицовочное изображение, которое состоит из исходного изображения рисуется четыре раза с 1 пикселем смещения вправо и/или вниз. Убедитесь, что вы используете опцию SourceOverlay метода DrawImage.

Теперь вы можете сделать половину размеров без потери линий.

Конечно, основное правило по-прежнему применяется, и обходной путь может работать только в том случае, если вы можете жить с потерей, которая происходит во время наложения: здесь все маленькие (1 пиксель) белые пробелы заполняются черным. Никакие черные линии не теряются, но многие белые пробелы.

Если это приемлемо, хорошо, если нет, то основные правила стоит: Вы не можете уменьшить размер одного пиксела в Bitmap ..

Вот пример: Сначала оригинал, то наложение и, наконец, уменьшенное изображение:

enter image description here

код прост. Единственное, что нужно отметить, это то, что для выполнения наложений фон изображения должен быть прозрачным. Я взял ярлык, установив цвет, найденный в пикселе (0,0), прозрачным во всем изображении. Это будет работать только тогда, когда а), что пиксель на самом деле цвета фона и б) фон только один цвета ..

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

+0

Убедитесь, что вы удаляете растровые изображения, когда закончите с ними! – TaW

0

Если вы хотите сохранить растровое изображение при более низком разрешении, оно всегда будет потеряно. Вам нужно сохранить его в исходном размере.

+1

Это комментарий, а не ответ! – TaW

+2

В этом контексте я не согласен. Ответ на этот вопрос: «Вы не можете этого сделать». –

+0

Как это не ответ? – Vajura

Смежные вопросы