现在想把多张JPG格式的图片保存到一个文件中,当使用时再通过这个文件一张张读出来,请教高手怎么做,最好有例子或者网上有现成的源码,不行的话给个思路也行

解决方案 »

  1.   

    先将jpg文件读到TJpegImage对象,转成bmp格式再用TBitmap对象的Canvans.Draw来合并,最后再转回jpg格式
      

  2.   

    那应该不是合并的问题的吧
    不是简单的保存图片和读图片的问题的吗?
    savetofile,loadfromfile就行了哦
      

  3.   

    把这些文件当成资源写入dll或者exe中
    可以看看我的blog
    http://blog.csdn.net/ccdarkness/archive/2005/11/22/534324.aspx
      

  4.   

    仔细看了ccdarkness(亲亲我的宝贝)的blog中文章
    感觉还是没有达到目的
    因为合并图片后的文件是个独立的文件,可以通过程序来读取出来,不能把图片作为资源文件保存在Exe中,如果这样就不能被外部的程序识别了.
      

  5.   

    可以把图片放到dll中嘛,dll是一个独立的文件,这样用外部程序去读取dll中的图片
    把图片放到dll和放到exe是一个道理从dll读取图片有个例子,还有一个非常详细的
    http://www.delphifans.com/SoftView/SoftView_2422.htmlvar  
        resStream:   TResourceStream;  
        hinst:   THandle;  
        jpg:   TJPEGImage;  
      begin  
              hinst   :=   LoadLibrary(PChar(AppPath   +   'mainRes.dll'));  
       
              if   hinst   <>   0   then  
              begin  
                      if   screen.Width   >   800   then  
                              resStream   :=   TResourceStream.Create(hinst,'mainbk768','JPEG')  
                      else  
                              resStream   :=   TResourceStream.Create(hinst,'mainbk600','JPEG');    
                      try  
                              jpg   :=   TJpegImage.Create;  
                              try  
                                      jpg.LoadFromStream(resStream);  
                                      img_bk.Picture.Assign(jpg);    
                              finally  
                                      jpg.Free;  
                              end;  
                      finally  
                              resStream.Free;  
                      end;  
                      FreeLibrary(hinst);  
              end;
      

  6.   

    做成资源文件,或者存放在数据库里头。Example: 
    资源定义 RC 文件格式NoSound ICO NoSound.ico
    Tick ICO Tick.ico
    Tick32 ICO Tick32.icoMainFrame JPG MainFrame.jpg
    Call JPG Call.jpg
    Management JPG Management.jpg...
    var
      Stream: TStream;
      Jpeg: TJpegImage;
    begin
      Stream := TResourceStream.Create(HInstance, ResName, PChar('JPG'));
      Jpeg := TJpegImage.Create;
      try
        Jpeg.LoadFromStream(Stream);
        Image.Canvas.StretchDraw(Rect(0,0,Image.Width,Image.Height),Jpeg);
      finally
        Jpeg.Free;
        Stream.Free;
      end;
    end;
      

  7.   

    unit BuildUnit;interfaceuses
      Windows, Classes, SysUtils, zlib, ConstUnit;Type
      TBuild = Class
        private
          MyFH: LongWord;
          procedure PP(Sender: TObject);
          function ZIP(mInputStream: TMemoryStream; mOutputStream: TMemoryStream;
            Compress: boolean; Var Count: integer): boolean;
        public
          constructor Create(FH: LongWord); overload;
        published
          function BuidPkg(FilePath: string): boolean;
          function DectPkg(FilePath: string): boolean;
      end;implementationconstructor TBuild.Create(FH: LongWord);
    begin
      inherited Create;
      MyFH := FH;
    end;function DirExists(Name: string): Boolean;   
      {$IFDEF   WIN32}   
      var   
        Code: Integer;
      begin   
        Code := GetFileAttributes(PChar(Name));
        Result := (Code<>-1) and (FILE_ATTRIBUTE_DIRECTORY and Code <> 0);
      end;   
      {$ELSE}   
      var   
        SR: TSearchRec;
      begin   
        if Name[Length(Name)] = '\' then
          Dec(Name[0]);
        if (Length(Name) = 2) and (Name[2]= ':') then
          Name := Name + '\*.*';
        Result := FindFirst(Name,   faDirectory,   SR) = 0;
        Result := Result and (SR.Attr and faDirectory <> 0);
      end;   
      {$ENDIF}procedure TBuild.PP(Sender: TObject);
    begin
      SendMessage(MYFH,PBM_MYSTEPIT,0,0);
    end;function TBuild.ZIP(mInputStream: TMemoryStream; mOutputStream: TMemoryStream;
      Compress: boolean; Var Count: integer): boolean;
    var
      p: Pchar;
      TCS: TCompressionStream;
      TDS: TDecompressionStream;
    begin
      Result := false;
      if not (Assigned(mInputStream) and Assigned(mOutputStream)) then
        exit;
      mOutputStream.Clear;
      if Compress then  //其中的clMax表示压缩级别,可以更改,值是下列参数之一:clNone, clFastest, clDefault, clMax
      begin
        TCS := TCompressionStream.Create(clMax,mOutputStream);
        TCS.OnProgress := PP;
      end
      else
      begin
        TDS := TDecompressionStream.Create(mInputStream);
        TDS.OnProgress := PP;
      end;
      GetMem(p,Count);
      try
        if Compress then
        begin
          mInputStream.ReadBuffer(p^,Count);
          TCS.WriteBuffer(p^,Count);
        end
        else
        begin
          mInputStream.ReadBuffer(p^,mInputStream.Size);      //-SizeOf(Count)
          TDS.ReadBuffer(p^,Count); 
          mOutputStream.WriteBuffer(p^,Count);
          mOutputStream.Position := 0;
        end;
      finally
        FreeMem(p,Count);
        if Compress then
          TCS.Free
        else
          TDS.Free;
      end;
      Result := true;
    end;function TBuild.BuidPkg(FilePath: string): boolean;
    var
      fsInStream,fsOutStream: TMemoryStream;
      TmpStream: TMemoryStream;
      Count: integer;
      FN: Pchar;
      SearchResult : TSearchRec;
    begin
      Result := false;
      if not DirExists(FilePath) then
        exit;
      if FilePath[length(FilePath)] <> '\' then
        FilePath := FilePath + '\';
      fsInStream := TMemoryStream.Create;
      fsOutStream := TMemoryStream.Create;
      TmpStream := TMemoryStream.Create;
      try
        if FindFirst(FilePath+'*.mdb', faAnyFile, SearchResult) = 0 then
        begin
          repeat
            fsInStream.Clear;
            fsInStream.LoadFromFile(FilePath + SearchResult.Name);
            Count := fsInStream.Size;
            if Count = 0 then
              continue;        
            //压缩文件
            ZIP(fsInStream,fsOutStream,true,Count);
            //写入文件名称长度
            Count := length(SearchResult.Name)+1;
            TmpStream.WriteBuffer(Count,sizeof(Count));
            //写入文件名称
            GetMem(FN,Count);
            StrCopy(FN,PChar(SearchResult.Name));
            TmpStream.WriteBuffer(FN^,Count);
            FreeMem(FN,Count);
            //写入原文件长度
            Count := fsInStream.Size;
            TmpStream.WriteBuffer(Count,sizeof(Count));
            //写入压缩文件长度
            Count := fsOutStream.Size;
            TmpStream.WriteBuffer(Count,sizeof(Count));                 
            //写入文件内容
            TmpStream.CopyFrom(fsOutStream,0);
          until FindNext(searchResult) <> 0;
        end;    
        if TmpStream.Size > 0 then
        begin
          if FileExists(FilePath+'Update.xqg') then
            DeleteFile(FilePath+'Update.xqg');
          TmpStream.SaveToFile(FilePath+'Update.xqg');
        end;
      finally
        fsInStream.Free;
        fsOutStream.Free;
        TmpStream.Free;
        FindClose(searchResult);
        PostMessage(MYFH,PBM_MYSETPOS,0,0);
      end;
      Result := true;
    end;function TBuild.DectPkg(FilePath: string): boolean;
    var
      fsInStream,fsOutStream: TMemoryStream;
      TmpStream: TMemoryStream;
      Count,LFn: integer;
      FName: ShortString;
      FN: Pchar;
    begin
      Result := false;
      if FilePath[length(FilePath)] <> '\' then
        FilePath := FilePath + '\';
      if not FileExists(FilePath+'Update.xqg') then
        exit;
      fsInStream := TMemoryStream.Create;
      fsOutStream := TMemoryStream.Create;
      TmpStream := TMemoryStream.Create;
      try
        TmpStream.LoadFromFile(FilePath+'Update.xqg');
        while TmpStream.Position < TmpStream.Size-1 do
        begin
          fsInStream.Clear;
          //获取文件名称长度
          TmpStream.ReadBuffer(LFn,SizeOf(LFn));
          //获取文件名
          GetMem(FN,LFn);
          TmpStream.ReadBuffer(FN^,LFn);
          FName := StrPas(FN);
          FreeMem(FN,LFn);
          //获取原文件长度
          TmpStream.ReadBuffer(Count,SizeOf(Count));
          //获取压缩文件长度
          TmpStream.ReadBuffer(LFn,SizeOf(LFn));
          //获取文件内容
          fsInStream.CopyFrom(TmpStream,LFn);
          fsInStream.Position := 0;
          if not Zip(fsInStream,fsOutStream,false,Count) then
            exit;
          if FileExists(FilePath+FName) then
            DeleteFile(FilePath+FName);
          fsOutStream.SaveToFile(FilePath+FName);
        end;
        fsInStream.Clear;
        fsOutStream.Clear;
        TmpStream.Clear;
      finally
        fsInStream.Free;
        fsOutStream.Free;
        TmpStream.Free;
        PostMessage(MYFH,PBM_MYSETPOS,0,0);
      end;
      Result := true;
    end;
    end.
      

  8.   

    BuidPkg是将一个目录下所有的mdb文件合并成一个文件
    DectPkg是将合并好的文件(Update.xqg),解压到指定目录
    ZIP是用来压缩/解压缩的,爱用不用都可以。
    MyFH: LongWord 是进度条的句柄,爱用不用。
      

  9.   

    const
      WM_MYUSER = $0400;
      PBM_MYSETPOS = WM_MYUSER+2;
      PBM_MYSTEPIT = WM_MYUSER + 5;
      PBM_SETRANGE32 = WM_MYUSER + 6;