Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Мультимедиа в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.07.2009, 13:08   #1
KREGI
Форумчанин
 
Аватар для KREGI
 
Регистрация: 29.11.2008
Сообщений: 333
Восклицание Замена одного цвета в Image на другой

Как сделать замену всех цветов на черный учитывая диапазон оттенков до серого?

Код:
procedure Highlight(aSource, ATarget: TBitmap);
var
 i, j: Integer;
 s, t: pRGBTriple;
begin
 aSource.PixelFormat := pf24bit;
 ATarget.PixelFormat := pf24bit;
 ATarget.Width := aSource.Width;
 ATarget.Height := aSource.Height;
for i := 0 to aSource.Height - 1 do
 begin
  s := ASource.Scanline[i];
  t := ATarget.Scanline[i];
  for j := 0 to aSource.Width - 1 do
 begin
  if (not (t^.rgbtBlue = ColorToRGB(clBlack))) and
   not (t^.rgbtRed = ColorToRGB(clBlack)) and
   not (t^.rgbtBlue = ColorToRGB(clBlack)) then
  begin
   t^.rgbtBlue := ColorToRGB(clWhite);
   t^.rgbtGreen := ColorToRGB(clWhite);
   t^.rgbtRed := ColorToRGB(clWhite);
  end;
 inc(s);
 inc(t);
 end;
end;
end;

procedure TForm1.N2Click(Sender: TObject);
begin
if OpenPictureDialog1.Execute then
 begin
  Image1.Picture.LoadFromFile(OpenPictureDialog1.FileName);
 end;
end;

procedure TForm1.N3Click(Sender: TObject);
begin
if SavePictureDialog1.Execute then
 begin
  Image1.Picture.SaveToFile(SavePictureDialog1.FileName);
 end;
end;

procedure TForm1.N5Click(Sender: TObject); 
var b: TBitmap; 
begin
 b := TBitmap.Create;
 try
  b.Assign(Image1.Picture.Bitmap);
  Highlight(b, b);
  Image1.Picture.Bitmap := b;
  Image1.Refresh;
 finally
  b.Free;
 end;
end;

end.
Если помог - Весы слева

Последний раз редактировалось KREGI; 11.07.2009 в 18:27.
KREGI вне форума Ответить с цитированием
Старый 12.07.2009, 04:55   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

я сделал примерно так...правда без СканЛайна(переделай если надо)
Код:
procedure ReplaceColor(BitMap:TBitMap;FromColor,ToColor:TColor);//заменяем один цвет, основная процедура
var i,j:integer;
begin
 for i:=0 to BitMap.Height do
  for j:=0 to BitMap.Width do if BitMap.Canvas.Pixels[j,i]=FromColor then BitMap.Canvas.Pixels[j,i]:=ToColor;
end;

procedure ReplaceSomeColors(BitMap:TBitMap;FromColor1,FromColor2,ToColor:TColor);
type tRGBQUAD = packed record//финт ушами:)
      case integer of
      1:(rgbtBlue: Byte;
         rgbtGreen: Byte;
         rgbtRed: Byte;
         rgbReserved: Byte);
      2:(RGBColor:integer);
     end;
var i,j,k:integer;
    B:byte;
    t1,t2:TRGBQuad;
begin
 t1.RGBColor:=ColorToRGB(FromColor1);
 t2.RGBColor:=ColorToRGB(FromColor2); //далее меняем составляющие цвета(чтобы в первом цвете были меньшие(цикл идет снизу вверх)
 if t1.rgbtBlue>t2.rgbtBlue then begin B:=t1.rgbtBlue;t1.rgbtBlue:=t2.rgbtBlue;t2.rgbtBlue:=B; end;
 if t1.rgbtGreen>t2.rgbtGreen then begin B:=t1.rgbtGreen;t1.rgbtGreen:=t2.rgbtGreen;t2.rgbtGreen:=B; end;
 if t1.rgbtRed>t2.rgbtRed then begin B:=t1.rgbtRed;t1.rgbtRed:=t2.rgbtRed;t2.rgbtRed:=B; end;
 for i:=t1.rgbtBlue to t2.rgbtBlue do
  for j:=t1.rgbtGreen to t2.rgbtGreen do
   for k:=t1.rgbtRed to t2.rgbtRed do ReplaceColor(BitMap,RGB(k,j,i),ToColor);/сама замена
end;


procedure TForm1.Button1Click(Sender: TObject);//применение
var C:TColor;
begin
 if ColorDialog1.Execute then begin
                               C:=ColorDialog1.Color;
                               if ColorDialog1.Execute then ReplaceSomeColors(Image1.Picture.Bitmap,C,ColorDialog1.Color,clRed)
                                                       else ReplaceColor(Image1.Picture.Bitmap,C,clRed);
                              end;
end;
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 12.07.2009, 14:10   #3
KREGI
Форумчанин
 
Аватар для KREGI
 
Регистрация: 29.11.2008
Сообщений: 333
По умолчанию

Пепел Феникса как сделать отображение этого процесса в прогрес баре? (не пойму, зацикливается .что ли)
Если помог - Весы слева
KREGI вне форума Ответить с цитированием
Старый 12.07.2009, 14:25   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

оно долго думает
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 12.07.2009, 14:28   #5
KREGI
Форумчанин
 
Аватар для KREGI
 
Регистрация: 29.11.2008
Сообщений: 333
По умолчанию

Пепел Феникса а можно все таки как верно сделать отображение процесса?) (у меня не получается его сделать)
Если помог - Весы слева

Последний раз редактировалось KREGI; 12.07.2009 в 14:39.
KREGI вне форума Ответить с цитированием
Старый 12.07.2009, 15:40   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Код:
procedure ReplaceSomeColors(BitMap:TBitMap;FromColor1,FromColor2,ToColor:TColor);
type tRGBQUAD = packed record//финт ушами:)
      case integer of
      1:(rgbtBlue: Byte;
         rgbtGreen: Byte;
         rgbtRed: Byte;
         rgbReserved: Byte);
      2:(RGBColor:integer);
     end;
var i,j,k:integer;
    B:byte;
    t1,t2:TRGBQuad;
begin
 t1.RGBColor:=ColorToRGB(FromColor1);
 t2.RGBColor:=ColorToRGB(FromColor2); //далее меняем составляющие цвета(чтобы в первом цвете были меньшие(цикл идет снизу вверх)
 if t1.rgbtBlue>t2.rgbtBlue then begin B:=t1.rgbtBlue;t1.rgbtBlue:=t2.rgbtBlue;t2.rgbtBlue:=B; end;
 if t1.rgbtGreen>t2.rgbtGreen then begin B:=t1.rgbtGreen;t1.rgbtGreen:=t2.rgbtGreen;t2.rgbtGreen:=B; end;
 if t1.rgbtRed>t2.rgbtRed then begin B:=t1.rgbtRed;t1.rgbtRed:=t2.rgbtRed;t2.rgbtRed:=B; end;
 for i:=t1.rgbtBlue to t2.rgbtBlue do
  for j:=t1.rgbtGreen to t2.rgbtGreen do
   for k:=t1.rgbtRed to t2.rgbtRed do begin
                                        PositionBar1.Position:=PositionBar1.Position+1;
ReplaceColor(BitMap,RGB(k,j,i),ToColor);/сама замена
         end;
end;
ну поидее чтото типа такого
только нужно максимум определять(попробуй сам)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 12.07.2009, 22:47   #7
KREGI
Форумчанин
 
Аватар для KREGI
 
Регистрация: 29.11.2008
Сообщений: 333
По умолчанию

Пепел Феникса я ждал долго, походу не выполняется - зацикливается...
Если помог - Весы слева
KREGI вне форума Ответить с цитированием
Старый 13.07.2009, 01:03   #8
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

зацикливания не должно быть...а проверял на легких диапазонах...работает
сейчас попробую пересмотреть
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 13.07.2009, 14:43   #9
Lime
Форумчанин
 
Аватар для Lime
 
Регистрация: 10.02.2009
Сообщений: 815
По умолчанию

Максимум как я понимаю равен кол-ву пикселей.

Код:
procedure ReplaceColor(BitMap:TBitMap;FromColor,ToColor:TColor);//заменяем один цвет, основная процедура
var i,j,i2:integer;
begin
i2:=0;
progressbar1.max := BitMap.Height * BitMap.Width;
progressbar1.position :=0;
 for i:=0 to BitMap.Height do
  for j:=0 to BitMap.Width do 
begin
 if BitMap.Canvas.Pixels[j,i]=FromColor then BitMap.Canvas.Pixels[j,i]:=ToColor;
 i2:=i2+1;
 progressbar1:=i2;
end;
end;

Последний раз редактировалось Lime; 13.07.2009 в 14:46.
Lime вне форума Ответить с цитированием
Старый 13.07.2009, 14:45   #10
KREGI
Форумчанин
 
Аватар для KREGI
 
Регистрация: 29.11.2008
Сообщений: 333
По умолчанию

Задача такая, есть карта (сканированная, качество плохое) надо убрать все цвета оставив только черный (но за счет того что качество плохое, границы то светлей то темней, вот и думаю как и оттенки учесть)
Если помог - Весы слева
KREGI вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Замена одного слова в string строке. Samopal Паскаль, Turbo Pascal, PascalABC.NET 8 19.04.2009 08:03
Перенос проги с одного ПК на другой Azef Помощь студентам 2 13.05.2008 18:07
[Delphi] Замена одного слова на другое... ZhooZhik Помощь студентам 5 09.01.2008 23:31
Замена одного элемента строки другим kkkggg PHP 1 18.10.2007 23:09
Перенос из одного Image в другой Dimitriys Компоненты Delphi 5 14.07.2007 23:32