Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > в какой последовательности надо делать?!


Автор: hoshin 10.5.2010, 02:30
Здравствуйте! Может, кто подскажет как решить эту задачу: 

есть bmp фотография 800х600, все пиксели белые, кроме одной, которая имеет черный цвет, который может находиться где угодно. 

Теперь сам вопрос, что мне необходимо сделать(как правильно подключить tbitmap или еще что ни будь), чтобы осуществить поиск этого черного пикселя, Т.Е. как мне осуществить попиксельный анализ этой фотографии. Я просто не могу понять что и в какой последовательности нужно мне делать. 

Прочитал много статей, FAQ, но там в основном конвертирование с одного формата в другой. Скорость выполнения программы меня не интересует, хотя бы написать саму прогу, уже конечно с Вашей помощью.

P.S. не судите строго, этой мой первый язык.

Автор: ~FoX~ 10.5.2010, 07:43
Код

procedure TForm1.Button1Click(Sender: TObject);
var
  MyBmp: TBitmap;
  x, y: integer;
begin
  MyBmp := TBitmap.Create; //создали 
  MyBmp.LoadFromFile('C:\Program Files\Common Files\Borland Shared\Images\Splash\256color\factory.bmp'); //Путь к твоему фалу 
  for x := 0 to MyBmp.Width do
    for y := 0 to MyBmp.Height do begin
      if MyBmp.Canvas.Pixels[x, y] = clBlack then //если пиксель черный
      ShowMEssage('x=' + IntToStr(x) + ' y=' + IntToStr(y)); //тогда показываем его координаты
    end;

  MyBmp.Free; //почистили
end;

Автор: AntonN 10.5.2010, 11:19
Scanline быстрее

Код

procedure FindPixel(filename:string; color:Tcolor);
const
   MaxPixelCountA = MaxInt div SizeOf(TRGBQuad);
type
   PRGBAArray = ^TRGBAArray;
   TRGBAArray = array[0..MaxPixelCountA-1] of TRGBQuad;
var bt:Tbitmap; x,y:integer;  Row:PRGBAArray; r,b,g:byte; br:boolean;
begin
  bt:=Tbitmap.Create;
  try
     bt.LoadFromFile(filename);
     bt.PixelFormat:=pf32bit;

     r:=GetRValue(color);
     g:=GetGValue(color);
     b:=GetBValue(color);
     br:=false;
     for y:=0 to bt.Height-1 do begin
       Row:=bt.ScanLine[y];
       for x:=0 to bt.Width-1 do begin
         if( (Row[x].rgbBlue=b)and(Row[x].rgbGreen=g)and(Row[x].rgbRed=r) ) then begin

            ShowMessage('X:'+inttostr(x)+'; Y:'+inttostr(Y));

            br:=true;
            break;
         end;
       end;
       if(br) then break;
     end;

  finally
    bt.free;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  FindPixel('3c839e14f5e7.bmp',clblack);
end;

Автор: hoshin 14.5.2010, 18:08
Спасибо! на один шаг продвинулся вперёд по этой теме.

Хочу за одно еще спросить у знающих людей.

=====================================================================
ДАНО:
Все файлы имеют одно разрешение (1280х800) и формат (bmp).
в каждом файле нанесена цифра, которая находится в одном месте.

Цифра емеет цвет. Используя утилиту pixie, которая показывает координаты и цвет пикселя под курсором мыши (извиняюсь, если это будет рекламой), узнал точные данные по цвету, вот они

pixil at [328:432] - это координата первой цифры из даты
HEX 0xE4F7TT
HTML #EEF7E4
RGB (238, 247, 228)
CMYK (4,0,8,4)
HSV (89,8,97)

Фон за цифрой разный. 
Цифра не отсканирована и всегда четко видна, если быть точнее эта цифровая дата сохранения принскрина.
Шрифт цифры один и тот же.
====================================================================
Подскажите, как зная все эти данные (координаты, код цвета, которая выдала программа pixie), можно узнать есть этот цвет или нет.

Сразу отвечу на вопрос - "Зачем ему это нужно?".  У меня сохранилось очень много принскринов (более 1000), с которыми я работал. На каждом сохраненном принскрином файле стоит дата сохранения. Дата может иметь один из 13 цветов. Каждый цвет для меня означает определенный сайт. Теперь встала задача их рассортировать по дате и по цвету, и сохранить все это на dvd-r, конечно предварительно уменьшив их разрешение.
Для начала необходимо их рассортировать по цвету, т.е. по каждому сайту. Как можно узнать есть или нет в этих координтах цвет, который мне нужен, зная его код.

Автор: AntonN 14.5.2010, 18:36
Код

MyBmp.Canvas.Pixels[x, y]

цвет пикселя по координатам x;y

Автор: hoshin 14.5.2010, 21:59
спасибо! как всё просто, когда знаешь.

може Вы ещё знаете, как можно сохранить в отдельный jpeg или bmp файл фрагмент изображени по определнным координатам.

Автор: Proxin 14.5.2010, 22:10
bitblt в помощь.

Автор: AntonN 14.5.2010, 23:10
hoshin
могу показать где оно есть http://desksoft.ru/index.php?downloads=attachments&id=40

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)