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

Поиск:

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


Опытный
**


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

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



Albinos_x
Не помогает

Romikgy
На строке
BlockRead(BmpFile, per, Size);
Это перед циклом...


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


Evil Skynet
****


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

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



Цитата(DragonFire @ 7.3.2006, 18:45 Найти цитируемый пост)
На строке
BlockRead(BmpFile, per, Size);
Это перед циклом...

если возмёшь маленький файл этой ошибки вылетать не будет, т.е. у этой функции видимо есть ограничение на Size, пока в справке ничего по этому поводу не нашёл... советую ограничить чтение блоком допустип - 8192 и считывать в цикле...


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
DragonFire
Дата 7.3.2006, 21:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Да...
Хотелось бы побольше, чем 16х16 smile


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


Evil Skynet
****


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

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



Цитата(DragonFire @ 7.3.2006, 21:31 Найти цитируемый пост)
Да...
Хотелось бы побольше, чем 16х16

я имел ввиду считывать по блочно (кусками по 8192)


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
DragonFire
Дата 7.3.2006, 23:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



тоесть? кусок текстуры, а потом соеденить? интересно...
вот тока как это сделать? smile


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


Evil Skynet
****


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

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



Цитата(DragonFire @ 7.3.2006, 23:03 Найти цитируемый пост)
тоесть? кусок текстуры, а потом соеденить? интересно...
вот тока как это сделать?

не.. то есть делаешь промежуточный массив, допустим pertemp, такой же как per, только размером 8192 в него считываешь блок, после дописываешь им per, и так в цикле пока per не заполнишь(или не прочитаешь весь файл)...


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
DragonFire
Дата 7.3.2006, 23:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Спасибо, щас попробую...
Добавлено @ 23:43
Код

function ReadBitmap(const FileName : String;
                    var sWidth, tHeight: GLsizei):PByteArray;
const
  szh = SizeOf(TBitmapFileHeader);
  szi = SizeOf(TBitmapInfoHeader);
type
  TRGB = record
    r, g, b : GLbyte;
  end;
  TWrap = Array  of TRGB;
  Tpertemp = Array [0..8190] of TRGB;
  
var
  BmpFile : File;
  bfh : TBitmapFileHeader;
  bmi : TBitmapInfoHeader;
  x, size: GLint;
  temp: GLbyte;
  per: TWrap;
  pertemp: Tpertemp;
  i:integer;
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]
  while eof(BmpFile) do begin
    BlockRead(BmpFile, pertemp, Size);
    for i:=0 to 8190 do per[i]:=pertemp[i];
  end;

  For x := 0 to sWidth*tHeight-1 do
    With per[x] do begin
      temp := r;
      r := b;
      b := temp;
  end;
 Result:=@per[0];
end;

Вот так... грузит тока вместо текстур все черное...

...Я вот подумал может дело не в типе, а в хранении данных... мне нужно чтобы они хранились как тут хранятся:
Код

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;

может не надо так сложно это переделывать... теперь то это вообще не текстура smile



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


Опытный
**


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

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



Короче, можно заменить делфийский TBitMap на какой-нибудь Api-шный Bitmap??


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


Evil Skynet
****


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

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



Цитата(DragonFire @ 7.3.2006, 23:35 Найти цитируемый пост)
Вот так... грузит тока вместо текстур все черное...

это понятно... у тебя массив кроме первых 8190 элементов будет равен 0...
Цитата(DragonFire @ 7.3.2006, 23:35 Найти цитируемый пост)
for i:=0 to 8190 do per[i]:=pertemp[i];

тогда уж вот так:
Код

  j:=0;
  while not eof(BmpFile) do begin    
    BlockRead(BmpFile, pertemp, 8192);
   for i:=0 to 8191 do 
      begin
      per[j]:=pertemp[i];
      if j>=Size then break;
      inc(j);
      end;


Это сообщение отредактировал(а) Albinos_x - 8.3.2006, 16:24


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
DragonFire
Дата 8.3.2006, 15:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Ууу...
Так вообще ошибку выдает и открывает окно CPU...
Может можно просто как то заменить TBitMap Delphi на какой-нибудь TBitMap Api?


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


Evil Skynet
****


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

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



Цитата(DragonFire @ 8.3.2006, 15:27 Найти цитируемый пост)
Так вообще ошибку выдает и открывает окно CPU...

угу... такое же окошечко я видел в твоём коде и до этого но с маленькой картинкой...

а так всё дело "в волшебных пузырьках"....:
Код

function ReadBitmap(const FileName : String;
                    var sWidth, tHeight: GLsizei):PByteArray;
const
  szh = SizeOf(TBitmapFileHeader);    
  szi = SizeOf(TBitmapInfoHeader);    
type
  TRGB = record    
    r, g, b : GLbyte;
  end;
  TWrap = Array  of TRGB;    
  Tpertemp = Array [0..8192] of TRGB;

var    
  BmpFile : File;    
  bfh : TBitmapFileHeader;
  bmi : TBitmapInfoHeader;    
  x, size: integer;
  temp: byte;
  per: TWrap;    
  pertemp: Tpertemp;    
  i,j,k:integer;
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(0, 'Invalid Bitmap', 'Error', MB_OK);
    Result := nil;
    Exit;    
  end;
  sWidth := bmi.biWidth;
  tHeight := bmi.biHeight;
  GetMem (per, Size*4);    
  j:=0;
  for k:=1 to trunc(Size/8192) do
    begin
    BlockRead(BmpFile, pertemp, 8192);
   for i:=0 to 8191 do
      begin
      per[j]:=pertemp[i];
      inc(j);
      end;
   end;
  k:=Size mod 8192;
  if (k)<>0 then
      begin
      BlockRead(BmpFile, pertemp, k);
      for i:=0 to k do
         begin
         per[j]:=pertemp[i];
         inc(j);
         end;
      end;
  For x := 0 to sWidth*tHeight-1 do
    With per[x] do begin
      temp := r;
      r := b;
      b := temp;
  end;
 Result:=@per[0];
end;


видимо глюк ловит ф-я BlockRead и вместе с
Код

while not eof(BmpFile) do

работать не хочет... хотя должна...
Добавлено @ 16:33
Цитата(DragonFire @ 8.3.2006, 15:27 Найти цитируемый пост)
Может можно просто как то заменить TBitMap Delphi на какой-нибудь TBitMap Api?

вотт так его описывает делфя:
Код

TBitmapImage = class(TSharedImage)
  private
    FHandle: HBITMAP;     // DDB or DIB handle, used for drawing
    FMaskHandle: HBITMAP; // DDB handle
    FPalette: HPALETTE;
    FDIBHandle: HBITMAP;  // DIB handle corresponding to TDIBSection
    FDIB: TDIBSection;
    FSaveStream: TMemoryStream; // Save original RLE stream until image is modified
    FOS2Format: Boolean;  // Write BMP file header, color table in OS/2 format
    FHalftone: Boolean;   // FPalette is halftone; don't write to file
  protected
    procedure FreeHandle; override;
  public
    destructor Destroy; override;
  end;

  TBitmapHandleType = (bmDIB, bmDDB);
  TPixelFormat = (pfDevice, pf1bit, pf4bit, pf8bit, pf15bit, pf16bit, pf24bit, pf32bit, pfCustom);
  TTransparentMode = (tmAuto, tmFixed);

  TBitmap = class(TGraphic)
  private
    FImage: TBitmapImage;
    FCanvas: TCanvas;
    FIgnorePalette: Boolean;
    FMaskBitsValid: Boolean;
    FMaskValid: Boolean;
    FTransparentColor: TColor;
    FTransparentMode: TTransparentMode;
    procedure Changing(Sender: TObject);
...
...



--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
DragonFire
Дата 8.3.2006, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Да... не пашет...
А насчет описания - я смотрел, только там оченб много ссылок на типы разные из SysUtillsa и другого...


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


Evil Skynet
****


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

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



Цитата(DragonFire @ 8.3.2006, 16:55 Найти цитируемый пост)
Да... не пашет...

последний вариант попробовал?


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
DragonFire
Дата 8.3.2006, 19:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



да, не пашет...


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


Evil Skynet
****


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

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



в чем выражается?
может попробовать не указатель(т.к. массив per заполняется нормально... проверял), а сам массив передавать?
Код
...
type    
  TRGB = record     
    r, g, b : GLbyte;    
  end;
...
function ReadBitmap(const FileName : String;    
                    var sWidth, tHeight: GLsizei):TRGB;    
...
...
  end;    
 Result:=per;    
end;



--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
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.0674 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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