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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 02.03.2008, 20:29   #1
NeiL
Пользователь
 
Регистрация: 28.11.2007
Сообщений: 49
По умолчанию Помогите найти ошибку

Господа программисты, помогите найти ошибку (graphics32).
Процедура особым способом проверяет пикселы bitmapa и в случае если цвет пикселя bitmapa совпадает с выбранным цветом (FColor) тогода закрашиваем его (пиксел) в красный цвет ( цвет с которым будем сравнивать храниться в переменной FColor (кстати цвет грузится в переменную из этого же bitmapa)).
Исходя из этого получается что хотябы один пиксел в любом случае будет совпадать. Но почемуто этого не происходит. Помогите решить проблему.
Код:
 procedure RecursiveFill(AX, AY: Integer);
      procedure NeedFillPixel(X, Y: Integer);
      var
        B: Integer;
        P: PPoint;
        C: TColor32;
      begin
        B := Y * BitsWidth + X;
        if (X >= 0) and (X < BitsWidth) and
           (Y >= 0) and (Y < BitsHeight)
          and (BitMask[B] = #00) then
          begin
            BitMask[B] := #01;  // Где-то здесь как мне кажется возникает ошибка
//**********************************************************************
            C := NewBitmap.Pixel[X, Y];
            if RGB(TColor32Entry(FColor).R, TColor32Entry(FColor).G, TColor32Entry(FColor).B)
                 = RGB(TColor32Entry(C).R
                     ,TColor32Entry(C).G, TColor32Entry(C).B) then
//**********************************************************************
            begin
               NewBitmap.Pixel[X, Y] := clRed32;
              GetMem(P, SizeOf(TPoint));
              P^.X := X;
              P^.Y := Y;
              Stack.Push(P);
            end;
          end;
      end;
    var
      P: PPoint;
    begin
      NeedFillPixel(AX, AY);
      with Stack do
        while Count > 0 do
        begin
          P := PPoint(Pop(True));
          try
            with P^ do
            begin
              NeedFillPixel(X + 1, Y);
              NeedFillPixel(X, Y + 1);
              NeedFillPixel(X - 1, Y);
              NeedFillPixel(X, Y - 1);
            end;
          finally
            FreeMem(P, SizeOf(TPoint));
          end;
        end;
    end;
NeiL вне форума Ответить с цитированием
Старый 02.03.2008, 21:33   #2
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

Если это заливка ограниченной области, то возможно тот пиксель не попадает в область заливки.
Если это заливка тотальная то есть всего битмапа, вернее не заливка а замена цвета, то тут все элементарно - перебрать матрицу битмапа проверяя цвет.
Перебор матрицы:
for i:=0 to Width do
for j:=0 to Height do {Проверка цвета [i,j], если нужно - закраска} ;
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог
mutabor вне форума Ответить с цитированием
Старый 02.03.2008, 21:54   #3
NeiL
Пользователь
 
Регистрация: 28.11.2007
Сообщений: 49
По умолчанию

Цитата:
Сообщение от mutabor Посмотреть сообщение
Если это заливка ограниченной области, то возможно тот пиксель не попадает в область заливки.
Видимо верно. В Bitmap грузится фотография. Как с учетом этого можно решить эту проблему...
NeiL вне форума Ответить с цитированием
Старый 02.03.2008, 22:29   #4
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

Цитата:
Сообщение от NeiL Посмотреть сообщение
Видимо верно. В Bitmap грузится фотография. Как с учетом этого можно решить эту проблему...
Прблему я так и не понял. Что это за заливка? Какие пиксели из всех проходят проверку?
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог
mutabor вне форума Ответить с цитированием
Старый 02.03.2008, 22:38   #5
NeiL
Пользователь
 
Регистрация: 28.11.2007
Сообщений: 49
По умолчанию

Вообщем имеется фотография предстяавляющая собой белы фон в центре которого изображен квадрат с оттенками зеленого цвета.
Если цвет с которым мы сравнивает мы берем из области квадрата, процедура не проходит ни разу, а если мы берем цвет из фона то находятся и закрашиваются найденные пиксели почему-то раз от раза.
NeiL вне форума Ответить с цитированием
Старый 03.03.2008, 07:08   #6
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Если у вас фотография, то вероятность того, что цвет одного из пикселей точь в точь совпадет с другим, не велика. В этом случае лучше закрашивать пикселы близкие по цвету. Что-то типа этого:
Код:
var
  FRGB, PixelRGB: TRGBQuad;
  Pixel: TColor; // Цвет пиксела, который проверяем
begin
...
  FRGB := TRGBQuad (ColorToRGB (FColor));
  PixelRGB := TRGBQuad (ColorToRGB (Pixel));
  if (PixelRGB.rgbBlue - 5 < FRGB.rgbBlue) and (PixelRGB.rgbBlue + 5 > FRGB.rgbBlue) and
     (PixelRGB.rgbGreen - 5 < FRGB.rgbGreen) and (PixelRGB.rgbGreen + 5 > FRGB.rgbGreen) and
     (PixelRGB.rgbRed   - 5 < FRGB.rgbRed  ) and (PixelRGB.rgbRed   + 5 > FRGB.rgbRed  ) and
     (PixelRGB.rgbBlue + PixelRGB.rgbGreen + PixelRGB.rgbRed - FRGB.rgbBlue - FRGB.rgbGreen - FRGB.rgbRed <= 25) then begin
    Pixel := clRed;
  end;
...
end;
Sibedir вне форума Ответить с цитированием
Старый 03.03.2008, 22:35   #7
NeiL
Пользователь
 
Регистрация: 28.11.2007
Сообщений: 49
По умолчанию

Все нашел... Ошибку... Код был верный ... Это я как обычно что-то накосячил в другом месте ...
Тема закрыта
NeiL вне форума Ответить с цитированием
Старый 04.03.2008, 07:14   #8
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

2 NeiL
Уважаемый, NeiL. У нас принято, в случае нахождения ошибки, пояснять ее. Если вам не сложно, плиз. Можно без кода, если он не несет особой смысловой нагрузки.
Sibedir вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
помогите найти ошибку Максим_Леонидович БД в Delphi 4 20.08.2008 23:23
Помогите найти ошибку ( с++ ) JOFRIF Помощь студентам 10 23.05.2008 14:34
Помогите найти ошибку KnDmPetr Паскаль, Turbo Pascal, PascalABC.NET 1 11.04.2008 15:48
Помогите найти ошибку Рената Паскаль, Turbo Pascal, PascalABC.NET 2 05.01.2008 04:29
help!!! Помогите найти ошибку!!! linker13 Общие вопросы Delphi 2 07.07.2007 23:15