Fórum Converter Bitmap para Memory Mapped File #298200
03/10/2005
0
Estou com um problemasso em uma de minhas aplicações. Tenho um componente integrado com minha aplicação que faz algumas manipulações em várias imagens. (Converter cores, trocar cores, etc).
mas este componente é um aplicativo externo, chamado através de uma DLL.
Quando tenho um arquivo gravado no disco, consigo executar normalmente o programa e gravar os dados no arquivo, mas o que quero fazer é passar a imagem diretamente da memória, armazenada em um TBitmap para o programa.
Quando trabalhando com memória, o programa exige que se passe o handle do bitmap, mas quando eu passo o bitmap.handle ele me informa que falou ao duplicar o Handle da imagem. O desenvolvedor me informou que a única maneira de enviar este handle seria enviando o handle de um memory mapped file.
Como faço para transformar o meu bitmap para memory mapped file.
Alguem tem alguma idéia?
Muito obrigado.
Prgdelphi
Curtir tópico
+ 0Posts
03/10/2005
Siam
Gostei + 0
03/10/2005
Prgdelphi
Pelo que li nas páginas, aparentemente quando você passa o bitmap pra um Memory-mapped file, o bmp perde a informação de resolução X e Y. É correto isso?
procedure BitmapToMMF(bmp : Tbitmap); var hMapObj : THandle; // mapped file handle PMapView : PLongInt; // memory region Stream : TmemoryStream; begin hMapObj := CreateFileMapping( $FFFFFFFF, // not a disk file Nil, // attributes PAGE_READWRITE, // read and write 0, // SizeOf(DWORD), // size ´shared_memory´); // "name" if hMapObj = 0 Then begin ShowMessage(´MapFileError´); // Error, exit end; Stream := TMemoryStream.Create; bmp.SaveToStream(Stream); GetMem(PMapView,Stream.Size); // allocate memory // // Get address of the region // PMapView := (MapViewOfFile(hMapObj, FILE_MAP_WRITE, 0, 0, 0)); stream.Position := 0; stream.Read(PMapView,stream.Size); //PMapView^ := 1 SHL 8 + 2; //Exemplo jogando valores para o mmf UnmapViewOfFile(PMapView); // free memory CloseHandle(hMapObj); // close "file" FreeAndNil(Stream); end
Este é apenas um procedimento de teste. Não está funcionando. Alguém tem alguma dica?
Siam, você disse que posso passar através do SendMessage, poderia me dar um exemplo?
Muito obrigado.[/code]
Gostei + 0
03/10/2005
Siam
var CDS:CopyDataStruct; MS:TMemoryStream; begin MS := TMemoryStream.Create; Bitmap.SaveToStream(MS); CDS.dwData := 0; CDS.cbData := MS.Size; CDS.lpData := MS.Memory; SendMessage(Handle_do_Destino, WM_CopyData, 0, lParam(@CDS)); MS.Free;
var pCDS:pCopyDataStruct; MS:TMemoryStream; begin MS := TMemoryStream.Create; pCDS := pCopyDataStruct(Msg.LParam); MS.SetSize(pCDS^.cbData); Move(pCDS^.lpData^, MS.Memory^, MS.Size); Bitmap.LoadFromStream(MS); MS.Free;
Gostei + 0
03/10/2005
Siam
procedure Recebendo_Bitmap(var Msg:TMessage); message WM_COPYDATA;
Gostei + 0
04/10/2005
Prgdelphi
Fiz da seguinte maneira e aparentemente funcionou:
procedure BitmapToMMF(bmp : Tbitmap); var hMapObj : THandle; // mapped file handle PMapView : Pointer; // memory region Stream : TmemoryStream; begin Stream := TMemoryStream.Create; bmp.SaveToStream(Stream); hMapObj := CreateFileMapping( $FFFFFFFF, // not a disk file Nil, // attributes PAGE_READWRITE, // read and write 0, // stream.size, // size ´shared_memory´); // "name" if hMapObj = 0 Then begin ShowMessage(´MapFileError´); // Error, exit end; PMapView := (MapViewOfFile(hMapObj, FILE_MAP_WRITE, 0, 0, stream.size)); stream.Position := 0; stream.Read(PMapView,stream.Size); UnmapViewOfFile(PMapView); // free memory CloseHandle(hMapObj); // close "file" FreeAndNil(Stream); end;
A dll recebeu a imagem, mas ainda me retornou que devo passar no formado DIB.
Alguém tem alguma idéia de como transformo o bitmap para DIB e gravar na stream para fazer este procedimento?
Obrigado pela ajuda.
Gostei + 0
04/10/2005
Siam
Nunca criei bitmaps DI, mas dê uma olhada na função CreateDIBSection
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)