Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

КОЛИЧЕСТВО Цветов [D7]


Urvin ©   (2004-02-04 17:10:00) 

Каксделать уменьшения количествацветов в заданном рисунке. Как в Фотошопе ф-ция "Reduce Colors" - юзер вводит количество цветов, прога делает нужный рисунок.


Urvin   (2004-02-14 21:16:00) [1]

Да, помоему у меня что-то с мозгами. Алгоритм кривой очень, хотя правильный местами...


Fenik   (2004-02-14 21:02:00) [2]

>Urvin ©  (14.02.04 16:56) [9]
>Как-то это все недоступно...

Неправда. Всё доступно.
Если у меня будет сегодня желание, попробую сделать.


Fenik   (2004-02-14 20:58:00) [3]

И для 400 цветов медленно работает?
Не верю. Покажи как делал.


Urvin   (2004-02-14 20:52:00) [4]

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


Fenik   (2004-02-14 17:12:00) [5]

>Прога все рано приводит картинку к палитре

Так у тебя что ли 256-цветное изображение? Палитра только у него. А если больше цветов, то палитры нет. Ты случайно не про "Сохранить для Web..." говоришь?


Urvin   (2004-02-14 16:56:00) [6]

Скорее всего так... Только мне кажется, что это все долго, и я уже пробовал так сделать - геморройно и пускай, у меня три коричневых и итдин синий цвет. Значит, я дожен коричневые объединить, а синий оставить... Как-то это все недоступно...
Может есть какой-нибудь алгоритм, если у меня N цветов в палитре (порядка 400) пользователь может ввести число M (не более 200). Прога все рано приводит картинку к палитре, может, туда надо че вставить?


Fenik   (2004-02-14 15:43:00) [7]

Мое предположение. Фотошоп считывает все имеющиеся уникальные цвета в массив. Далее находит наиболее близкие по яркости (к примеру) и объединяет их в один средний, попутно заменяя пиксели, которым принадлежали те цвета. И так, пока число уникальных цветов не приблизится к требуемому.

В принципе это не сложно. Сложнее добиться оптимального алгоритма.
Желаю удачи.


Urvin   (2004-02-14 15:34:00) [8]

Ну, что-то похожее, но не то. Тут получатся слишком произвольные цвета, и если установить слишком малое число цветов, картинку уже можно не узнать. Фотошоп же и при пяти цветах позволяет разглядеть картинку.


Fenik   (2004-02-14 10:42:00) [9]

Sapersky ©  (12.02.04 11:23) [5]

Дадад. Все верно. Почти.

functionBLimit(A: Integer): Byte;
begin
ifA < 0 thenResult := 0
  else ifA > 255 thenResult := 255
  elseResult := A;
end;


Sapersky   (2004-02-12 11:23:00) [10]

Возможно, это:

function BLimit(Value : DWord): Byte;
begin
If Value>255 then Result:=255 else Result:=Value;
end;

хотя с т.з. производительности вызов ф-ии по 3 раза на пиксель, наверное, не есть хорошо. Лучше вписать непосредственно в Posterize.


Urvin   (2004-02-11 22:00:00) [11]

А что такое BLimit?


Fenik   (2004-02-05 17:23:00) [12]

Не забудь
Bitmap.PixelFormat := pf24Bit;


Fenik   (2004-02-05 17:22:00) [13]

Это вот это? -

type
 TRGB = packed record
   B, G, R: Byte;
  end;
 pRGB = ^TRGB;

procedurePosterize(Bitmap: TBitmap; Amount: Integer);
varx, y: Integer;
   Dest: pRGB;
begin
  fory := 0 toBitmap.Height - 1 do begin
   Dest := Bitmap.ScanLine[y];
    forx := 0 toBitmap.Width - 1 do begin
      withDest^ do begin
       B := BLimit(Round(B/Amount)*Amount);
       G := BLimit(Round(G/Amount)*Amount);
       R := BLimit(Round(R/Amount)*Amount);
      end;
     Inc(Dest);
    end;
  end;
end;


Urvin   (2004-02-05 15:13:00) [14]

И это мастера!?


Наверх

Титульная страница Поиск, карта сайта Написать письмо