现在要处理JPG图像的分辨率,要做以下几步工作:
  1.将导入在Image中的JPG图像截取某一部分,
  2.将截取的图像以96的分辨率保存下来.
请高手指教如何实现?

解决方案 »

  1.   

    偶只知道如何切图。
    a定义要切图的范围,左上,到右下位置,图片会复制到Image2中。a:TRect;Image2.Picture.Bitmap.Width:=a.Right-a.Left;
    Image2.Picture.Bitmap.Height:=a.Bottom-a.top;
    SetStretchBltMode(Image2.Picture.Bitmap.Canvas.Handle, COLORONCOLOR);
    Image2.Canvas.CopyRect(rect(0,0,a.Right-a.Left,a.Bottom-a.top)
    ,image1.Picture.Bitmap.Canvas,a);
      

  2.   

    上面的例子中Image2事先要先读入一个图片,否则会出错
      

  3.   

    to getit911:   切图我也知道,用Canvas.CopyRect,现在问题是这样:1.Canvas.CopyRect对JPG图像并不可以操作,
    2.有人可能会说,把JPG图像转成BMP图像不就可以了吗,但是有个问题,就是当把JPG图像转为BMP图像时,其分辨率也发生了改变,好像都为72DPI(可以在PhotoShop中看到这个分辨率)!  所以我才提问,如何可以对JPG图像直接操作的!有没有别的方法?Dear all:  帮帮忙!
      

  4.   

    1、用PicShow控件。
    2、用这个方法读Jpeg图片。
    var
    ti:Timage;
    begin
    ti:=Timage.Create(self);
    ti.Visible:=false;
    if OpenPictureDialog1.Execute then
    begin
    ti.Picture.LoadFromFile(OpenPictureDialog1.FileName);
    end;
    image1.Picture.Bitmap.Assign(ti.Picture.Graphic);
    ti.Free;
    end;
      

  5.   

    看下是不是你要的??
    get/set JPG resolution?  procedure GetResJpg(JPGFile: string); 
    const 
      BufferSize = 50; 
    var 
      Buffer: string; 
      Index: integer; 
      FileStream: TFileStream; 
      HorzRes, VertRes: Word; 
      DP: Byte; 
      Measure: string; 
    begin 
      FileStream := TFileStream.Create(JPGFile, 
        fmOpenReadWrite); 
      try 
        SetLength(Buffer, BufferSize); 
        FileStream.Read(buffer[1], BufferSize); 
        Index := Pos('JFIF' + #$00, buffer); 
        if Index > 0 then 
        begin 
          FileStream.Seek(Index + 6, soFromBeginning); 
          FileStream.Read(DP, 1); 
          case DP of 
            1: Measure := 'DPI'; //Dots Per Inch 
            2: Measure := 'DPC'; //Dots Per Cm. 
          end; 
          FileStream.Read(HorzRes, 2); // x axis 
          HorzRes := Swap(HorzRes); 
          FileStream.Read(VertRes, 2); // y axis 
          VertRes := Swap(VertRes); 
        end 
      finally 
        FileStream.Free; 
      end; 
    end; procedure SetResJpg(name: string; dpix, dpiy: Integer); 
    const 
      BufferSize = 50; 
      DPI = 1; //inch 
      DPC = 2; //cm 
    var 
      Buffer: string; 
      index: INTEGER; 
      FileStream: TFileStream; 
      xResolution: WORD; 
      yResolution: WORD; 
      _type: Byte; 
    begin 
      FileStream := TFileStream.Create(name, 
        fmOpenReadWrite); 
      try 
        SetLength(Buffer, BufferSize); 
        FileStream.Read(buffer[1], BufferSize); 
        index := POS('JFIF' + #$00, buffer); 
        if index > 0 
          then begin 
          FileStream.Seek(index + 6, soFromBeginning); 
          _type := DPI; 
          FileStream.write(_type, 1); 
          xresolution := swap(dpix); 
          FileStream.write(xresolution, 2); 
          yresolution := swap(dpiy); 
          FileStream.write(yresolution, 2); 
        end 
      finally 
        FileStream.Free; 
      end; 
    end; 
      

  6.   

    To aiirii(ari-爱的眼睛):
    收藏你的代码,谢谢~!
      

  7.   

    aiirii好像还有一篇800*600缩放的贴子,我好像拜读过.
      

  8.   

    To aiirii(ari-爱的眼睛):
    我想获得JPG图片的分辨率,该怎么去做我看了你的代码还不是很明白!!!
      

  9.   

    是啊!我也不太看得懂aiirii大哥的代码,能不能帮我们解释一下!Dear all:   如何对JPG图像进行复制,因为JPG图像无法用CopyRect进行复制,而将JPG图像转为BMP图像的话,分辨丢失了(都变为了72DPI),这样的话是不允许的,有没有办法在转为BMP时不丢失分辨率?或者直接有对JPG进行操作的?
       请各位老大帮帮忙!
      

  10.   

    Dear all:   我现在要对JPG图像进行区域复制,要如何处理?CopyRect不能对JPG图像进行操作,会出错!而如果将JPG图像转为BMP的话,分辨率又会丢失!
       1.如何处理将JPG转为BMP,或将BMP转为JPG,使其分辨率都不会丢失?
       2.或者有没有可以直接对JPG图你进行处理的,比如复制图像的某一部分.
         再次感谢!
      

  11.   

    上面的應該是直接讀取 jpg的文件, 因為jpeg的格式中, 應該就保存有相關的圖片信息!!