关于文件合并与读取 ( 积分: 100 )

  • 主题发起人 主题发起人 semsy
  • 开始时间 开始时间
S

semsy

Unregistered / Unconfirmed
GUEST, unregistred user!
已有两个IMAGE,分别已加载一张图片,如何把它们的图像保存为一个文件,在需要时还可以读取出这两张图片?
 
用流来做;把文件都用流来封装,再加上头和尾标志符;
下次读的时候去解析这个流。
和解析网络协议都是一样的。
 
用Winrar压缩,现成的东西,想用代码操作看它的rar控件台
 
搞不太明白,能不能祥细点?
 
自已顶一下
 
在合并到一个文件时候,在文件头写上第一个文件的长度(转成字符),比如用固定长度10个字节保存这个长度值,读文件的时候,先读这10个字节,转成整型就知道了第一个文件该读多少个字节就结束了,接着就是第2个文件了.我写过一个文件分割和合并的就是这样,用前面8个字节保存文件的后缀,合并后文件改成这个后缀。因为我u盘256M,经常拷贝的文件都大于256,所以就分割了,拷贝多次,然后合并起来
 
把他们编译成资源文件不好吗! 放到dll 里面, 使用资源流来获取. 就可以实现你的要求
 
可以用文件流的方式读写,在写新文件时同时写入文件大小及标识,按此读出来分别写到两个文件中就可以啦
 
我对流操作不怎么懂,能不能提供点代码?
 
我写过一个从文件中提取多张图象的程序,是使用流来处理,你可以参考下。
TCheckImageFile = class(TObject)
private
FRoomSize: Int64;//一副图片固定空间大小10k
FFileStream: TFileStream;//用来存放文件
FList: TObjectList; //用来表示图象对象列表
FFileName: String;
function GetItem(Index: Integer): TJPEGImage;
procedure CopyImageToItem(BeginPosition,AFileSize: Int64);
function GetCount: integer;
protected
procedure DistillImage;//提取图象
public
constructor Create(const FileName: string);
destructor Destroy; override;
property FileName: String read FFileName;
property Count: integer read GetCount;
property Items[index: integer]: TJPEGImage read GetItem;
end;
procedure TCheckImageFile.CopyImageToItem(BeginPosition, AFileSize: Int64);
var
Image: TJPEGImage;
stream: TMemoryStream;
begin
if FFileStream.Position <> BeginPosition then
FFileStream.Seek(BeginPosition,soBeginning);
Image := TJPEGImage.Create;
stream := TMemoryStream.Create;
try
stream.CopyFrom(FFileStream,AFileSize);
stream.Seek(0,soFromBeginning);
Image.LoadFromStream(stream);
FList.Add(Image);
finally
stream.free;
end;
end;

constructor TCheckImageFile.Create(const FileName: string);
begin
FRoomSize := 10 * 1024 ;//10k图象
FFileStream := TFileStream.Create(FileName,fmOpenRead);
//if FFileStream = nil then RaiseError
FList := TObjectList.Create;
DistillImage;
end;

destructor TCheckImageFile.Destroy;
begin
if Assigned(FFileStream) then
FFileStream.Free;
FList.Free;
inherited Destroy;
end;

procedure TCheckImageFile.DistillImage;
var
CheckImage : TCheckImage;
nIndex: integer;
begin
//从文件流中提取出图象,保存到objectlist中
nIndex := 0;
if FFileStream.Size < 1 then exit;
FFileStream.Read(CheckImage,SizeOf(TCheckImage));
while CheckImage.FileSize > 0 do
begin
if CheckImage.FileSize > FRoomSize then
Exception.Create('Image File Size Out of '+ inttostr(FRoomSize));
CopyImageToItem(FFileStream.Position,CheckImage.FileSize-SizeOf(TCheckImage));
Inc(nIndex);
FFileStream.Seek((FRoomSize + SizeOf(TCheckImage)) * nIndex ,soBeginning);
if FFileStream.Position >= FFileStream.Size then break;
FFileStream.Read(CheckImage,SizeOf(TCheckImage));
end;
end;

function TCheckImageFile.GetCount: integer;
begin
result := FList.Count;
end;

function TCheckImageFile.GetItem(Index: Integer): TJPEGImage;
begin
result := nil;
if (Index < 0) or (Index > FList.Count - 1) then
exit;
result := TJPEGImage(FList.Items[Index]);
end;
 
确定只有2个Image吗.
CopyRect 不就2行搞定了吗.
 
同意 那年黄梅花开 兄弟的方法。
 
后退
顶部