Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Программа и интерфейс
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 02.11.2010, 09:41
bistriy bistriy вне форума
Прохожий
 
Регистрация: 30.10.2010
Сообщения: 31
Репутация: 0
По умолчанию Прошу написать знающих людей

Вот я такой мачо. Извините за бред.

Вот моя идея я хочу научиться работать через указатели, потому что через них происходит самая быстрая передача всех данных на компьютере. Я это понял прочитав о функции Scanline.
Прошу описать поподробнее как происходит передача данных в картинке через эту функцию. А поподробнее прошу рассказать про то где присваиваються значения цветов а где адреса указателей ? И где именно через указатель значение бестро передаеться в массив. ?

А так же на примере Scanline прошу поподробнее обьяснить, по какой схеме происходит передача данных через указатели в общем случае, а не только через функцию Scanline ?
Заранее, весьма премного благодарен.
Ответить с цитированием
  #2  
Старый 02.11.2010, 11:40
Аватар для Konrad
Konrad Konrad вне форума
Эксперт
 
Регистрация: 19.03.2009
Сообщения: 1,261
Репутация: 45834
По умолчанию

Цитата:
Сообщение от bistriy
Вот моя идея я хочу научиться работать через указатели, потому что через них происходит самая быстрая передача всех данных на компьютере.

Быстрый ты наш)))
Ответить с цитированием
  #3  
Старый 02.11.2010, 14:26
Аватар для KOOL
KOOL KOOL вне форума
Активный
 
Регистрация: 06.01.2008
Адрес: Рязань
Сообщения: 306
Версия Delphi: 2009
Репутация: 6150
По умолчанию

Код:
procedure TSGIImage.SetColor(X, Y:integer; R,G,B:byte; A:byte=255);
var ba:PByteArray; //указатели на строку Y изображения
    p:PRGBTriple;
    q:PRGBQuad;
begin
  if Bitmap.PixelFormat=pf8bit then //если изображение монохромное 8бит
    begin
      ba := PByteArray(Bitmap.ScanLine[Y]); //получаем адрес строки Y
      ba[X]:=R; //Задаем значение пикселя X, находящегося по адресу ba[X]
    end
  else if Bitmap.PixelFormat=pf24bit then //если цветное 24бит
    begin
      DWORD(p) := DWORD(Bitmap.ScanLine[Y]) + (X * SizeOf(TRGBTriple)); //значение указателя := Адрес Y строки + смещение на X пикселей
      p.rgbtRed:=R;  //Задаем значения пикселя X, находящегося по адресу p
      p.rgbtGreen:=G;
      p.rgbtBlue:=B;
    end
  else if Bitmap.PixelFormat=pf32bit then //если цветное с прозрачностью
    begin
      DWORD(q) := DWORD(Bitmap.ScanLine[Y]) + (X * SizeOf(TRGBQuad)); //значение указателя := Адрес Y строки + смещение на X пикселей
      q.rgbtRed:=R; //Задаем значения пикселя X, находящегося по адресу q
      q.rgbtGreen:=G;
      q.rgbtBlue:=B;
      q.rgbtAlpha:=A;
    end;
end;
в указателе хранится адрес переменной/объекта, при этом адрес, на который указвает указатель, можно менять. поэтому с их помощью можно заполнить значениями строку картинки, получив один раз адрес строки, и после заполнения очередного пикселя просто сдвигать указатель на размер пикселя, т.е. что-то типа
Код:
X:=0;
DWORD(p) := DWORD(Bitmap.ScanLine[Y]); //получаем адрес строки
repeat
  p.rgbtRed:=R;  //Задаем значения пикселя
  p.rgbtGreen:=G;
  p.rgbtBlue:=B;
  X:=X+1;
  DWORD(p) := DWORD(p) + (X * SizeOf(TRGBTriple)); //сдвигаем указатель
until x>=Bitmap.Width;
__________________
РГРТУ - ФВТ - Системы Автоматизированного ПРоектирования. ت
Ответить с цитированием
  #4  
Старый 02.11.2010, 15:14
bistriy bistriy вне форума
Прохожий
 
Регистрация: 30.10.2010
Сообщения: 31
Репутация: 0
По умолчанию

Спасибо ! Вам !

Последний раз редактировалось bistriy, 03.11.2010 в 11:44.
Ответить с цитированием
  #5  
Старый 02.11.2010, 17:02
Аватар для KOOL
KOOL KOOL вне форума
Активный
 
Регистрация: 06.01.2008
Адрес: Рязань
Сообщения: 306
Версия Delphi: 2009
Репутация: 6150
По умолчанию

Цитата:
А что это такое:
ba:PByteArray;
p:PRGBTriple;
q:PRGBQuad;
это указатели на определенные типы

обычные типы и массивы не лучший пример (их легче просто присвоить), но раз просите:
Код:
type PString = ^String; //type foo = ^bar - это объявление нового типа foo как указателя на объект или переменную типа bar
...
var p, p2:PString; //объявляем переменную-указатель
   Src,Dst : String; //Исходная и конечная строки
begin
//Использование динамических переменных (здесь это p)
  //тут p=nil, т.е. пустому указателю

  GetMem(p, Length(Src)+1); //выделяем участок памяти размером с исходную строку (включая нулевой символ) и записываем адрес этого участка в указатель
  //тут p=некоторому адресу
  p^:=Src; //копируем исходную строку в новую. foo^ - означает доступ к объекту/переменной, хранящейся по адресу, на который указывает foo
  //вот, собственно, и все. строка скопирована и обращаться к ней надо по p^
...
  FreeMem(p); //поработали со строкой - надо теперь память за собой почистить
  p:=nil; //на всякий пожарный

...
//Доступ к переменной через указатель

  p2:=@Src; //p2 теперь указывает на Str; @var - возвращает адрес var
  p2^:='Test'; //записываем строку по адресу, на который указывает p2
  //Src теперь равно 'Test';
  p2:=nil; //на всякий пожарный

...
//Копирование Src -> Dst. для простых типов делать это через указатели бессмысленно и неоптимально

  p:=@Dst; //p теперь указывает на Dst;
  p^:=Src; //Dst теперь равна Src
  p:=nil; //на всякий пожарный

end;
помимо GetMem() и FreeMem() есть еще New() и Dispose(). GetMem() выделяет кусок памяти произвольного размера и поэтому годится для нетипизированных указателей (p:Pointer) и указателей на динамические структуры - массивы, строки; New выделяет память указателю на тип с фиксированным размером - integer, float... и record

ну и лучше из какого-нибудь учебника почитать про них..попонятнее будет. вот для начала можно http://coder.udrabota.com/stat/delphi/gl_15.1.php
__________________
РГРТУ - ФВТ - Системы Автоматизированного ПРоектирования. ت

Последний раз редактировалось KOOL, 03.11.2010 в 10:35.
Ответить с цитированием
  #6  
Старый 02.11.2010, 18:48
bistriy bistriy вне форума
Прохожий
 
Регистрация: 30.10.2010
Сообщения: 31
Репутация: 0
По умолчанию Код

Спасибо ! Вам !

Последний раз редактировалось bistriy, 03.11.2010 в 11:46.
Ответить с цитированием
  #7  
Старый 02.11.2010, 19:28
Аватар для KOOL
KOOL KOOL вне форума
Активный
 
Регистрация: 06.01.2008
Адрес: Рязань
Сообщения: 306
Версия Delphi: 2009
Репутация: 6150
По умолчанию

поправил
Цитата:
Вот вопрос где обьявление переменной Src ?
забыл подписать, уж можно было догадаться
__________________
РГРТУ - ФВТ - Системы Автоматизированного ПРоектирования. ت
Ответить с цитированием
  #8  
Старый 03.11.2010, 09:58
bistriy bistriy вне форума
Прохожий
 
Регистрация: 30.10.2010
Сообщения: 31
Репутация: 0
По умолчанию Куралесов

Спасибо ! Вам !

Последний раз редактировалось bistriy, 03.11.2010 в 11:45.
Ответить с цитированием
  #9  
Старый 03.11.2010, 11:45
Аватар для Konrad
Konrad Konrad вне форума
Эксперт
 
Регистрация: 19.03.2009
Сообщения: 1,261
Репутация: 45834
По умолчанию

Цитата:
Сообщение от bistriy
Так не обучают новичков ? Перепишите нормально код.
Чтобы можно было изучить работу с указателями по нормальному.
Тебе никто ничего не должен.
Тем более учить.

Учить в школе будут, а тут могут только подсказать.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 12:50.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025