你把内存流转为String是比较危险的(数据有可能被delphi处理,delphi增加长度和引用次数据),建议使用arrayofchar; 还有,操作时不要用内存流,我觉得应该使用字段流如下: var SStream:TBlobStream; begin SSTream:=TBlobStream.Create(TBlobField(query1.FieldByName('image')), bmRead) 你把这两点改了,在试试。
刚才写的是array of char,空格忘写了。
我做了这样一个实验,图片还是显示不出来!问题出字哪儿?var Temp,mStream:TMemoryStream; str:array[0..2101] of char; size:integer; begin mStream:=TMemoryStream.Create ; mStream.LoadFromFile('MS.bmp'); size:=mStream.Size ; mStream.Read(str,size); mStream.Free;
strFirst,strLast:string;
sStream:TMemoryStream;
begin
sStream:=TMemoryStream.create;
ADOTable1.open;
TBlobField(ADOTable1.fieldbyname('Graphic')).SavetoStream(sStream);
setlength(strFirst,sStream.size);
sStream.Read(strFirst[1],sStream.size);
strLast:=EncodeString(strFirst);//这是Delphi自带EncdDecd.pas文件
//里的编码函数。
// 下面就是将strLast字符串加入到XML文件里相应接点里
sStream.free;end;
下面代码将从XML文件里读出的字符串解码后存为BMP文件:var
strFirst,strLast:string;
sStream:TMemoryStream;
begin
//从XML里读出存储图片数据的字符串得到strFirst:
strLast:=DecodeString(strFirst);
sStream:=TMemoryStream.create;
sSTream.Write(strLast,length(strLast));
sSTream.SaveToFile('Test.bmp');
sStream.free;end;但是,当我企图打开Test.bmp 时,却报错说,文件格式不对或者不完全。
请问,问题出在哪儿?紧急!
还有,操作时不要用内存流,我觉得应该使用字段流如下:
var
SStream:TBlobStream;
begin
SSTream:=TBlobStream.Create(TBlobField(query1.FieldByName('image')), bmRead)
你把这两点改了,在试试。
Temp,mStream:TMemoryStream;
str:array[0..2101] of char;
size:integer;
begin
mStream:=TMemoryStream.Create ;
mStream.LoadFromFile('MS.bmp');
size:=mStream.Size ;
mStream.Read(str,size);
mStream.Free;
Temp:=TMemoryStream.Create ;
Temp.Write(str,size);
Image1.Picture.Bitmap.LoadFromStream(Temp);
Image1.Visible :=true;
Temp.Free;
end;请高手指点!谢谢!
Temp,mStream:TMemoryStream;
str:array[0..2101] of char;
size:integer;
begin
mStream:=TMemoryStream.Create ;
mStream.LoadFromFile('MS.bmp');
size:=mStream.Size ;
mStream.Read(str,size);
mStream.Free;
Temp:=TMemoryStream.Create ;
Temp.Write(str,size);
Image1.Picture.Bitmap.LoadFromStream(Temp);
Image1.Visible :=true;
Temp.Free;
end;请高手指点!谢谢!
高手帮忙!
一个TBlobField的内容转化为XML的 CDATA 节点的内容。如果需要全部源代码,请mail我。[email protected]请特别关注 MimeEncodeString 函数
-----------------------------------------------------------------
Procedure TXMLDataset.SaveToStream(AStream: TStream);
Var
Stream1: TStream;
Procedure StringToStream(AString: String);
Begin
Stream1.Write(PChar(AString)^, Length(AString));
End; Procedure LocalMimeEncodeNoCRLF(Const AInputBuffer; Const AInputByteCount: Cardinal; Out AOutputBuffer); //rjMime
Var
InValue1: Cardinal;
OuterLimit1: Cardinal;
InPointer1: PByte;
InnerLimit1: PByte;
OutPointer1: TPMimeByte4;
Begin
If AInputByteCount = 0 Then Exit;
InPointer1 := @AInputBuffer;
OutPointer1 := @AOutputBuffer; OuterLimit1 := AInputByteCount Div 3 * 3; InnerLimit1 := @AInputBuffer;
Inc(Cardinal(InnerLimit1), OuterLimit1); { Last line loop. }
While InPointer1 <> InnerLimit1 Do Begin
{ Read 3 bytes from AInputBuffer. }
InValue1 := InPointer1^;
InValue1 := InValue1 Shl 8;
Inc(InPointer1);
InValue1 := InValue1 Or InPointer1^;
InValue1 := InValue1 Shl 8;
Inc(InPointer1);
InValue1 := InValue1 Or InPointer1^;
Inc(InPointer1);
{ Write 4 bytes to AOutputBuffer (in reverse order). }
OutPointer1^.b4 := MIME_ENCODE_TABLE[InValue1 And $3F];
InValue1 := InValue1 Shr 6;
OutPointer1^.b3 := MIME_ENCODE_TABLE[InValue1 And $3F];
InValue1 := InValue1 Shr 6;
OutPointer1^.b2 := MIME_ENCODE_TABLE[InValue1 And $3F];
InValue1 := InValue1 Shr 6;
OutPointer1^.b1 := MIME_ENCODE_TABLE[InValue1];
Inc(OutPointer1);
End; { End of data & padding. }
Case AInputByteCount - OuterLimit1 Of
1: Begin
InValue1 := InPointer1^;
InValue1 := InValue1 Shl 4;
OutPointer1.b2 := MIME_ENCODE_TABLE[InValue1 And $3F];
InValue1 := InValue1 Shr 6;
OutPointer1.b1 := MIME_ENCODE_TABLE[InValue1];
OutPointer1.b3 := MIME_PAD_CHAR; { Pad remaining 2 bytes. }
OutPointer1.b4 := MIME_PAD_CHAR;
End;
2: Begin
InValue1 := InPointer1^;
Inc(InPointer1);
InValue1 := InValue1 Shl 8;
InValue1 := InValue1 Or InPointer1^;
InValue1 := InValue1 Shl 2;
OutPointer1.b3 := MIME_ENCODE_TABLE[InValue1 And $3F];
InValue1 := InValue1 Shr 6;
OutPointer1.b2 := MIME_ENCODE_TABLE[InValue1 And $3F];
InValue1 := InValue1 Shr 6;
OutPointer1.b1 := MIME_ENCODE_TABLE[InValue1];
OutPointer1.b4 := MIME_PAD_CHAR; { Pad remaining byte. }
End;
End;
End; Procedure LocalMimeEncodeFullLines(Const AInputBuffer; Const AInputByteCount: Cardinal; Out AOutputBuffer); //rjMime
Var
InValue1: Cardinal;
OuterLimit1: Cardinal;
InnerLimit1: PByte;
InPointer1: PByte;
OutPointer1: TPMimeByte4;
Begin
If AInputByteCount = 0 Then Exit;
InPointer1 := @AInputBuffer;
OutPointer1 := @AOutputBuffer; InnerLimit1 := InPointer1;
Inc(Cardinal(InnerLimit1), MIME_DECODED_LINE_BREAK); OuterLimit1 := Cardinal(InPointer1);
Inc(OuterLimit1, AInputByteCount);
While InPointer1 <> InnerLimit1 Do Begin
{ Read 3 bytes from AInputBuffer. }
InValue1 := InPointer1^;
InValue1 := InValue1 Shl 8;
Inc(InPointer1);
InValue1 := InValue1 Or InPointer1^;
InValue1 := InValue1 Shl 8;
Inc(InPointer1);
InValue1 := InValue1 Or InPointer1^;
Inc(InPointer1);
{ Write 4 bytes to AOutputBuffer (in reverse order). }
OutPointer1^.b4 := MIME_ENCODE_TABLE[InValue1 And $3F];
InValue1 := InValue1 Shr 6;
OutPointer1^.b3 := MIME_ENCODE_TABLE[InValue1 And $3F];
InValue1 := InValue1 Shr 6;
OutPointer1^.b2 := MIME_ENCODE_TABLE[InValue1 And $3F];
InValue1 := InValue1 Shr 6;
OutPointer1^.b1 := MIME_ENCODE_TABLE[InValue1];
Inc(OutPointer1);
End;
{ Write line break (CRLF). }
OutPointer1^.b1 := 13;
OutPointer1^.b2 := 10;
Inc(Cardinal(OutPointer1), 2);
Inc(InnerLimit1, MIME_DECODED_LINE_BREAK);
End;
End; Procedure LocalMimeEncode(Const AInputBuffer; Const AInputByteCount: Cardinal; Out AOutputBuffer); //rjMime
Var
IDelta, ODelta: Cardinal;
Begin
LocalMimeEncodeFullLines(AInputBuffer, AInputByteCount, AOutputBuffer);
IDelta := AInputByteCount Div MIME_DECODED_LINE_BREAK; // Number of lines processed so far.
ODelta := IDelta * (MIME_ENCODED_LINE_BREAK + 2);
IDelta := IDelta * MIME_DECODED_LINE_BREAK;
LocalMimeEncodeNoCRLF(Pointer(Cardinal(@AInputBuffer) + IDelta)^, AInputByteCount - IDelta, Pointer(Cardinal(@AOutputBuffer) + ODelta)^);
End;{$IFDEF HUMAN_READABLE}
Function MimeEncodeString(Const AInputString: AnsiString): AnsiString; //rjMime
Procedure MimeEncodedSize(Const AValue: Cardinal; Out AResult: Cardinal); //rjMime
Begin
AResult := (AValue + 2) Div 3 * 4 + (AValue - 1) Div MIME_DECODED_LINE_BREAK * 2;
End;
Var
Value1: Cardinal;
Size1: Cardinal;
Begin
If Pointer(AInputString) <> Nil Then Begin
Value1 := Cardinal(Pointer(Cardinal(AInputString) - 4)^);
MimeEncodedSize(Value1, Size1);
SetLength(Result, Size1);
LocalMimeEncode(Pointer(AInputString)^, Value1, Pointer(Result)^);
End Else Result := '';
End;
{$ELSE}
Function MimeEncodeString(Const s: AnsiString): AnsiString;
Function MimeEncodedSizeNoCRLF(Const i: Cardinal): Cardinal;
Begin
Result := (i + 2) Div 3 * 4;
End;
Var
l: Cardinal;
Begin
Result := '';
If Pointer(s) <> Nil Then Begin
l := Cardinal(Pointer(Cardinal(s) - 4)^);
SetLength(Result, MimeEncodedSizeNoCRLF(l));
LocalMimeEncodeNoCRLF(Pointer(s)^, l, Pointer(Result)^);
End;
End;
{$ENDIF} Procedure PutEscapeChars(Const AInput: AnsiString; Out AOutput: AnsiString; Const AIgnoreSemicolon: Boolean);
Var
InputIndex1: Integer;
OutputIndex1: Integer;
InputLength1: Integer;
Begin
End; Function WithEscapeChars(Const AInput: AnsiString; Const AIgnoreSemicolon: Boolean): AnsiString;
Begin
PutEscapeChars(AInput, Result, AIgnoreSemicolon);
End; Procedure WriteXMLProperties;
Var
Encoding1: AnsiString;
Begin
Encoding1 := Trim(XMLEncodingToString(FEncoding));
If Encoding1 <> '' Then Begin
StringToStream(XML_BEGIN + SPACE_CHAR +
VERSION_LABEL + EQUAL_CHAR + QUOTE_CHAR + XMLVERSIONNO_LABEL + QUOTE_CHAR + SPACE_CHAR +
ENCODING_LABEL + EQUAL_CHAR + QUOTE_CHAR + Encoding1 + QUOTE_CHAR + SPACE_CHAR +
STANDALONE_LABEL + EQUAL_CHAR + QUOTE_CHAR + BooleanToYesNo(doStandAlone In FOptions) + QUOTE_CHAR + XML_END + CRLF_CHARS);
End Else Begin {If no encoding is given we do not place an encoding parameter in the header. Works better with some browsers}
StringToStream(XML_BEGIN + SPACE_CHAR +
VERSION_LABEL + EQUAL_CHAR + QUOTE_CHAR + XMLVERSIONNO_LABEL + QUOTE_CHAR + SPACE_CHAR +
STANDALONE_LABEL + EQUAL_CHAR + QUOTE_CHAR + BooleanToYesNo(doStandAlone In FOptions) + QUOTE_CHAR + XML_END + CRLF_CHARS);
End;
End; Procedure WriteGlobalSettings;
Begin
End;
End;