Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Графика и игры
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 01.04.2012, 20:59
player891 player891 вне форума
Прохожий
 
Регистрация: 15.03.2012
Сообщения: 23
Репутация: 10
По умолчанию постеризация

Как можно сделать постеризацию изображения?нашел вот такой компоненет TOrImage,есть какие нибудь альтернативные пути?
Ответить с цитированием
  #2  
Старый 01.04.2012, 21:49
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Этот компонент идёт с исходным кодом, "выдерни" нужную часть.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #3  
Старый 02.04.2012, 01:11
player891 player891 вне форума
Прохожий
 
Регистрация: 15.03.2012
Сообщения: 23
Репутация: 10
По умолчанию

там слишком сложный для меня код,не могу понять где постеризация
Ответить с цитированием
  #4  
Старый 02.04.2012, 01:18
player891 player891 вне форума
Прохожий
 
Регистрация: 15.03.2012
Сообщения: 23
Репутация: 10
По умолчанию

ImageEn,G32/Graphics32/ImageVampire посоветовали также,что скажете про них?есть ли их исходные коды?может быть они попроще?
Ответить с цитированием
  #5  
Старый 02.04.2012, 01:20
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Вот кусок из исходников:
Код:
 if (FPictureOriginal.Graphic <> nil) and (FPicture.Graphic <> nil) then
   if (FPictureOriginal.Graphic is TBitmap) and (FPicture.Graphic is TBitmap) then
 begin
...
    // for each row of pixels
    for I := 0 to BmpOriginal.Height - 1 do
    begin
      OrigRow := BmpOriginal.ScanLine[i];
      DestRow := FPicture.Bitmap.ScanLine[i];
      if FNoise <> nil then
        NoiseRow := FNoise.ScanLine[i]
      else
        NoiseRow := OrigRow;

      // for each pixel in row
      for j := 0 to BmpOriginal.Width - 1 do
      begin
        RO:=OrigRow[j].rgbtRed;
        GO:=OrigRow[j].rgbtGreen;
        BO:=OrigRow[j].rgbtBlue;

        //Calculate Posterize or Solorize
        if FPosterize<>0 then
        begin
          RO:=round(RO/FPosterize)*FPosterize;
          GO:=round(GO/FPosterize)*FPosterize;
          BO:=round(BO/FPosterize)*FPosterize;
        end
...
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #6  
Старый 02.04.2012, 02:52
player891 player891 вне форума
Прохожий
 
Регистрация: 15.03.2012
Сообщения: 23
Репутация: 10
По умолчанию

подскажите в чем дело,вот рабочий код
Код:
procedure TForm1.Button8Click(Sender: TObject);
var i,j:integer;
begin
if (OpenPictureDialog1.Execute) and FileExists(OpenPictureDialog1.FileName) then
begin
bp:=TBitmap.Create;
if copy(form1.OpenPictureDialog1.FileName,length(form1.OpenPictureDialog1.FileName)-2,3)='bmp' then
bp.LoadFromFile(form1.OpenPictureDialog1.FileName)
else
begin
bpj:=TJPEGImage.Create;
bpj.LoadFromFile(form1.OpenPictureDialog1.FileName);
bp.Assign(bpj);
bpj.Free;
end;
end;
SetLength(pic,bp.Width,bp.Height);
for i:=0 to bp.Width-1 do
for j:=0 to bp.Height-1 do
pic[i,j]:=bp.Canvas.Pixels[i,j];

for i:=0 to bp.Width-1 do
for j:=0 to bp.Height-1 do begin
r:=getrvalue(pic[i,j]); g:=getgvalue(pic[i,j]); b:=getbvalue(pic[i,j]);
r:=round(r/(255/5))*round(255/5);
g:=round(g/(255/5))*round(255/5);
b:=round(b/(255/5))*round(255/5);
pic[i,j]:=(b*65536)+(g*256)+r
end;

for j:=0 to bp.Height-1 do
for i:=0 to bp.Width-1 do
bp.Canvas.Pixels[i,j]:=pic[i,j];
bp.SaveToFile(home+'itog.bmp');
bp.Free;


если ставлю в функцию значение 4 (самое нужное мне) не работает

если ставлю любое другое 3 5 6 7 8 9 10 всё работает)
Код:
r:=round(r/(255/4))*round(255/4);
g:=round(g/(255/4))*round(255/4);
b:=round(b/(255/4))*round(255/4);
Ответить с цитированием
  #7  
Старый 02.04.2012, 03:07
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Особо разбираться лень, но в этом коде нужно добавить проверку:
Код:
  R := Round(R / (255 / 4)) * Round(255 / 4);
  G := Round(G / (255 / 4)) * Round(255 / 4);
  B := Round(B / (255 / 4)) * Round(255 / 4);

  if R < 0 then R := 0;
  if G < 0 then G := 0;
  if B < 0 then b := 0;
  if R > 255 then R := 255;
  if G > 255 then G := 255;
  if B > 255 then B := 255;
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 10:29.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter