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

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

Вернуться   Форум программистов > Delphi программирование > Мультимедиа в Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.10.2010, 04:59   #1
SalasAndriy
Форумчанин Подтвердите свой е-майл
 
Аватар для SalasAndriy
 
Регистрация: 01.11.2007
Сообщений: 157
По умолчанию Создание TBitmap с ScanLine другого битмапа...

Здравствуйте!

Как можно создать TBitmap или пусть даже HBITMAP на основе указателя уже имеющегося TBitmap.ScanLine[0]?

Вот например есть ф-я

Код:
function DrawEffect(PVideo: Pointer; Width, Height: Integer): boolean;
begin
  
end;
Пример использования:
Код:
procedure TForm1.Button2Click(Sender: TObject);
var
  bmp: TBitmap;
begin
  bmp := TBitmap.Create;
  bmp.LoadFromFile('Какой-то файл.bmp');
  bmp.PixelFormat := pf32bit;

  if DrawEffect(bmp.ScanLine[0], bmp.Width, bmp.Height) then
  bmp.SaveToFile('Какой-то файл 2.bmp');

  bmp.Free;
end;
Как можно внутри функции DrawEffect создать TBitmap или HBITMAP из этого параметра PVideo который она имеет...

Чтобы я мог работать с той памятью которую получаю так как с обычным TBitmap.

Или единственный выход будет такой? Копирование - Обработка - Копирование обратно?
Код:
function DrawEffect(PVideo: Pointer; Width, Height: Integer): boolean;
var
  dstPixel: PRGBQuad;
  srcPixel: PRGBQuad;
  X, Y: integer;
  TempBitmap: TBitmap;
  i: Integer;
begin
  TempBitmap := TBitmap.Create;
  TempBitmap.PixelFormat := pf32bit;
  TempBitmap.Width := Width;
  TempBitmap.Height := Height;

  srcPixel := PVideo;

  for Y := 0 to Height - 1 do
  begin
    dstPixel := Bmp1.ScanLine[Y];
    for X := 0 to Width - 1 do
    begin
      with dstPixel^ do
      begin
        rgbRed := dstPixel^.rgbRed;
        rgbGreen := dstPixel^.rgbGreen;
        rgbBlue := dstPixel^.rgbBlue;
        Inc(srcPixel);
      end;
      Inc(dstPixel);
    end;
  end;

  // обработка

  // И таким же способом копирование обратно
end;
Но мне кажется что это будет очень долго... Так как ф-я DrawEffect будет вызываться не при нажатии на кнопку, а по таймеру... Плюс к тому что еще обработать нужно данные (Нарисовать эффект)... теряется скорость...

Есть другие варианты решения проблемы?

Последний раз редактировалось SalasAndriy; 25.10.2010 в 07:11.
SalasAndriy вне форума Ответить с цитированием
Старый 25.10.2010, 09:32   #2
DomiNick
Студент, не
Старожил
 
Аватар для DomiNick
 
Регистрация: 29.01.2009
Сообщений: 2,067
По умолчанию

Зачем всё так запутанно и сложно?
HBITMAP - это указатель на описание битмапа...
bmp.ScanLine[0] - это указатель на начало диб-секции в памяти (массив байт)...

Для вашего "эффекта" обязательно делать копию картинки? Может просто через указатель работать?
Или передавайте функции DrawEffect сам TBitmap...
I am the First of Cyber Evolution...
I am the First to Program your Future...
DomiNick вне форума Ответить с цитированием
Старый 25.10.2010, 09:40   #3
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

CreateDIBSection
BOBAH13 вне форума Ответить с цитированием
Старый 25.10.2010, 16:57   #4
SalasAndriy
Форумчанин Подтвердите свой е-майл
 
Аватар для SalasAndriy
 
Регистрация: 01.11.2007
Сообщений: 157
По умолчанию

Цитата:
Зачем всё так запутанно и сложно?
HBITMAP - это указатель на описание битмапа...
bmp.ScanLine[0] - это указатель на начало диб-секции в памяти (массив байт)...
Дело в том, что я пишу визуализационный плагин Sonique которые проигривает AIMP... И мне плеер передает только те параметры которые я показал на примере функции DrawEffect.

Цитата:
Для вашего "эффекта" обязательно делать копию картинки? Может просто через указатель работать?
Или передавайте функции DrawEffect сам TBitmap...
Можно работать и через указатель и вручную всё рисовать... Но тогда нужно строить кучу велосипедов LineTo ... и других процедур рисования...

Цитата:
CreateDIBSection
Я этой функцией имею дело первый раз... Вчера шарил в инете но нужного результата не добился... Она создает мне указатель на массив бит, а мне нужно чтобы она его не создавала, а использовала уже существующий указатель ScanLine...
SalasAndriy вне форума Ответить с цитированием
Старый 25.10.2010, 18:58   #5
DomiNick
Студент, не
Старожил
 
Аватар для DomiNick
 
Регистрация: 29.01.2009
Сообщений: 2,067
По умолчанию

Цитата:
Можно работать и через указатель и вручную всё рисовать... Но тогда нужно строить кучу велосипедов LineTo ... и других процедур рисования...
Ну так это зависит от того какие именно "эффекты" планируются...
Цитата:
Дело в том, что я пишу визуализационный плагин Sonique которые проигривает AIMP...
Хм... А можно тогда посмотреть описание этой штуковины?
Цитата:
И мне плеер передает только те параметры которые я показал на примере функции DrawEffect.
Передаётся только это? о___О
Как-то странно... А как же формат (количество бит на пиксель)? Или он там известный/фиксированный?


Ничего подходящего сходу не вспомнилось... Возможно если только ещё в gdiplus посмотреть...
Если нужна скорость, то ИМХО лучше "построить кучу велосипедов"... Кстати в сети полно готовых "велосипедных" алгоритмов с открытым исходным кодом...
I am the First of Cyber Evolution...
I am the First to Program your Future...
DomiNick вне форума Ответить с цитированием
Старый 25.10.2010, 21:35   #6
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Цитата:
Я этой функцией имею дело первый раз... Вчера шарил в инете но нужного результата не добился... Она создает мне указатель на массив бит, а мне нужно чтобы она его не создавала, а использовала уже существующий указатель ScanLine...
1. MSDN
2. Сначала разберитесь, а потом подумайте прежде чем писать ерунду
3. Что мешает по полученному указателю на биты HBITMAP, скопировать из указателя ваших данных?
4. Вы понимаете что после создания HBITMAP таким образом, система уже сама заботиться о корректном освобождении занимаемой памяти данным HBITMAP? А вы хотите чтобы она связала ваш указатель с новым HBITMAPом, что не есть хорошо по моему.
5. А кто мешает сначала создавать HBITMAP (CreateDIBSection), а потом зная прямой адрес битовой карты, работать как с обычным указателем?

UPD:
В принципе можете еще использовать CreateBitmap, но я не уверен что после создания нового HBITMAP'а с помощью данной функции, вы сможете обращаться на прямую к памяти/битам используя старый указатель (указанный в функции в качестве параметра).

Последний раз редактировалось BOBAH13; 25.10.2010 в 21:39.
BOBAH13 вне форума Ответить с цитированием
Старый 25.10.2010, 23:47   #7
SalasAndriy
Форумчанин Подтвердите свой е-майл
 
Аватар для SalasAndriy
 
Регистрация: 01.11.2007
Сообщений: 157
По умолчанию

Цитата:
Ну так это зависит от того какие именно "эффекты" планируются...
Согласен)) Если в одном плагине планируется немного, то нужно иметь запас на будущее...

Цитата:
Хм... А можно тогда посмотреть описание этой штуковины?
Можно)
Это SDK плагина...

Цитата:
Передаётся только это? о___О
Как-то странно... А как же формат (количество бит на пиксель)? Или он там известный/фиксированный?
Количество бит на пиксель всегда равно 32 бита...

Цитата:
Ничего подходящего сходу не вспомнилось... Возможно если только ещё в gdiplus посмотреть...
Если нужна скорость, то ИМХО лучше "построить кучу велосипедов"... Кстати в сети полно готовых "велосипедных" алгоритмов с открытым исходным кодом...
может и так... Спасибо DomiNick

Цитата:
1. MSDN
Спасибо, смотрю но разобраться не разобрался...

Цитата:
2. Сначала разберитесь, а потом подумайте прежде чем писать ерунду
Ерунду пишу потому что не разобрался и потому прошу помощи у знатоков!
Не писал бы вообще если бы знал как решить задачу...

Цитата:
3. Что мешает по полученному указателю на биты HBITMAP, скопировать из указателя ваших данных?
Я писал об этом... Вот я скопировал, а потом как? Мне нужно работать с данными которые уже есть... Получается я работаю напрямую но уже с новыми данными, хорошо я обработал их и получается нужно снова всё обратно скопировать в старые? Я этого и пытаюсь избежать... Туда сюда перебрасывать данные... Или может я вас не правильно понял?

Цитата:
4. Вы понимаете что после создания HBITMAP таким образом, система уже сама заботиться о корректном освобождении занимаемой памяти данным HBITMAP? А вы хотите чтобы она связала ваш указатель с новым HBITMAPом, что не есть хорошо по моему.
Теперь понимаю, спасибо!

Цитата:
5. А кто мешает сначала создавать HBITMAP (CreateDIBSection), а потом зная прямой адрес битовой карты, работать как с обычным указателем?
Можно примерчик? Я не профи, с этим дела не имел...

Цитата:
UPD:
В принципе можете еще использовать CreateBitmap, но я не уверен что после создания нового HBITMAP'а с помощью данной функции, вы сможете обращаться на прямую к памяти/битам используя старый указатель (указанный в функции в качестве параметра).
Спасибо, BOBAH13, попробую и этот вариант.
Вложения
Тип файла: rar SVP_SDK.rar (950 байт, 31 просмотров)

Последний раз редактировалось SalasAndriy; 26.10.2010 в 00:02.
SalasAndriy вне форума Ответить с цитированием
Старый 25.10.2010, 23:47   #8
SalasAndriy
Форумчанин Подтвердите свой е-майл
 
Аватар для SalasAndriy
 
Регистрация: 01.11.2007
Сообщений: 157
По умолчанию

Сори... нажал 2 раза кнопку отправить... Модеры, удалите это сообщение...

Последний раз редактировалось SalasAndriy; 25.10.2010 в 23:50.
SalasAndriy вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Недостаточно памяти для большого битмапа Alex Cones Общие вопросы Delphi 15 07.07.2010 07:11
Указатели. Объясните пожалуйста на примере scanline. TwiX Общие вопросы Delphi 3 19.10.2009 12:24
запись битмапа в файл SunKnight Общие вопросы Delphi 8 09.06.2008 08:56
Как ускорить загрузку битмапа в tImage Altera Мультимедиа в Delphi 10 24.03.2008 17:39
Сжатие битмапа Rapid Мультимедиа в Delphi 7 08.12.2007 16:38