高木様
ご無沙汰しています。
いつもお世話になっています。
MemoryStreamの使い方を詳しく教えて頂きありがとうございます。
MemoryStreamは知りませんでした。
Bitmap.SaveToStream(MemoryStream);
Bitmap.LoadFromStream(MemoryStream);
で、Bitmapを完全に戻せました。
強力ですね。これから活用させて頂きます。
ありがとうございました。
さて、MemoryStreamを以下のように入れてみましたが、
Read側の
System.Move(P^, MemoryStream.Memory^, n);
で、前回同様のエラーが出ました。
色々やってみましたが、解決できませんでした。
高木さんのご指摘
「TBitMap などのオブジェクト型変数を・・・その中身を
渡すようにしてください。」を今回もしている気がします。
やはり、ScanLineを使って、BitMapの中身を65536バイトの配列に
移して共有するようなことをするしかないのでしょうか?
大きな画像では時間がかかり使えません。
------------------------------------------------------
【Write側】
unit Unit1;
interface
uses
Windows, Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls;
type
TForm1 = class(TForm)
Image1: TImage;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
public
end;
var
Form1: TForm1;
Handle1 : THandle;
P : Pointer;
xBmp : TBitMap;
n : Cardinal;
MemoryStream : TMemoryStream;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
MemoryStream := TMemoryStream.Create;
xBmp := TBitmap.Create;
xBmp.LoadFromFile('Lenna.bmp');
Image1.Picture.Assign(xBmp); //確認用
xBmp.SaveToStream(MemoryStream);
n := MemoryStream.Size; //n=196662
Handle1:=CreateFileMapping( $FFFFFFFF, nil, PAGE_READWRITE, 0, n, 'MemoryMap');
if Handle1 = 0 then
raise Exception.Create('マッピングできない');
P := MapViewOfFile(Handle1,FILE_MAP_WRITE,0,0,0);
System.Move(MemoryStream.Memory^, P^, n);
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
MemoryStream.Free;
xBmp.Free;
UnmapViewOfFile(P);
CloseHandle(Handle1);
end;
end.
------------------------------------------------
【Read側】
unit Unit1;
interface
uses
Windows, Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls;
type
TForm1 = class(TForm)
Image1: TImage;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
public
end;
var
Form1: TForm1;
Handle1 : THandle;
P : Pointer;
xBmp : TBitMap;
n : Cardinal;
MemoryStream : TMemoryStream;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
MemoryStream := TMemoryStream.Create;
xBmp := TBitmap.Create;
Handle1 := OpenFileMapping(FILE_MAP_READ,False,'MemoryMap');
if Handle1 =0 then
raise Exception.Create('Error');
P := MapViewOfFile(Handle1,FILE_MAP_READ,0,0,0);
n := 196662; //Writeと同じ値。手抜き
System.Move(P^, MemoryStream.Memory^, n); //ここでエラー
xBmp.LoadFromStream(MemoryStream);
Image1.Picture.Assign(xBmp); //確認用
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
MemoryStream.Free;
xBmp.Free;
UnmapViewOfFile(P);
CloseHandle(Handle1);
end;
end.