Комментарии 54
unsafe не пробовали?
+1
Вы придумали новый логотип для Оперы… :P
+10
Интересное у Вас решение. Зимой писал графредактор на C#, в редакторе были реализованы различные фильтры. Черно-белое изображение получал при помощи unsafe. Попробую и Ваш способ ради интереса :)
0
Мне тоже кажется, что unsafe будет ничуть не медленнее, хотя нужно проверить. Плюс к этому в шарпе можно использовать Parallel Extensions.
Я как раз сейчас борюсь с долгой инициализацией больших картинок в WPF. При динамическом обновлении Image-контрола картинкой размером 3000×3000 задержка в трэде рисование почти полсекунды. Что, при обновление раз в секунду, делает интерфейс не юзабельным. Никто не сталкивался с таким?
Я как раз сейчас борюсь с долгой инициализацией больших картинок в WPF. При динамическом обновлении Image-контрола картинкой размером 3000×3000 задержка в трэде рисование почти полсекунды. Что, при обновление раз в секунду, делает интерфейс не юзабельным. Никто не сталкивался с таким?
0
Этот контрол для быстрых обновлений не годится, как впрочем и аналогичный контрол WinForms. С размером 3000х3000 без аппаратной поддержки вообще трудно, а в WPF она видимо не подвязана (хотя и обещали нам).
0
Кто ж такие картинки сразу в контрол пихает, надо сначала ресайзить, потом рисовать уже нужного размера.
Или пилить на куски, грузить в текстуры и показывать через DX/OpenGL.
Или пилить на куски, грузить в текстуры и показывать через DX/OpenGL.
0
Вот вариант с unsafe. У меня на Pentium D 3Ггц c картинкой 3000×3000 занимает около 340 миллисекунд.
- Bitmap MakeBW(Bitmap source)
- {
- //использование промежуточных переменных ускоряет
- //код в несколько раз
- var width = source.Width;
- var height = source.Height;
-
- var sourceData = source.LockBits(new Rectangle(new System.Drawing.Point(0, 0), source.Size),
- ImageLockMode.ReadOnly,
- source.PixelFormat);
-
- result = new Bitmap(width, height, source.PixelFormat);
- var resultData = result.LockBits(new Rectangle(new System.Drawing.Point(0, 0), result.Size),
- ImageLockMode.ReadWrite,
- source.PixelFormat);
-
-
- var sourceStride = sourceData.Stride;
- var resultStride = resultData.Stride;
-
- var sourceScan0 = sourceData.Scan0;
- var resultScan0 = resultData.Scan0;
-
- var resultPixelSize = resultStride / width;
-
- unsafe
- {
- for(var y = 0 ; y < height ; y++)
- {
- var sourceRow = (byte*)sourceScan0 + (y * sourceStride);
- var resultRow = (byte*)resultScan0 + (y * resultStride);
- for(var x = 0 ; x < width ; x++)
- {
- var v =(byte)(0.3*sourceRow[x*resultPixelSize + 2] + 0.59*sourceRow[x*resultPixelSize + 1] +
- 0.11*sourceRow[x*resultPixelSize]);
- resultRow[ x * resultPixelSize ] = v;
- resultRow[ x * resultPixelSize + 1 ] = v;
- resultRow[ x * resultPixelSize + 2 ] = v;
- }
- }
-
-
- }
-
- source.UnlockBits(sourceData);
- result.UnlockBits(resultData);
- return result;
- }
* This source code was highlighted with Source Code Highlighter.
+4
Не заметил сперва ваш размер картинки. С размер 360×480 — 8мс.
0
Молодцом. Автор не в теме (того, что все знают, что Bitmap довольно медленная обертка для работы с картинкой попиксельно)
-6
Вместо работы с unsafe можно использовать System.Runtime.InteropServices.Marshal.Copy и получать данные в managed массиве. Скорость работы такая же, а небезопасный код не используется.
0
НЛО прилетело и опубликовало эту надпись здесь
Возможно, но так не намного понятнее:
Надо просто комментариев больше писать. :)
BitmapData resultData = result.LockBits(new System.Drawing.Rectangle(new System.Drawing.Point(0, 0), result.Size),
ImageLockMode.ReadWrite,
System.Drawing.Imaging.PixelFormat.Format32bppArgb);
* This source code was highlighted with Source Code Highlighter.
Надо просто комментариев больше писать. :)
+1
Еще неплохо было бы выполнять все действия в unchecked { }. Это тоже может дать небольшой прирост производительности.
0
Афтар — ты дизайнер и не более. Рисуй картинки и не лезь в программирование. Хочешь опустить .NET — пиши статьи на rsdn.ru, там тебе плюсики ни за хрен собачий никто ставить не станет.
-14
А можно цветную 1600 на 1200?
0
А через ColorMatrix не пробовали?
+1
Диаграмма в статье — отличный пример того, как не надо делать графики и диаграммы :)
+4
Примерно вот так.
+1
А можно цветную 1600 на 1200?
0
я так понимаю это результат преобразования через ColorMatrix, да?
тогда вопрос — что со временем исполнения получилось?
писать код для проверки лениво, раз уж у вас есть код то и замерить вам легче ;)
тогда вопрос — что со временем исполнения получилось?
писать код для проверки лениво, раз уж у вас есть код то и замерить вам легче ;)
0
И я не менее ленив. :) Тем более, что в моем случае производительность большой роли не играет.
Проще, мне кажется, автору данной статьи добавить еще итераций с использованием ColorMatrix (и других других улучшений из комментариев), т.к. у него уже был код для тестирования.
Проще, мне кажется, автору данной статьи добавить еще итераций с использованием ColorMatrix (и других других улучшений из комментариев), т.к. у него уже был код для тестирования.
0
Сепия:
+2
А вы не пробовали достать палитру из картинки, ее преобразовать в черно-белую и вставить обратно?
0
Это кстате тоже хорошая идея! Надо будет попробовать!
0
Вот-вот! Я все читаю камменты и думаю, когда уже кто-нибудь нормальный способ предложит
0
Судя по количеству цветов, картинка имеет 24 или 32 бита на пиксель, следовательно палитры нет.
+2
Для картинки с палитрой этот код работать не будет, там данные битмапа не в RGB хранятся, а в индексах цветов.
0
И еще, зачем умножать, сделайте 3 массива по 256 цветов для каждого канала, где ключ — исходный цвет, а значение — цвет уже умноженный на константу. Дальше функция преобразования будет напоминать что то типа
gray_value = red[old.Red] + green[old.Green] + blue[old.Blue];
Лишних 3*256 байт памяти.
gray_value = red[old.Red] + green[old.Green] + blue[old.Blue];
Лишних 3*256 байт памяти.
+3
Вопрос от дизайнера:
как делают такие фракталы вокруг буквы О?
как делают такие фракталы вокруг буквы О?
0
DirectX HLSL в помощь.
В WPF шейдеры на рас подключаются к эл-там (Effect).
Всю работу делает GPU.
В WPF шейдеры на рас подключаются к эл-там (Effect).
Всю работу делает GPU.
0
Оффтоп: а что было использовано для дотнета на маке? Можно ссылочку на рантайм/IDE, посмотреть хочется.
0
MonoDevelop, например.
0
Прогуглил… Вобщем на макос нечем разрабатывать — тот же MonoDevelop даже до alpha-релизов не дошел.
0
ну почему? вполне дошел. Даже Helloworld можно написать. А вот дальше конечно уже *опа
0
o_0 взято с monodevelop.com
если я не ошибаюсь, то моноДевелоп это форк шарпДевелопа, т.е. более-менее сносной IDE под .NET (если не сравнивать с VS :D ), неужели с ним действительно все так плачевно?!
MonoDevelop 2.0 has been released. See the official announcement here.
March 30, 2009
если я не ошибаюсь, то моноДевелоп это форк шарпДевелопа, т.е. более-менее сносной IDE под .NET (если не сравнивать с VS :D ), неужели с ним действительно все так плачевно?!
0
красивая картинка =)
0
Для начала стоило бы попробывать
byte rgb = (byte)(( (uint32)c.R * 5033165 + (uint32)c.G * 9898557 + (uint32)c.B * 1845494 ) >> 24)
byte rgb = (byte)(( (uint32)c.R * 5033165 + (uint32)c.G * 9898557 + (uint32)c.B * 1845494 ) >> 24)
0
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Манипулируем System.Drawing.Bitmap