RectWidth:=RightPos-LeftPos;
RectHeight:=BottomPos-TopPos;
SourceDC:=CreateDC('DISPLAY',nil,nil,nil);
DestDC:=CreateCompatibleDC(SourceDC);
Bhandle:=CreateCompatibleBitmap(SourceDC,RectWidth,RectHeight);
SelectObject(DestDC,Bhandle);
BitBlt(DestDC,0,0,RectWidth,RectHeight,SourceDC,LeftPos,TopPos,SRCCOPY);
Bitmap:=TBitmap.Create;
Bitmap.Handle:=BHandle; Bitmap.SaveToFile ('C:\Log');
         Bitmap.LoadFromFile('C:\Log');  //为什么不用这两句会出错?  Jpeg:=TJpegImage.Create ;
Jpeg.Assign (Bitmap);
Jpeg.JPEGNeeded ;
jpeg.CompressionQuality :=Quality;
jpeg.Compress ;
    Jpeg.SaveToStream (BmpStream);
//BitMap.SaveToStream(BmpStream);
BmpStream.Position:=0;
LeftSize:=BmpStream.Size;
Jpeg.Free;
Bitmap.free;
DeleteDC(DestDC);
ReleaseDC(Bhandle,SourceDC);怎样利用api截取屏幕后,在内存中转换为jpg图像格式,使用Stream?

解决方案 »

  1.   

    Bitmap.Handle:=BHandle;引起的,好像是,建议直接画到Bitmap.
      

  2.   

    给你段代码
    procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
      Socket: TCustomWinSocket);
    var
      s,s1:string;
      desk:tcanvas;
      bitmap:tbitmap;
      jpg:tjpegimage;
    begin
      s:=socket.ReceiveText;
      if s='gets' then //file://客户端发出申请
      begin
       try
        m1:=tmemorystream.Create;
        bitmap:=tbitmap.Create;
        jpg:=tjpegimage.Create;
        desk:=tcanvas.Create; //以下代码为取得当前屏幕图象
        desk.Handle:=getdc(hwnd_desktop);
        with bitmap do
        begin
            width:=screen.Width;
            height:=screen.Height;
            canvas.CopyRect(canvas.cliprect,desk,desk.cliprect);
        end;
        jpg.Assign(bitmap); //file://将图象转成JPG格式
        jpg.CompressionQuality:=10;//文件压缩大小设置
        //m1.clear;
        jpg.SaveToStream(m1); //file://将JPG图象写入流中
        jpg.free;
        m1.Position:=0;
        s1:=inttostr(m1.size);
        Socket.sendtext(s1); //file://发送图象大小
       finally
        bitmap.free;
        desk.free;
       end;
      end;
      if s='okok' then //file://客户端已准备好接收图象
      begin
        m1.Position:=0;
        Socket.SendStream(m1); //file://发送JPG图象
      end;
    end;
    procedure TForm1.FormCreate(Sender: TObject);
    begin
     ServerSocket1.open;
    end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
    ServerSocket1.close;
    end;end.
      

  3.   

    var
      bitmap:TBitmap;
      Stream:TStringStream;
      Jpeg:TJPEGImage;
      dc:HDC;
    begin
      bitmap := TBitmap.Create;
      Jpeg:=TJPEGImage.Create;
      Stream:=TStringStream.Create('F:\3.txt');
      try
        bitmap.Width:=200;
        bitmap.Height:=200;
        dc:=GetDC(0);//屏幕
        BitBlt(bitmap.Canvas.Handle,0,0,200,200,dc,0,0,SRCCOPY);
        Jpeg.Assign(bitmap);
        jpeg.CompressionQuality :=75;
      jpeg.Compress ;
        Jpeg.SaveToStream(stream);    //Jpeg.SaveToFile('F:\1.jpg');
      finally
        Jpeg.Free;
        Stream.Free;
        bitmap.Free;
      end;