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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Загрузка текстуры, без TBitmap 
:(
    Опции темы
DragonFire
Дата 6.3.2006, 13:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Мне нужно загрузить текстуру. У меня есть такой код:
Код

function TLoad( const AFileName : String; var width,height:integer):pByteArray;
var B : TBitmap;
    i,j : Integer;
    temp: GLbyte;
begin
  B := TBitmap.Create;
  B.LoadFromFile(AFileName);
  Width := B.Width;
  Height := B.Height;

  GetMem(result,Width*Height*3);

  for j := 0 to Height - 1 do begin
    for i := 0 to Width - 1 do begin
      result[(j*Width + i)*3] := GetRValue(B.Canvas.Pixels[i,j]);
      result[(j*Width + i)*3+1] := GetGValue(B.Canvas.Pixels[i,j]);
      result[(j*Width + i)*3+2] := GetBValue(B.Canvas.Pixels[i,j]);

    end;
  end;

  B.Free;
end;

Но мне нужно составить процедуру, не использую TBitmap.
У меня есть и такой код:
Код

function ReadBitmap(const FileName : String;
                    var sWidth, tHeight: GLsizei):pointer;
const
  szh = SizeOf(TBitmapFileHeader);
  szi = SizeOf(TBitmapInfoHeader);
type
  TRGB = record
    r, g, b : GLbyte;
  end;
  TWrap = Array [0..0] of TRGB;
var
  BmpFile : File;
  bfh : TBitmapFileHeader;
  bmi : TBitmapInfoHeader;
  x, size: GLint;
  temp: GLbyte;
begin
  AssignFile (BmpFile, FileName);
  Reset (BmpFile, 1);
  Size := FileSize (BmpFile) - szh - szi;
  Blockread(BmpFile, bfh, szh);
  BlockRead (BmpFile, bmi, szi);
  If Bfh.bfType <> $4D42 then begin
    MessageBox(Window, 'Invalid Bitmap', 'Error', MB_OK);
    Result := nil;
    Exit;
  end;
  sWidth := bmi.biWidth;
  tHeight := bmi.biHeight;
  GetMem (Result, Size);
  BlockRead(BmpFile, Result^, Size);
  For x := 0 to sWidth*tHeight-1 do
    With TWrap(result^)[x] do begin
      temp := r;
      r := b;
      b := temp;
  end;
end;

Но в этой процедуре используется тип Pointer,а мне нужен pByteArray...
Как мне соместить эти две процедуры????
З.Ы.
Код

PByteArray = ^TByteArray;
TByteArray = array[0..32767] of Byte;



--------------------
PM MAIL ICQ   Вверх
Alexeis
Дата 6.3.2006, 14:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


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

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



Мне кажется что решение черезчур сложное...
можно попробовать работать с bitmapom через api
Добавлено @ 15:02
Вот перечень функций для работы
Взято из справки
BitBlt
CreateBitmap
CreateBitmapIndirect
CreateCompatibleBitmap
CreateDIBitmap
CreateDIBSection
CreateDiscardableBitmap
ExtFloodFill
FloodFill
GetBitmapBits
GetBitmapDimensionEx
GetDIBColorTable
GetDIBits
GetPixel
GetStretchBltMode
LoadBitmap
MaskBlt
PatBlt
PlgBlt
SetBitmapBits
SetBitmapDimensionEx
SetDIBColorTable
SetDIBits
SetDIBitsToDevice
SetPixel
SetPixelV
SetStretchBltMode
StretchBlt
StretchDIBits


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

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

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


Опытный
**


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

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



Чтобы работать с TBitMaP нужно подключать модуль Graphics, а мне этого делать нельзя...
Вот составил процедурку - текстуры загружает, только нужно чтобы в pByteArray загрудала а не в Pointer...


--------------------
PM MAIL ICQ   Вверх
Alexeis
Дата 6.3.2006, 15:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


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

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



причем здесь Graphics это Api функции определенные в модуле Windows
Добавлено @ 15:24
Эти функции не работают с tbitmap а с указателем на область памяти где хранится битмап HBITMAP (или handle картинки)
Добавлено @ 15:25
handle пролучают вызавом loadbitmap(...)
Добавлено @ 15:32
Вообще bitmap это некоторый зарегистрированный тип в windows
делфийский tbitmap это лишь оболочка виндовского.
Добавлено @ 15:36
А указтели любые можно и так присваивать без проблем
переменные pByteArray и Pointer присваиваются одна другой и наоборот.


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

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

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


Опытный
**


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

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



Если присваиваются, тогда почему при компиляции на строке With TWrap(result^)[x] do begin у меня выдает ошибку несоответствия типов, это я заменяю Pointer на pByteArray в описании функции...

Цитата(alexeis1 @ 6.3.2006, 15:22 Найти цитируемый пост)
причем здесь Graphics это Api функции определенные в модуле Windows

Тогда если не сложно, мог бы написать простенький код загрузки файла в Api TBitmap - создание его, объяление... smile


--------------------
PM MAIL ICQ   Вверх
DragonFire
Дата 7.3.2006, 14:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



alexeis1
Можешь примерный код дать? плиз...


--------------------
PM MAIL ICQ   Вверх
Yanis
Дата 7.3.2006, 15:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(DragonFire @ 6.3.2006, 20:03 Найти цитируемый пост)
Если присваиваются, тогда почему при компиляции на строке With TWrap(result^)[x] do begin у меня выдает ошибку несоответствия типов, это я заменяю Pointer на pByteArray в описании функции...

У меня всё компилируется без ошибок.


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
DragonFire
Дата 7.3.2006, 15:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



А у меня ошибка на строке:
With (TWrap(result^)[x] do begin
вот какая:
[Error] PRL.dpr(459): Invalid typecast


--------------------
PM MAIL ICQ   Вверх
Romikgy
Дата 7.3.2006, 15:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

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



Код

BlockRead(BmpFile, Result, Size);
  For x := 0 to sWidth*tHeight-1 do
    With (TWrap(result))[x] do begin
      temp := r;
      r := b;
      b := temp;
  end;

А если так попробовать?


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Yanis
Дата 7.3.2006, 15:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(DragonFire @ 7.3.2006, 15:27 Найти цитируемый пост)
А у меня ошибка на строке:
With (TWrap(result^)[x] do begin
вот какая:
[Error] PRL.dpr(459): Invalid typecast

А у тебя какая версия Delphi?


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
DragonFire
Дата 7.3.2006, 15:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Romikgy @ 7.3.2006, 15:31 Найти цитируемый пост)
А если так попробовать?

та же ошибка

Цитата(Yanis @ 7.3.2006, 15:46 Найти цитируемый пост)
А у тебя какая версия Delphi?

7 smile



--------------------
PM MAIL ICQ   Вверх
Romikgy
Дата 7.3.2006, 16:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

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



Код

function ReadBitmap(const FileName : String;
                    var sWidth, tHeight: GLsizei):pointer;
const
  szh = SizeOf(TBitmapFileHeader);
  szi = SizeOf(TBitmapInfoHeader);
type
  TRGB = record
    r, g, b : GLbyte;
  end;
  TWrap = Array  of TRGB;
  
var
  BmpFile : File;
  bfh : TBitmapFileHeader;
  bmi : TBitmapInfoHeader;
  x, size: GLint;
  temp: GLbyte;
  per: TWrap;
begin
  AssignFile (BmpFile, FileName);
  Reset (BmpFile, 1);
  Size := FileSize (BmpFile) - szh - szi;
  Blockread(BmpFile, bfh, szh);
  BlockRead (BmpFile, bmi, szi);
  If Bfh.bfType <> $4D42 then begin
    MessageBox(Window, 'Invalid Bitmap', 'Error', MB_OK);
    Result := nil;
    Exit;
  end;
  sWidth := bmi.biWidth;
  tHeight := bmi.biHeight;
  GetMem (per, Size);// может и здесь надо будет @per[0]
  BlockRead(BmpFile, per, Size);
  For x := 0 to sWidth*tHeight-1 do
    With per[x] do begin
      temp := r;
      r := b;
      b := temp;
  end;
 Result:=@per[0];
end;

А так?


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
DragonFire
Дата 7.3.2006, 16:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Все прикрасно компелируется, даже если тип функции поменять на pByteArray но при загрузке выдает RunTime Errore...


--------------------
PM MAIL ICQ   Вверх
Romikgy
Дата 7.3.2006, 16:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

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



Цитата(DragonFire @ 7.3.2006, 15:17 Найти цитируемый пост)
RunTime Error

В каком месте?


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Albinos_x
Дата 7.3.2006, 17:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

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



попробуй в конце процедуры поставить
CloseFile(BmpFile);
и в свойствах файла убрать атрибут только для чтения...


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

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

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

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


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

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


 




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


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

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