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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.05.2015, 13:07   #11
OTGB
Форумчанин
 
Аватар для OTGB
 
Регистрация: 06.05.2015
Сообщений: 120
По умолчанию

Цитата:
Сообщение от Stanislav Посмотреть сообщение
я вам дал два варианта, подобные вопросы они никогда не были простыми, вам придется много чего изучить
Буду изучать.)

Есть код, но он считает пиксели с картинки я полагаю.
Код:
procedure TForm1.Button1Click(Sender: TObject);
begin
     if OpenDialog1.Execute then
     begin
          Image1.Picture.Bitmap.LoadFromFile(OpenDialog1.FileName);
          if Image1.Picture.Bitmap<>nil then Button2.Enabled:=true else Button2.Enabled:=false;
     end;
end;

procedure TForm1.Button2Click(Sender: TObject);
var i,j,n:integer;
    p:PByteArray;
    colors : array [0..255] of integer;
begin
     if not (Image1.Picture.Bitmap.PixelFormat in [pf24Bit, pf32Bit]) then
        raise exception.create('Error, Format File not supported!');
     Memo1.Lines.Clear;
     FillChar(colors,SizeOf(colors),0);
     n := Abs(Integer(Image1.Picture.Bitmap.ScanLine[1]) - Integer(Image1.Picture.Bitmap.ScanLine[0]));


     for i:=0 to Image1.Picture.Bitmap.Height-1 do
     begin
          P:=Image1.Picture.Bitmap.ScanLine[i];
          for j:=0 to n-1 do
              inc(colors[P^[j]]);
        
     end;
     for i:=0 to 255 do
     if colors[i]>0 then
     Memo1.Lines.Add('цвет'+IntToStr(i)+', количество='+IntToStr(colors[i]));
end;

end.

Последний раз редактировалось OTGB; 06.05.2015 в 13:19.
OTGB вне форума Ответить с цитированием
Старый 06.05.2015, 13:21   #12
Stanislav
Квадрокоптерист
Участник клуба Подтвердите свой е-майл
 
Регистрация: 29.09.2007
Сообщений: 1,824
По умолчанию

Кто вам мешает загрузить вашу картинку в image1? только уно момента.

предложил бы перевести картинку в gray как это сделать думаю гугл вам поможет. - для чего это нужно чтобы не городить сравнение с диапазонами цветов, понимаете? тобишь вам нужно найти белый пиксель как? сравнить
Код:
colors[i] == 'fffffff'
но может получиться так что у вас там будет не "точно белый" и тогда варианта два указывать range диапазона цветов и сранивать уже по дипазону либо проще перевести вcю картинку в gray
Я часть той силы, что вечно хочет зла, но вечно совершает благо..

Последний раз редактировалось Stanislav; 06.05.2015 в 13:26.
Stanislav вне форума Ответить с цитированием
Старый 06.05.2015, 13:29   #13
OTGB
Форумчанин
 
Аватар для OTGB
 
Регистрация: 06.05.2015
Сообщений: 120
По умолчанию

Цитата:
Сообщение от Stanislav Посмотреть сообщение
Кто вам мешает загрузить вашу картинку в image1?
Вот я вставил картинку и как на изображении показано просто чёрный квадрат показывает.Проблема решается если opendialog поставить не bmp формат (картинка в этом формате) а jpg. но тогда показывается ошибка в этой строке.
Код HTML:
if Image1.Picture.Bitmap<>nil then Button2.Enabled:=true else Button2.Enabled:=false;
Изображения
Тип файла: jpg Безымянный.jpg (28.4 Кб, 146 просмотров)
OTGB вне форума Ответить с цитированием
Старый 06.05.2015, 13:37   #14
Stanislav
Квадрокоптерист
Участник клуба Подтвердите свой е-майл
 
Регистрация: 29.09.2007
Сообщений: 1,824
По умолчанию

Бросил дельфи давно, думаю это вам поможет - http://delphiworld.narod.ru/_graphic_.html сидеть разбираться в дельфи для меня это значит гуглить. полагаю это вы сможете сделать сами, причем вопрос этот вставал и не раз в том числе и на этом форуме. ищите

здесь идет по попиксельное сравнение: измените под себя. только для начала сделайте картинку (в фотошопе например) gray и сохраните в bmp

Код:
procedure TForm1.Button1Click(Sender: TObject);
 var
   b1, b2: TBitmap;
   c1, c2: PByte;
   x, y, i,
   different: Integer; // Counter for different pixels 
begin
   b1 := Image1.Picture.Bitmap;
   b2 := Image2.Picture.Bitmap;
   Assert(b1.PixelFormat = b2.PixelFormat); // they have to be equal 
  different := 0;
   for y := 0 to b1.Height - 1 do
   begin
     c1 := b1.Scanline[y];
     c2 := b2.Scanline[y];
     for x := 0 to b1.Width - 1 do
       for i := 0 to BytesPerPixel - 1 do // 1, to 4, dep. on pixelformat 
      begin
         Inc(different, Integer(c1^ <> c2^));
         Inc(c1);
         Inc(c2);
       end;
   end;
 end;
Я часть той силы, что вечно хочет зла, но вечно совершает благо..

Последний раз редактировалось Stanislav; 06.05.2015 в 13:40.
Stanislav вне форума Ответить с цитированием
Старый 12.05.2015, 13:24   #15
OTGB
Форумчанин
 
Аватар для OTGB
 
Регистрация: 06.05.2015
Сообщений: 120
По умолчанию

Народ скажи те что нужно изменить в коде чтобы выводился только цвет №0 и чтобы это число сразу делилось на 1200?
Код:
procedure TForm1.Button1Click(Sender: TObject);
begin
     if OpenDialog1.Execute then
     begin
          Image1.Picture.Bitmap.LoadFromFile(OpenDialog1.FileName);
          if Image1.Picture.Bitmap<>nil then Button2.Enabled:=true else Button2.Enabled:=false;
     end;
end;

procedure TForm1.Button2Click(Sender: TObject);
var i,j,n:integer;
    p:PByteArray;
    colors : array [0..255] of integer;
begin
     if not (Image1.Picture.Bitmap.PixelFormat in [pf24Bit, pf32Bit]) then
        raise exception.create('Error, Format File not supported!');
     Memo1.Lines.Clear;
     FillChar(colors,SizeOf(colors),0);
     n := Abs(Integer(Image1.Picture.Bitmap.ScanLine[1]) - Integer(Image1.Picture.Bitmap.ScanLine[0]));


     for i:=0 to Image1.Picture.Bitmap.Height-1 do
     begin
          P:=Image1.Picture.Bitmap.ScanLine[i];
          for j:=0 to n-1 do
              inc(colors[P^[j]]);
        
     end;
     for i:=0 to 255 do
     if colors[i]>0 then
     Memo1.Lines.Add('цвет'+IntToStr(i)+', количество='+IntToStr(colors[i]));
end;

end.

Последний раз редактировалось Stilet; 12.05.2015 в 13:27.
OTGB вне форума Ответить с цитированием
Старый 12.05.2015, 13:29   #16
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Хм... Убери for i:=0 to 255 do и if colors[i]>0 then
И colors[i] напиши как colors[0]
а вообще тогда получается нужно убрать массив colors совсем, заменив его на обычный integer, и проверку писать в цикле, где ScanLine используется.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 12.05.2015, 13:37   #17
OTGB
Форумчанин
 
Аватар для OTGB
 
Регистрация: 06.05.2015
Сообщений: 120
По умолчанию

извините за мою глупость но так будет?
Код:
procedure TForm1.Button1Click(Sender: TObject);
begin
     if OpenDialog1.Execute then
     begin
          Image1.Picture.Bitmap.LoadFromFile(OpenDialog1.FileName);
          if Image1.Picture.Bitmap<>nil then Button2.Enabled:=true else Button2.Enabled:=false;
     end;
end;

procedure TForm1.Button2Click(Sender: TObject);
var i,j,n,l,k:integer;
    p:PByteArray;

    colors : array [0..255] of integer;
begin
     if not (Image1.Picture.Bitmap.PixelFormat in [ pf24Bit, pf32Bit]) then
        raise exception.create('Error, Format File not supported!');
     Memo1.Lines.Clear;
     FillChar(colors,SizeOf(colors),0);
     n:= Abs(Integer(Image1.Picture.Bitmap.ScanLine[1]) - Integer(Image1.Picture.Bitmap.ScanLine[0]));


     for i:=0 to Image1.Picture.Bitmap.Height-1 do
     begin
          P:=Image1.Picture.Bitmap.ScanLine[i];
          for j:=0 to n-1 do
              inc(colors[P^[j]]);

     end;


     Memo1.Lines.Add('цвет'+IntToStr(i)+', количество='+IntToStr(colors[i]));


end;




procedure TForm1.Button3Click(Sender: TObject);
var k,l:Real;
begin
Memo2.text := Memo1.text;
end;
end.

Последний раз редактировалось OTGB; 12.05.2015 в 13:42.
OTGB вне форума Ответить с цитированием
Старый 12.05.2015, 13:41   #18
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Скорее так:
Код:
procedure TForm1.Button2Click(Sender: TObject);
var i,j,n,l,k:integer;
    p:PByteArray;

    color : integer;
begin
     if not (Image1.Picture.Bitmap.PixelFormat in [ pf24Bit, pf32Bit]) then
        raise exception.create('Error, Format File not supported!');
     Memo1.Lines.Clear;
     FillChar(colors,SizeOf(colors),0);
     n:= Abs(Integer(Image1.Picture.Bitmap.ScanLine[1]) - Integer(Image1.Picture.Bitmap.ScanLine[0]));


     for i:=0 to Image1.Picture.Bitmap.Height-1 do
     begin
          P:=Image1.Picture.Bitmap.ScanLine[i];
          for j:=0 to n-1 do
              if p^[j]=0 then inc(color);

     end;


     Memo1.Lines.Add('öâåò'+IntToStr(i)+', êîëè÷åñòâî='+IntToStr(color));


end;
P.S. Честно признаюсь, не понимаю что этот код тебе дает, просто поправил его как ты сказал.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 12.05.2015, 13:47   #19
OTGB
Форумчанин
 
Аватар для OTGB
 
Регистрация: 06.05.2015
Сообщений: 120
По умолчанию

у меня теперь выходит вот такой цвет а до этого было №0 9600.
Изображения
Тип файла: jpg AZxcv.jpg (74.4 Кб, 123 просмотров)
OTGB вне форума Ответить с цитированием
Старый 12.05.2015, 13:51   #20
OTGB
Форумчанин
 
Аватар для OTGB
 
Регистрация: 06.05.2015
Сообщений: 120
По умолчанию

выдаёт ошибку
Изображения
Тип файла: jpg 122312312.jpg (32.2 Кб, 149 просмотров)
OTGB вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Определить, представимо ли число в виде суммы трех квадратов Draurign Помощь студентам 8 15.08.2012 19:00
Как определить количество цветов в подгружаемом рисунке и наиболее частые цвета Dezzit C# (си шарп) 1 04.05.2012 20:12
Циклы (разложить число в ряд суммы квадратов) Horatii Паскаль, Turbo Pascal, PascalABC.NET 8 08.10.2011 11:57
число, как сумма квадратов Neitrosha Помощь студентам 4 21.12.2010 19:03
число в виде суммы квадратов натуральных чисел gambuz Паскаль, Turbo Pascal, PascalABC.NET 0 04.10.2010 11:07