求,流与variant的相互转换,

lwk_hlj 2003-01-23 08:37:32
如题
...全文
65 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
Billy_Chen28 2003-01-23
  • 打赏
  • 举报
回复
一个例子:

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls,
Forms, Dialogs,jpeg, ExtCtrls, StdCtrls,ActiveX, AxCtrls;
type
TForm1 = class(TForm)
Image1: TImage;
Button2: TButton;
Image2: TImage;
procedure Button2Click(Sender: TObject);
private
procedure StreamToVariant(Stream: TMemoryStream;
var v: OleVariant);
procedure VariantToStream(const v: olevariant;
Stream: TMemoryStream);
procedure JPEGToVariant(aJPEG : TJPEGImage;
var aVariant:OleVariant);
procedure VariantToJPEG(aValue : OleVariant;
var aJPEG:TJPEGImage);
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.VariantToStream (const v : olevariant; Stream : TMemoryStream);
var
p : pointer;
begin
Stream.Position := 0;
Stream.Size := VarArrayHighBound (v, 1) - VarArrayLowBound (v, 1) + 1;
p := VarArrayLock (v);
Stream.Write (p^, Stream.Size);
VarArrayUnlock (v);
Stream.Position := 0;
end;

procedure TForm1.StreamToVariant (Stream : TMemoryStream; var v : OleVariant);
var
p : pointer;
begin
v := VarArrayCreate ([0, Stream.Size - 1], varByte);
p := VarArrayLock (v);
Stream.Position := 0;
Stream.Read (p^, Stream.Size);
VarArrayUnlock (v);
end;

procedure TForm1.JPEGToVariant(aJPEG : TJPEGImage; var aVariant:OleVariant);
var
Stream : TMemoryStream;
begin
try
Stream := TMemoryStream.Create;

aJPEG.Assign(Image1.Picture.Bitmap);
aJPEG.SaveToStream(Stream);

StreamToVariant(Stream, aVariant);
finally
Stream.Free;
end;
end;


procedure TForm1.VariantToJPEG(aValue : OleVariant;var aJPEG:TJPEGImage);
var
Stream : TMemoryStream;
begin
try
Stream := TMemoryStream.Create;

VariantToStream (aValue,Stream);
aJPEG.LoadfromStream(Stream);

finally
VariantClear(aValue);
Stream.free;
end;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
aJPEG :TJPEGImage;
aVariant : OleVariant;
begin
try
aJPEG:=TJPEGImage.Create;

//JPEG To Variant
aJPEG.Assign(Image1.Picture.Bitmap);
JPEGToVariant(aJPEG,aVariant);


//Variant To JPEG
VariantToJPEG(aVariant,aJPEG);
Image2.Picture.assign(aJPEG);
finally
aJPEG.free;
end;
end;

end.
yinmingke 2003-01-23
  • 打赏
  • 举报
回复
注意噢:myBuffer = c语言里面的void * ,至于为什么用Mybuffer^,而不是用myBuffer作为参数,希望你能看看delphi的帮助搞明白
yinmingke 2003-01-23
  • 打赏
  • 举报
回复
//==============================================================================

procedure Ole2Stream(AVariant: OleVariant; var AStream: TMemoryStream);
var
MyBuffer: Pointer;
size: Integer;
begin
AStream.Clear;
AStream.Seek(0, soFromBeginning);
size := VarArrayHighBound(AVariant, 1) + VarArrayLowBound(AVariant, 1) + 1;
MyBuffer := VarArrayLock(AVariant);
AStream.WriteBuffer(MyBuffer^, size);
VarArrayUnlock(AVariant);
end;
//==============================================================================

procedure stream2Ole(AStream: TMemoryStream; var AVariant: OleVariant);
var
MyBuffer: Pointer;
begin
AStream.Seek(0, soFromBeginning);
AVariant := VarArrayCreate([0, AStream.size - 1], VarByte);
MyBuffer := VarArrayLock(AVariant);
AStream.ReadBuffer(MyBuffer^, AStream.size);
VarArrayUnlock(AVariant);
end;
//==============================================================================

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧