2012-01-16 3 views
3

Как бы я мог имитировать this эффект полутонов в GDI +?Полутоновый эффект в с gdi +

Похоже, что Floyd–Steinberg отвратительная версия изображения накладывается на полную, но я не уверен.

enter image description here

+0

Это не полутона, размер пикселя не изменяется. Это узорчатый зазор. Алгоритмы печати печати являются скрытными. –

+0

@ HansPassant: Хммм ... Хорошо. Пальцы перешли кто-то распространит любовь. –

+0

Хм, почему бы вам просто не реализовать его? Нет ничего встроенного, что облегчит его работу. Увеличьте изображение, чтобы увидеть шаблон. –

ответ

3

Я дал эту попытку и получил этот результат: enter image description here

Это может быть место, чтобы начать. Я сделал это так:

  1. Draw исходного изображения с низкой насыщенностью (с использованием цветом матрицы)
  2. Draw исходного изображения на 1) с высокой насыщенностью с использованием шаблоном маски (то есть точки)

Я создал маску картины, как это:

 using (var g = Graphics.FromImage(bmpPattern)) 
     { 
      g.Clear(Color.Black); 
      g.SmoothingMode = SmoothingMode.HighQuality; 
      for (var y = 0; y < bmp.Height; y += 10) 
       for (var x = 0; x < bmp.Width ; x += 6) 
       { 
        g.FillEllipse(Brushes.White, x, y, 4, 4); 
        g.FillEllipse(Brushes.White, x + 3, y + 5, 4, 4); 
       } 
     } 

И тогда я ввел его на перенасыщенном растрового изображения с использованием this technique.

Обновление: Разработка способов объединения изображений. Давайте поговорим даже немного более общие и скажем, что мы хотим объединить две разные раскрашенные версии одного и того же изображения с использованием маски шаблона, в результате получим новое изображение: мы можем сделать это вот так:

Создайте три новых растровых изображения, все с тем же размером, что и исходное изображение. Вызовите их bmpA, bmpB и bmpMask.

  • Draw одну цветную версию/эффект в bmpA
  • Draw другую версию цвета/эффекта в bmpB
  • Создать маску в bmpMask (черный и белый)
  • нажать одну из R/G/B каналов bmpMask в альфа-канал bmpB, используя метод transferOneARGBChannelFromOneBitmapToAnother.
  • Рисовать bmpB над bmpA (так как bmpB теперь имеет прозрачные части)
  • Результат теперь bmpA. bmpB и bmpMask могут быть удалены.

Совершено

+0

Приветствия за это. Эффект хороший и выглядит как то, с чем я мог бы работать. Я заметил в вашем примере кода в вашем блоге метод 'code'transferOneARGBChannelFromOneBitmapToAnother используемый небезопасный код. Этот материал в основном предназначен для веб-разработки, поэтому для меня требуется доверие. У вас есть пример метода, который не использовал бы небезопасный код? –

+0

Это довольно просто изменить. Вот код, который перемещает байты битмапа в обычный байт [], а затем обратно: http://msdn.microsoft.com/en-us/library/5ey6h79d (v = vs.80) .aspx –

+0

И вот как вы меняете насыщенность: http://www.bobpowell.net/imagesaturation.htm. Яркость и контраст также могут быть достигнуты с использованием цветной матрицы. –

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