如何将一个JPG文件分割成多个固定的文件,原JPG文件大概在2、300M,20000*20000,找了点资料,这样的图片应该需要分段读入和分区显示,不过不知道具体怎么实现,请高手告诉一下,如果解决问题,另送500分哈,谢谢了

解决方案 »

  1.   

    你得研究一下Bitmap文件结构。
      

  2.   

    procedure TForm1.Button1Click(Sender: TObject);
    var Rect1,Rect2,Rect3:TRect;
        bmp:TBitmap;
        w,h:integer;
    begin  bmp:= TBitmap.Create;
      bmp.Assign(Image1.Picture.Graphic);
      w:=Image1.Width ;
      h:=Image1.Height div 3;
      Rect1:=Rect(0,0,w,h);
      Rect2:=Rect(0,h,w,h*2);
      Rect3:=Rect(0,h*2,w,h*3);
      with Image2 do
         begin
           Height:=h;
           Width:=w;
           Canvas.CopyRect(Rect1,bmp.Canvas,Rect1);
         end;
      with Image3 do
        begin
          Height:=h;
          Width:=w;
          Canvas.CopyRect(Rect1,bmp.Canvas,Rect2);
        end;
      with Image4 do
        begin
          Height:=h;
          Width:=w;
          Canvas.CopyRect(Rect1,bmp.Canvas,Rect3);
        end;
        bmp.Free;
    end;这是分成3个的,实现你的功能估计还需要自己加代码
      

  3.   

    [email protected],楼上的兄弟,谢了
      

  4.   

    主要是当一个很大的JPG读入的时候,如果是BMP,我还可以分段读取,分片显示,但是文件如果是JPG怎么办?可以分段读入JPG,然后解压不?
      

  5.   


    可以将JPG对象装入BMP对象处理你的图像20000*20000,图像的尺寸不会太大吧,所以2、300M,写错了吧
      

  6.   

    下面的代码可以实现分割:unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ExtCtrls, StdCtrls;type
      TForm1 = class(TForm)
        Button1: TButton;
        Image1: TImage;
        Image2: TImage;
        Image3: TImage;
        Image4: TImage;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
      var   Rect1,Rect2,Rect3:TRect;   
              bmp:TBitmap;   
              w,h:integer;
    begin
        
          bmp:=   TBitmap.Create;
          bmp.Assign(Image1.Picture.Graphic);   
          w:=Image1.Width   ;   
          h:=Image1.Height   div   3;   
          Rect1:=Rect(0,0,w,h);
          Rect2:=Rect(0,h,w,h*2);   
          Rect3:=Rect(0,h*2,w,h*3);
          with   Image2   do   
                begin   
                    Height:=h;   
                    Width:=w;   
                    Canvas.CopyRect(Rect1,bmp.Canvas,Rect1);   
                end;   
          with   Image3   do   
              begin   
                  Height:=h;   
                  Width:=w;   
                  Canvas.CopyRect(Rect1,bmp.Canvas,Rect2);   
              end;   
          with   Image4   do   
              begin   
                  Height:=h;   
                  Width:=w;   
                  Canvas.CopyRect(Rect1,bmp.Canvas,Rect3);   
              end;   
              bmp.Free;
    end;end.已经将整个工程打包发到你的信箱[email protected]中了!
      

  7.   

    20000*20000,如果还原成Bitmap (24-bit color),将有1.2G大小,很多电脑不能提供这么多内存。
    鉴于以上原因,11楼的代码,应该算是有问题的
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
      Dialogs, ExtCtrls, StdCtrls, Jpeg;type
      TForm1 = class(TForm)
        Button1: TButton;
        Image1: TImage;
        Image2: TImage;
        Image3: TImage;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}
    procedure TForm1.Button1Click(Sender: TObject);
    var
      JPGpic: TJpegImage;
      Bmp: TBitmap;
      y, h:integer;
    begin
      JPGpic := TJpegImage.Create();
      JPGpic.LoadFromFile('D:\未命名.JPG');
      Bmp := TBitmap.Create();
      Bmp.Width := JPGpic.Width;
      h := JPGpic.Height  div  3;
      Bmp.Height := h;
      y := 0;
      with Image1 do
      begin
        Height:=Bmp.Height;
        Width:=Bmp.Width;
        Bmp.Canvas.Draw(0, y, JPGpic);
        Picture.Assign(Bmp);
      end;
      Dec(y, h);
      with Image2 do
      begin
        Height:=Bmp.Height;
        Width:=Bmp.Width;
        Bmp.Canvas.Draw(0, y, JPGpic);
        Picture.Assign(Bmp);
      end;
      Dec(y, h);
      with Image3 do
      begin
        Height:=Bmp.Height;
        Width:=Bmp.Width;
        Bmp.Canvas.Draw(0, y, JPGpic);
        Picture.Assign(Bmp);
      end;  Bmp.Free();
    end;end.
      

  8.   

    如果使用opencv的话效果会更好一些,速度上也有提升,不过如果是delphi使用的话你需要自己写一个dll来操作opencv然后你的delphi再调用这个dll,opencv 是intel的视觉库sourceforge上有下载,论坛你可以去阿须论坛
    cvSetImageROI( input, inputRect );
    cvSetImageROI( output, outputRect );
    cvResize( input, output ,CV_INTER_AREA);
      

  9.   

    分割图片还是文件???
    可以直接装载到BMP上操作的,没搞清楚
      

  10.   

    分割从来不是问题,但要分段读取的话楼主你恐怕要伤脑筋了。你可以下载PasJPEG的源代码(其实就是Delphi自带的那个,只不过Borland没有给你源代码),里头其实是翻译的IJG的C代码,有很多底层API。但要搞清楚这些API的用途恐怕不是一件简单的事情。