Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > TMemoryStream и TBitmap


Автор: k2s 17.4.2005, 01:35
При попытке помещения TBitmap в TMemoryStream выдаёт ошибку:"Access violation..."
Код

procedure TAddInDocForm.OKBtnClick(Sender: TObject);
var
 bmpt: TBitmap;
 bmpts: TMemoryStream;
begin
 with DataModule do
  begin
...
   bmpt := Graphics.TBitmap.Create;
...                          
   bmpts := TMemoryStream.Create;
   bmpts.Clear;
   bmpt.SaveToStream(bmpts);
   FIBQuery.ParamByName('THUMBNAIL').LoadFromStream(bmpts);          
   bmpt.Free;
   bmpts.Free;
...
end;

Если закоментировать строку
Код

   bmpt.SaveToStream(bmpts);
то никакой ошибки не происходит(но есстесственно ничего не происходит)
В чём может быть ошибка?

Автор: Alex 17.4.2005, 10:15
Dот код, который не приводит не к какому AV
Код

var
 bmpt: TBitmap;
 bmpts: TMemoryStream;
begin
  bmpt := Graphics.TBitmap.Create;
  try
    bmpt.LoadFromFile('E:\Bitmaps\XP\FolderAdd.bmp');
    bmpts := TMemoryStream.Create;
    try
      bmpts.Clear;
      bmpt.SaveToStream(bmpts);
      IBQuery1.ParamByName('aaa').LoadFromStream(bmpts, ftGraphic);
    finally
      bmpts.Free;
    end;
  finally
    bmpt.Free;
  end;


Скорей всего, что-то другое приводит к AV в твоем коде. Покажи полностью код процедуры

Автор: k2s 17.4.2005, 13:04
Код
procedure TAddInDocForm.OKBtnClick(Sender: TObject);
var
 bmpb: TBitmap;
 bmpt: TBitmap;
 bmpts: TMemoryStream;
begin
 with IODocsDataModule do           
  begin
   {Добавляются строки в SQL}
  end;
 with IODocsDataModule do
  begin
{Операторы типа FIBQuery.ParamByName('Field').AsString := (Edit.Text);}
      if (bmpb.Width > 67) and (bmpb.Height > 95) then     
       begin                                                    
        bmpb := Graphics.TBitmap.Create;                             
        bmpt := Graphics.TBitmap.Create;                                  
        bmpb.LoadFromFile(OpenPictureDialog.FileName);            
        StretchCool(67,95,bmpb,bmpt); // Функция уменьшает Bitmap из bmpb до 67x95 и помещает его в bmpt
        bmpts := TMemoryStream.Create;
        bmpts.Clear;
        bmpt.SaveToStream(bmpts);
        FIBQuery.ParamByName('THUMBNAIL').LoadFromStream(bmpts);
        bmpb.Free;                                                      
        bmpt.Free;
        bmpts.Free;                                                
       end                                                         
      else                                                           
       begin                                                         
        FIBQuery.ParamByName('THUMBNAIL').LoadFromFile(OpenPictureDialog.FileName);
       end;
     end;
   FIBQuery.ExecQuery;
   FIBTransaction.CommitRetaining;
  end;
 Form.Close;
end;                                                              

Автор: Alex 17.4.2005, 13:28
Уж очень хочется взглянуть на эту StretchCool

Автор: k2s 17.4.2005, 17:50
Код

...
type
 TRGB=record
 r:byte;
 g:byte;
 b:byte;
 end;
 ARGB=array [0..1] of TRGB;
 PARGB=^ARGB;
 PRGB = ^TRGB;
...
procedure StretchCool(Width, Height : integer; var S,D : TBitmap); StdCall
var
  i, j, k, p : Integer;
  p1 : PARGB;
  col, r, g, b, Sheight1 : integer;
  Sh, Sw : Extended;
  Xp : array of PARGB;
begin
 If Width=0 then exit;
 If Height=0 then exit;
 S.PixelFormat:=pf24bit;
 D.PixelFormat:=pf24bit;
 D.Width:=Width;
 D.Height:=Height;
 Sh:=S.height/height;
 Sw:=S.width/width;
 Sheight1:=S.height-1;
 SetLength(Xp,S.height);
 for i:=0 to Sheight1 do
 Xp[i]:=s.ScanLine[i];
 for i:=0 to Height-1 do
 begin
  p1:=D.ScanLine[i];
  for j:=0 to Width-1 do
  begin
   col:=0;
   r:=0;
   g:=0;
   b:=0;
   for k:=Round(Sh*i) to Min(Round(Sh*(i+1))-1,Sheight1) do
   begin
    for p:=Round(Sw*j) to Min(Round(Sw*(j+1))-1,S.Width-1) do
    begin
     inc(col);
     inc(r,Xp[k,p].r);
     inc(g,Xp[k,p].g);
     inc(b,Xp[k,p].b);
    end;
   end;
   if col<>0 then
   begin
    p1[j].r:=r div col;
    p1[j].g:=g div col;
    p1[j].b:=b div col;
   end;
  end;
 end;
end;
...

Импортирую её из DLL
Код

procedure StretchCool(Width, Height : integer; var S,D : TBitmap); StdCall; external 'lib.dll';

Автор: Alex 17.4.2005, 19:40
Стоп!

А что это такое по написано:
Код

if (bmpb.Width > 67) and (bmpb.Height > 95) then     
       begin                                                    
        bmpb := Graphics.TBitmap.Create;                             
        bmpt := Graphics.TBitmap.Create;  


Что за размеры вы проверяете, когда у вас даже объекты еще не созданы. Здесь 100% будет AV.

Автор: k2s 17.4.2005, 20:04
А слона-то я и не приметил... smile

Сделал как надо. Теперь всё работает.

Alex, большое спасибо за помощь!

Автор: Alex 17.4.2005, 21:28
Не за что! smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)