Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
12 / 12 / 3
Регистрация: 08.01.2016
Сообщений: 79
1

Уменьшение разрешения изображения усреднением без попиксельной обработки в цикле

08.05.2017, 14:18. Показов 2076. Ответов 11

Author24 — интернет-сервис помощи студентам
Существуют ли в VB.NET встроенные функции уменьшения размера изображения в пикселях через усреднение нескольких пикселей в меньшее число, а не с помощью выбрасывания лишних, как это происходит в следующем коде (порекомендованном в другой теме)
VB.NET
1
2
3
Dim myImg1 As System.Drawing.Bitmap = CType(System.Drawing.Image.FromFile("orig.bmp"), System.Drawing.Bitmap) 'загрузка изображения из оригинального файла
Dim myImg2 As New System.Drawing.Bitmap(myImg1, myImg1.Width / 2, myImg1.Height / 2) 'перерисовка  с половинным размером
myImg2.Save("sm.bmp", System.Drawing.Imaging.ImageFormat.Bmp) 'Сохранение уменьшенного
Пример работы которого показан на приложенных картинках, в которых вместо серых линий слева и других цветов справа, просто поисчезали линии, то есть пропала информация.
В частности интересует уменьшение в 2 раза, то есть, чтобы каждый квадрат из 4-ёх пикселей усреднялся до одного.
Изображения
  
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.05.2017, 14:18
Ответы с готовыми решениями:

Уменьшить массу изображения без изменяя разрешения
Подскажите как средствами PHP уменьшить массу изображения. Не изменяя его разрешения.

Уменьшение разрешения, разных изображений
Есть такая проблема, если загрузить изображение, у которого сторона x короче стороны y, то всё...

Редактор изображений - уменьшение разрешения, обрезка
Доброго времени суток. Есть задание написать редактор изображений с минимум функций(win32). Функции...

Уменьшение параметров разрешения окна BIOS и установки Windows
Всем привет! Первый раз столкнулся с проблемой следующего характера: Во время установки ОС...

11
Модератор
Эксперт .NET
4206 / 3289 / 498
Регистрация: 27.01.2014
Сообщений: 6,041
08.05.2017, 15:53 2
нужно рисовать в Graphics без сглаживания. должно помочь
0
12 / 12 / 3
Регистрация: 08.01.2016
Сообщений: 79
08.05.2017, 17:21  [ТС] 3
Цитата Сообщение от Yury Komar Посмотреть сообщение
нужно рисовать
В теме ни слова про рисование, только обработка имеющихся изображений.
0
Модератор
Эксперт .NET
4206 / 3289 / 498
Регистрация: 27.01.2014
Сообщений: 6,041
08.05.2017, 17:29 4
ElectricDrive, в теме ни слова, согласен... Но объект Graphics подразумевает рисование. тоесть нанести на свой "холст" вашу картинку с меньшим размером, при этом все преобразования производить без сглаживания пикселей... отсюда и термин "Рисовать"...

Я не знаю другого способа... Подожлем, может кто-то подскажет, как решить впшу задачу другим путем?
0
Модератор
Эксперт .NET
4206 / 3289 / 498
Регистрация: 27.01.2014
Сообщений: 6,041
08.05.2017, 18:08 5
вот о чем я:
VB.NET
1
2
3
4
5
6
7
8
9
10
        Dim myImg1 As Bitmap = Image.FromFile("orig.png") 'загрузка изображения из оригинального файла
        Dim myImg2 As New Bitmap(myImg1.Width \ 2, myImg1.Height \ 2) 'перерисовка  с половинным размером
 
        Using g = Graphics.FromImage(myImg2)
            g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.None
            g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.NearestNeighbor
            g.DrawImage(myImg1, 0, 0, myImg2.Width, myImg2.Height)
        End Using
 
        myImg2.Save("custom.bmp")
результат получается тот же, что и у вас...
Взглянул на картинку вашу и по-моему, как бы вы не старались - у вас не получится идентичная картинка, но в половину меньшим размером... Невозможно сжать пиксель меньше чем он есть... а у вас все линии имеют ширину в 1 пиксель

применяя разные интерполяции при уменьшении размера - я не добился того, чтоб картинка была идентична... Даже пробуя в разных редакторах - этого невозможно сделать с ВАШЕЙ картинкой...

Возможно и ошибаюсь... Подождем других ответов.
Миниатюры
Уменьшение разрешения изображения усреднением без попиксельной обработки в цикле  
1
12 / 12 / 3
Регистрация: 08.01.2016
Сообщений: 79
08.05.2017, 19:33  [ТС] 6
Цитата Сообщение от Yury Komar Посмотреть сообщение
Взглянул на картинку вашу и по-моему, как бы вы не старались - у вас не получится идентичная картинка, но в половину меньшим размером... Невозможно сжать пиксель меньше чем он есть... а у вас все линии имеют ширину в 1 пиксель
Идентичная, конечно, не получится. Специально нарисованы линии в 1 пиксель для проверки программы. Должна получится как в приложенном файле. Такую можно получить в окне офис пикчур мэнэджера, но если в нём же сохранить, то опять получается как в первом сообщении: с удалёнными через один, а не усреднёнными, пикселями.
Изображения
 
0
12 / 12 / 3
Регистрация: 08.01.2016
Сообщений: 79
08.05.2017, 19:53  [ТС] 7
Сделал код с попиксельной обработкой в цикле:
VB.NET
1
2
3
4
5
6
7
8
9
10
11
        For i = 0 To myImg1.Width / 2 - 1
            For j = 0 To myImg1.Height / 2 - 1
                r = 0
                g = 0
                b = 0
                r = r + myImg1.GetPixel(i * 2, j * 2).R + myImg1.GetPixel(i * 2, j * 2 + 1).R + myImg1.GetPixel(i * 2 + 1, j * 2).R + myImg1.GetPixel(i * 2 + 1, j * 2 + 1).R
                g = g + myImg1.GetPixel(i * 2, j * 2).G + myImg1.GetPixel(i * 2, j * 2 + 1).G + myImg1.GetPixel(i * 2 + 1, j * 2).G + myImg1.GetPixel(i * 2 + 1, j * 2 + 1).G
                b = b + myImg1.GetPixel(i * 2, j * 2).B + myImg1.GetPixel(i * 2, j * 2 + 1).B + myImg1.GetPixel(i * 2 + 1, j * 2).B + myImg1.GetPixel(i * 2 + 1, j * 2 + 1).B
                myImg2.SetPixel(i, j, Color.FromArgb(r / 4, g / 4, b / 4))
            Next
        Next
Но про встроенные методы спрашиваю, так как предполагаю, что они быстрее.
0
Модератор
Эксперт .NET
4206 / 3289 / 498
Регистрация: 27.01.2014
Сообщений: 6,041
08.05.2017, 20:08 8
ну может быть тут более похож будет:
VB.NET
1
g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic
0
4407 / 3531 / 843
Регистрация: 02.02.2013
Сообщений: 3,417
Записей в блоге: 2
08.05.2017, 20:29 9
VB.NET
1
код с попиксельной обработкой
И что в результате? Полагаю, что получите такое же сглаженное изображение.
Для увеличения скорости обработки нужно отказаться от GetPixel/SetPixel, а использовать
LockBits/UnlockBits.
0
12 / 12 / 3
Регистрация: 08.01.2016
Сообщений: 79
08.05.2017, 20:34  [ТС] 10
Цитата Сообщение от ovva Посмотреть сообщение
И что в результате?
То — что хотел (показано в приложенном файле предыдущего сообщения), но то, что не дают встроенные функции.
Цитата Сообщение от ovva Посмотреть сообщение
Для увеличения скорости обработки нужно отказаться от GetPixel/SetPixel, а использовать
LockBits/UnlockBits.
Попробую.
0
4407 / 3531 / 843
Регистрация: 02.02.2013
Сообщений: 3,417
Записей в блоге: 2
08.05.2017, 20:41 11
Цитата Сообщение от ElectricDrive Посмотреть сообщение
То — что хотел
На мой взгляд, это далеко от оригинала.
1
12 / 12 / 3
Регистрация: 08.01.2016
Сообщений: 79
21.06.2017, 19:08  [ТС] 12
Цитата Сообщение от Yury Komar Посмотреть сообщение
применяя разные интерполяции при уменьшении размера - я не добился того, чтоб картинка была идентична... Даже пробуя в разных редакторах - этого невозможно сделать с ВАШЕЙ картинкой...
Нашёл редактор, который смог желаемое (уменьшение размера изображения в пикселях через усреднение нескольких пикселей в меньшее число) сделать, — XnView при использовании в нём настройки "Билинейная интерполяция".
(Может кому-то пригодится. В VB.Net ещё буду проверять)
1
21.06.2017, 19:08
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.06.2017, 19:08
Помогаю со студенческими работами здесь

Увеличение и уменьшение двух переменных в цикле
Выводить на экран значение двух переменные i=3 и j=50, на каждом шаге итерации одну переменную...

уменьшение изображения
Здравствуйте!У меня задание такое: уменьшить в 2 раза исходное изображение.Нашла пример,как это...

Уменьшение изображения
Приветствую! Ребята, киньте пожалуйста рабочий код уменьшения изображения с сохранением...

Увеличение и уменьшение изображения
Есть такой код. Как сделать что бы выполнялось тоже самое, только с этими двумя функциями. Что бы...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru