Модераторы: Snowy, Alexeis, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ScanLine 
:(
    Опции темы
Canyon
Дата 13.4.2012, 15:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 11.3.2012

Репутация: нет
Всего: нет



Использую следующий код :
Код

type
  TRGB = record
    b, g, r: byte;
  end;
  ARGB = array[0..1] of TRGB;
  PARGB = ^ARGB; 

//Button1.Click
var
  y: integer;
 P := PARGB;
begin
  for y := 0 to bmp.height - 1 do
  p := bmp.scanline[y];
End;

//Button2.Click
panel1.Color := RGB(p[StrToInt(Edit1.Text)].R, p[StrToInt(Edit1.Text)].G, p[StrToInt(Edit1.Text)].B);


Праильно ли то что в p[0] := Нижний левый угол картинки? Можно ли сделать наоборот Верхний левый угол картинки?

Почему при использовании за24bit через каждые 4 значения P идет черный цвет, как это исправить?

Задачи такие: 
Найти все не белые пикслели и превратить их в черные, а белые наоборот.
После того как картинка станет черно белой вывести результат где в BMP.Heigth нет черных пикселей.


C задачи я сам с правлюсь, хочу понять правильно ли написан код, и как быть с проблемами выше!

По мере поступлений вопросов буду задавать. 


  ARGB = array[0..1] of TRGB; что указывать в квадратных скобках? Буду использовать pf8bit

Это сообщение отредактировал(а) Canyon - 13.4.2012, 15:34
PM   Вверх
Alexeis
Дата 13.4.2012, 16:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 55
Всего: 459



Цитата(Canyon @  13.4.2012,  16:29 Найти цитируемый пост)
Праильно ли то что в p[0] := Нижний левый угол картинки?

Да

Цитата(Canyon @  13.4.2012,  16:29 Найти цитируемый пост)
Можно ли сделать наоборот Верхний левый угол картинки?

Насколько я знаю, класс TBitmap не умеет работать с такими битмапами. 

Цитата(Canyon @  13.4.2012,  16:29 Найти цитируемый пост)
Почему при использовании за24bit через каждые 4 значения P идет черный цвет, как это исправить?

В этом формате байты цветов пикселей в строке идут в следующем порядке BGRBGR...BGR . Никаких пустых мест или промежутков нет. Промежутки есть только между строками для выравнивания.

Цитата(Canyon @  13.4.2012,  16:29 Найти цитируемый пост)
C задачи я сам с правлюсь, хочу понять правильно ли написан код, и как быть с проблемами выше!


Я бы использовал тип TRGB = packed record
и тоже самое с 
ARGB = packed array[0..1] of TRGB;

для того чтобы быть уверенным, что делфи будет правильно выравнивать записи и не оставит промежутки между ними в массиве. 



--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Canyon
Дата 13.4.2012, 16:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 11.3.2012

Репутация: нет
Всего: нет



А вы попробуйте мой код протестировать и и увидите что на каждом 4 значении будет черный пиксель.
Картинка была 3х3 (0-Красный Зеленый Синийю 1-Синий Красный Зеленый, 3- Зеленый Синий Красный)
Цитата

Я бы использовал тип TRGB = packed record
и тоже самое с 
ARGB = packed array[0..1] of TRGB;

Вот так
Код

type
  TRGB = packed record
    b, g, r: byte;
  end;
  ARGB = packed array[0..1] of TRGB;
  PARGB = ^ARGB; 

var
 P := PARGB;


Может можно было сделать как то подругому???
Код

procedure TForm1.Button2Click(Sender: TObject);
var
 x, y , s: integer;
begin
S := GetTickCount;
for y := 0 to bmp.height - 1 do
  begin
    p := bmp.scanline[y];
 for x := 0 to BMP.Width-1 Do
 begin
  If RGB(p[x].R, p[x].G, p[x].B) = ClWhite Then
  begin
   p[x].R := 0;
   p[x].G := 0;
   p[x].B := 0;
  end
  Else
  begin
   p[x].R := 255;
   p[x].G := 255;
   p[x].B := 255;
  end;
  End;
 end;
 form1.Canvas.Draw(0, 0, BMP);
 Form1.Caption := IntTostr(GetTickCount-s);
 End;


К чему приведе уменьшение значения в квадратных скобках ARGB = packed array[0..1] of TRGB ???????

Если заменить в коде Heigth на Width то scanline будет сканировать в другом порядке?
Код

for y := 0 to bmp.height - 1 do
  p := bmp.scanline[y];


Это сообщение отредактировал(а) Canyon - 13.4.2012, 16:35
PM   Вверх
Чучмек
Дата 13.4.2012, 17:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЭТ БИЛЭТ
**


Профиль
Группа: Участник
Сообщений: 841
Регистрация: 11.5.2008
Где: СССР

Репутация: 2
Всего: 41



Цитата(Canyon @  13.4.2012,  16:28 Найти цитируемый пост)
Если заменить в коде Heigth на Width то scanline будет сканировать в другом порядке?

Код

for y :=  bmp.height - 1 downto 0
  p := bmp.scanline[y];



Это сообщение отредактировал(а) Чучмек - 13.4.2012, 17:25


--------------------
умную мысль держи при себе, а дурной - поделись с другими 
PM MAIL   Вверх
Canyon
Дата 13.4.2012, 17:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 11.3.2012

Репутация: нет
Всего: нет



Спасибо даже и не знал о downto!

Поменя местами Heigth и  Width выдает ошибку "Scan line index out range"
Что эта за ошибка и почему она выскакивает?
Код работает но в конце выполнения выдает ошибку выше.
Код

var
 x, y, s  : integer;
begin
 for y := 0 to BMP.Width - 1 do
 Begin
  p := BMP.ScanLine[y];
     for x := 0 to BMP.Width -1 Do
   Begin
    Form1.Canvas.Draw(1, 1, BMP);
    Sleep(10);
    If RGB(p[x].R, p[x].G, p[x].B) = ClWhite Then
    begin
   p[x].R := 0; p[x].G := 0; p[x].B := 0;
   memo1.Lines.Add('b');
  end
  Else
  begin
   p[x].R := 255; p[x].G := 255; p[x].B := 255;
   memo1.Lines.Add('w');
   End;
 End;
 End;
Form1.Canvas.Draw(1, 1, BMP);
Form1.Caption := IntToStr(GetTickCount-s);

В каком месте выдает я не могу выйяснить, т.к. не знаю как.

Можно ли при помощи ScanLine Сканировать не слева направо а сверху вних???

Это сообщение отредактировал(а) Canyon - 13.4.2012, 17:35
PM   Вверх
Чучмек
Дата 13.4.2012, 18:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЭТ БИЛЭТ
**


Профиль
Группа: Участник
Сообщений: 841
Регистрация: 11.5.2008
Где: СССР

Репутация: 2
Всего: 41



Цитата(Canyon @  13.4.2012,  17:34 Найти цитируемый пост)
Что эта за ошибка и почему она выскакивает?

Потому что Width>Heigth 
ScanLine возвращает указатель на первый байт строки. 
Если ты запрашиваешь сто первую строку когда их у тебя всего сто, то что ты получишь? 




--------------------
умную мысль держи при себе, а дурной - поделись с другими 
PM MAIL   Вверх
Чучмек
Дата 13.4.2012, 18:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЭТ БИЛЭТ
**


Профиль
Группа: Участник
Сообщений: 841
Регистрация: 11.5.2008
Где: СССР

Репутация: 2
Всего: 41



Цитата(Canyon @  13.4.2012,  17:34 Найти цитируемый пост)
Можно ли при помощи ScanLine Сканировать не слева направо а сверху вних???

Да ScanLine  ни чего не сканирует, она лишь возвращает указатель  на строку.
Вот, для размышлений: 
Код

procedure TForm1.Button1Click(Sender: TObject);
var
 bmp:tbitmap;
 p:pointer;
 d,y:cardinal;
 i:integer;
begin
bmp:=tbitmap.Create;
bmp.Width:=100;
bmp.Height:=200;
bmp.PixelFormat:=pf32bit;
  p:=bmp.ScanLine[0];
  d:=cardinal(bmp.ScanLine[1])-cardinal(p);
 y:=trunc(2*bmp.Width/3);
 for i:=0 to bmp.Height-1 do
 pcardinal(cardinal(p)+i*d+y*4)^:=$00FF0000;
image1.Picture.Bitmap:=bmp;

end;





--------------------
умную мысль держи при себе, а дурной - поделись с другими 
PM MAIL   Вверх
Alexeis
Дата 13.4.2012, 20:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 55
Всего: 459



Цитата(Чучмек @  13.4.2012,  19:42 Найти цитируемый пост)
Да ScanLine  ни чего не сканирует, она лишь возвращает указатель  на строку.

  Так и есть. Эта функция лишь вычисляет смещение строк. Если вызвать ScanLine для последней строки, то получим начала буфера всего растра. Дальше прибавляя смещение одной строки можно перейти к следующей строке. Поэтому цикл должен быть от 0 до Heigth - 1 и это будет координата Y, координата X будет смещением внутри строки. 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Звук, графика и видео"
Girder
Snowy
Alexeis

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • По вопросам разработки игр стоит заглянуть сюда

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Girder, Snowy.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Звук, графика и видео | Следующая тема »


 




[ Время генерации скрипта: 0.0936 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.