После сохранения растровых изображений на диске происходит потеря деталей. Одно и то же изображение может иметь разные размеры. Если изображение имеет достаточно измерения, мы имеем хорошую картину: http://prntscr.com/6g5ku0 остального изображения теряет деталь http://prntscr.com/6g5i09 Есть ли алгоритмы качества сохранения растрового изображения без потери деталей? Я использую C#.Как предотвратить потерю строк после сохранения/масштабирования растрового изображения?
ответ
В целом это невозможно.
Однако для некоторых особых случаев существуют способы обхода основного правила.
Если ваши изображения типичны, то вы можете попробовать это:
Создать Облицовочное изображение, которое состоит из исходного изображения рисуется четыре раза с 1 пикселем смещения вправо и/или вниз. Убедитесь, что вы используете опцию SourceOverlay
метода DrawImage
.
Теперь вы можете сделать половину размеров без потери линий.
Конечно, основное правило по-прежнему применяется, и обходной путь может работать только в том случае, если вы можете жить с потерей, которая происходит во время наложения: здесь все маленькие (1 пиксель) белые пробелы заполняются черным. Никакие черные линии не теряются, но многие белые пробелы.
Если это приемлемо, хорошо, если нет, то основные правила стоит: Вы не можете уменьшить размер одного пиксела в Bitmap ..
Вот пример: Сначала оригинал, то наложение и, наконец, уменьшенное изображение:
код прост. Единственное, что нужно отметить, это то, что для выполнения наложений фон изображения должен быть прозрачным. Я взял ярлык, установив цвет, найденный в пикселе (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
}
Это правильный путь. Большое спасибо. – MaksimNikicin
Убедитесь, что вы удаляете растровые изображения, когда закончите с ними! – TaW
Если вы хотите сохранить растровое изображение при более низком разрешении, оно всегда будет потеряно. Вам нужно сохранить его в исходном размере.
- 1. Uploadcare: Как предотвратить потерю качества изображения?
- 2. Как предотвратить потерю абстракции?
- 3. DTML: Как предотвратить потерю
- 4. Как предотвратить потерю качества изображения при использовании метода ImageIO.write()?
- 5. Как предотвратить потерю IP-трафика от телефона?
- 6. Как предотвратить потерю истории фиксации в Subversion после слияния?
- 7. Как предотвратить потерю старых объектов после создания нового?
- 8. Как предотвратить потерю данных при типизации?
- 9. Как (почти) предотвратить потерю данных FT232R (uart)?
- 10. Как предотвратить или отключить direct2d «автомасштабирование» растрового изображения?
- 11. Nodejs - Как предотвратить потерю при сбое узла?
- 12. C# PostMessage - Как предотвратить потерю данных?
- 13. Как предотвратить сглаживание шрифта растрового изображения в IE и FF
- 14. Размер растрового изображения для меньшего растрового изображения
- 15. Innodb log flush, чтобы предотвратить потерю данных
- 16. После сопоставления объекта растрового изображения, как получить следующий объект растрового изображения непрерывно с помощью нажатия кнопки?
- 17. Загрузить изображение растрового изображения после сохраненияInstanceState Error
- 18. Как увеличить качество растрового изображения?
- 19. Как изменить масштаб изображения растрового изображения?
- 20. избыточность журнала журнала mongodb (предотвратить потерю журнала)
- 21. Как вставить несколько строк в таблицу из растрового изображения
- 22. WPF Производительность растрового изображения
- 23. изменить цвет растрового изображения
- 24. как предотвратить потерю сообщений во время перезагрузки/обновления страницы
- 25. Плохое качество изображения после изменения размера/масштабирования растрового изображения
- 26. Загрузить скользящий слой после растрового изображения камеры/изображения сохранить
- 27. Размер файла изображения растрового изображения
- 28. Рисование изображения поверх растрового изображения
- 29. После изменения размера растрового изображения результат нового растрового изображения является гладким bitmnap
- 30. Как предотвратить потерю данных при закрытии дескриптора файла?
Вы не можете сохранить изображение с более низким разрешением, но сохранить все детали, это совершенно невозможно. Когда вы меняете разрешение (и этим в этом контексте я подразумеваю количество пикселей и высоту), вам нужно сделать какую-то передискретизацию, либо выбирая пиксели из исходного изображения, либо вычисляя новые. В любом случае невозможно охватить все пиксели, что означает, что детали будут потеряны. –
Это не спасительная часть, которая заставляет ее потерять детали. Это масштабирование при уменьшении размеров. – Luaan
ОК, но может быть, я могу сделать новое изображение с необходимым разрешением на основе оригинала? – MaksimNikicin