Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

auxDIBImageLoadA для TBitmap? (glaux.dll)


WondeRu ©   (2004-06-18 09:25:00) 

Здравствуйте!
У меня проблема: нужно загрузить текстуру не из файла, а из TBitmap! GetDIBits не подходит из-за своей глюковатости!
Может есть функция наподобие auxDIBImageLoadA для TBitmap?
Помогите, плизззз!
Заранее спасибо!


WondeRu   (2004-06-18 16:43:00) [1]

все равно иногда возникают ошибки!
а может быть трабл, если моя форма находится в ActiveX dll?


MBo   (2004-06-18 15:55:00) [2]

>может Info.bmiHeader.biSize := sizeOf(Info.bmiHeader)?
да


WondeRu   (2004-06-18 15:43:00) [3]

>Info.bmiHeader.biSize := sizeOf(Info);
????
может Info.bmiHeader.biSize := sizeOf(Info.bmiHeader)?


MBo   (2004-06-18 15:06:00) [4]


 b: TBitmap;
 cnt: Integer = 0;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
 b := TBitmap.Create;
 b.PixelFormat := pf24bit;
 b.Width := 1024;
 b.Height := 1024;
 Randomize;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
 b.Free;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
 Info: TBitmapInfo;
 Data: array of byte;
begin
 b.Canvas.Brush.Color := Random(256 * 256 * 256);
 b.Canvas.FillRect(Rect(0, 0, 1024, 1024));
 Canvas.StretchDraw(Rect(0, 0, 64, 64), b);
 FillChar(Info, sizeOf(Info), 0);
 Info.bmiHeader.biSize := sizeOf(Info);
 GetDiBits(B.Canvas.Handle, B.Handle, 0, b.Height, nil, Info, DIB_RGB_COLORS);
 SetLength(Data, info.bmiHeader.biSizeImage);
//или ((ширина*BPP) округлить вверх до кратного 4)*высота
 GetDiBits(B.Canvas.Handle, B.Handle, 0, b.Height, @Data[0], Info, DIB_RGB_COLORS);
 Memo1.Lines.Add(Format('%d %d %d',
   [Cnt, GetBValue(b.Canvas.Brush.Color), Data[0]]));
 Inc(Cnt);
 if Cnt = 1000 then Timer1.Enabled := False;
end;


WondeRu   (2004-06-18 14:29:00) [5]

исправил
Bitmap.PixelFormat := pf32bit;
на
Bitmap.PixelFormat := pf24bit;
не помогло! те же траблы!


MBo   (2004-06-18 14:21:00) [6]

>здесь все пучком! 3 байта на точку!
а здесь - 4 байта:
Bitmap.PixelFormat := pf32bit;


WondeRu   (2004-06-18 14:14:00) [7]

>как согласуются?
здесь все пучком! 3 байта на точку!


WondeRu   (2004-06-18 13:25:00) [8]

>как согласуются?
нормально (наверно)
>может, попробовать вызывать GetDIBits c nil сначала для корректного заполнения BitmapInfo?
не хочет он заполнять почему-то, все в нулях(((


MBo   (2004-06-18 13:20:00) [9]

Bitmap.PixelFormat := pf32bit;
и
biBitCount    := 24;
как согласуются?

> @Data[tmp],
почему используется не нулевой элемент?

может, попробовать вызывать GetDIBits c nil сначала для корректного заполнения BitmapInfo?


WondeRu   (2004-06-18 13:11:00) [10]

ошибка происходит не сразу, а где-то после 20-й загрузки текстуры!


WondeRu   (2004-06-18 13:01:00) [11]

[code]
............................
 try
   Bitmap := TBitmap.Create;
   Bitmap.PixelFormat := pf32bit;

   Bitmap.Width  := 1024;
   Bitmap.Height := 1024;

   SetStretchBltMode(dc, MAXSTRETCHBLTMODE);
 
   if not StretchBlt(Bitmap.Canvas.Handle,     // handle to destination DC
                     0,                        // x-coord of destination upper-left corner
                     0,                        // y-coord of destination upper-left corner
                     Bitmap.Width,             // width of destination rectangle
                     Bitmap.Height,            // height of destination rectangle
                     BitmapTemp.Canvas.Handle, // handle to source DC
                     0,                        // x-coord of source upper-left corner
                     0,                        // x-coord of source upper-left corner
                     BitmapTemp.Width,         // width of source rectangle
                     BitmapTemp.Height,        // height of source rectangle
                     SRCCOPY)                  // raster operation code
     then  ShowError(True,'StretchBlt');

   fxmin := 0;
   fxmax := BitmapTemp.Width;
   fymin := 0;
   fymax := BitmapTemp.Height;

   //MemDC := CreateCompatibleDC(0);
   //GetLastError;

   try
     try
       SetLength(Data, Bitmap.Width * Bitmap.Height * 4);
       GetLastError;
     except
       on e: Exception do
         begin
           OutputDebugString(PChar('TAPlan.PrepareImage1 in uPlanClass with message: ' + e.Message));
           GrEvents.OnError('Ошибка выделения памяти для текстуры');
           Exit;
         end;
     end;

           FillChar (BMInfo, SizeOf(BMInfo), 0);
           with BMinfo.bmiHeader do
             begin
               biSize        := sizeof(TBitmapInfoHeader);
               biBitCount    := 24;
               biWidth       := Bitmap.Width;
               biHeight      := Bitmap.Height;
               biPlanes      := 1;
               biCompression := BI_RGB;

               //SelectObject(HDC, HBITMAP)
               if  GetDIBits (Bitmap.Canvas.Handle,
                              Bitmap.Handle,
                              0,
                              biHeight,
                              @Data[tmp],
                              BMInfo,
                              DIB_RGB_COLORS) = 0
                 then
...................................                    
[/code]


MBo   (2004-06-18 12:20:00) [12]

>Если рамер картинки более 64Кб то она возвращает 0 - ошибку
не сталкивался, все работало нормально

>Что посоветуете?
показать минимальный код, приводящий к ошибке


WondeRu   (2004-06-18 10:03:00) [13]

>MBo ©   (18.06.04 09:41) [1]
угу!
сейчас использую именно ее, но предварительно развиваю битмап на более мелкие фрагменты по 64Кб каждый! Если рамер картинки более 64Кб то она возвращает 0 - ошибку(((( Что посоветуете?


MBo   (2004-06-18 09:41:00) [14]

>GetDIBits не подходит из-за своей глюковатости!
?


Наверх

Титульная страница Поиск, карта сайта Написать письмо