Форум: "Media";
Текущий архив: 2004.09.05;
Скачать: [xml.tar.bz2];
Вниз
auxDIBImageLoadA для TBitmap? (glaux.dll) Найти похожие ветки
← →
WondeRu © (2004-06-18 09:25) [0]Здравствуйте!
У меня проблема: нужно загрузить текстуру не из файла, а из TBitmap! GetDIBits не подходит из-за своей глюковатости!
Может есть функция наподобие auxDIBImageLoadA для TBitmap?
Помогите, плизззз!
Заранее спасибо!
← →
MBo © (2004-06-18 09:41) [1]>GetDIBits не подходит из-за своей глюковатости!
?
← →
WondeRu © (2004-06-18 10:03) [2]>MBo © (18.06.04 09:41) [1]
угу!
сейчас использую именно ее, но предварительно развиваю битмап на более мелкие фрагменты по 64Кб каждый! Если рамер картинки более 64Кб то она возвращает 0 - ошибку(((( Что посоветуете?
← →
MBo © (2004-06-18 12:20) [3]>Если рамер картинки более 64Кб то она возвращает 0 - ошибку
не сталкивался, все работало нормально
>Что посоветуете?
показать минимальный код, приводящий к ошибке
← →
WondeRu © (2004-06-18 13:01) [4][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]
← →
WondeRu © (2004-06-18 13:11) [5]ошибка происходит не сразу, а где-то после 20-й загрузки текстуры!
← →
MBo © (2004-06-18 13:20) [6]Bitmap.PixelFormat := pf32bit;
и
biBitCount := 24;
как согласуются?
> @Data[tmp],
почему используется не нулевой элемент?
может, попробовать вызывать GetDIBits c nil сначала для корректного заполнения BitmapInfo?
← →
WondeRu © (2004-06-18 13:25) [7]>как согласуются?
нормально (наверно)
>может, попробовать вызывать GetDIBits c nil сначала для корректного заполнения BitmapInfo?
не хочет он заполнять почему-то, все в нулях(((
← →
WondeRu © (2004-06-18 14:14) [8]>как согласуются?
здесь все пучком! 3 байта на точку!
← →
MBo © (2004-06-18 14:21) [9]>здесь все пучком! 3 байта на точку!
а здесь - 4 байта:
Bitmap.PixelFormat := pf32bit;
← →
WondeRu © (2004-06-18 14:29) [10]исправил
Bitmap.PixelFormat := pf32bit;
на
Bitmap.PixelFormat := pf24bit;
не помогло! те же траблы!
← →
MBo © (2004-06-18 15:06) [11]
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 15:43) [12]>Info.bmiHeader.biSize := sizeOf(Info);
????
может Info.bmiHeader.biSize := sizeOf(Info.bmiHeader)?
← →
MBo © (2004-06-18 15:55) [13]>может Info.bmiHeader.biSize := sizeOf(Info.bmiHeader)?
да
← →
WondeRu © (2004-06-18 16:43) [14]все равно иногда возникают ошибки!
а может быть трабл, если моя форма находится в ActiveX dll?
Страницы: 1 вся ветка
Форум: "Media";
Текущий архив: 2004.09.05;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.037 c