2010-07-03 75 views
5

Tôi đang mã hóa giải pháp điều khiển trực tiếp/máy tính để bàn từ xa bằng trình điều khiển gương miễn phí của DFMirage. Có một mẫu C# về cách giao diện và điều khiển trình điều khiển gương here. Bạn sẽ cần trình điều khiển gương được cài đặt trước, tất nhiên, here. Vì vậy, khái niệm là, máy khách (helper) yêu cầu cập nhật màn hình và máy chủ (nạn nhân) gửi một, sử dụng mã hóa pixel thô. Khái niệm về một trình điều khiển gương loại bỏ sự cần thiết phải thăm dò ý kiến ​​rộng rãi cho các thay đổi màn hình, bởi vì một trình điều khiển gương được thông báo về tất cả các hoạt động vẽ màn hình trong thời gian thực. Trình điều khiển gương nhận vị trí và kích thước của hình chữ nhật cập nhật và chỉ có thể truy vấn bộ nhớ cho các byte pixel mới và gửi chúng.Dòng dữ liệu bitmap thô/quét (dữ liệu thô của trình điều khiển gương)?

Nên dễ dàng, ngoại trừ việc tôi không biết cách thực hiện phần đó nơi chúng tôi bộ nhớ truy vấn cho byte pixel mới. Các mẫu trình bày cách truy vấn bộ nhớ để lấy các điểm ảnh của màn hình toàn bộ sử dụng một cái gì đó với dữ liệu bitmap liệu và dòng quét và sải chân và tất cả những thứ tốt:

Bitmap result = new Bitmap(_bitmapWidth, _bitmapHeight, format); 
Rectangle rect = new Rectangle(0, 0, _bitmapWidth, _bitmapHeight); 
BitmapData bmpData = result.LockBits(rect, ImageLockMode.WriteOnly, format); 

// Get the address of the first line. 
IntPtr ptr = bmpData.Scan0; 

// Declare an array to hold the bytes of the bitmap. 
int bytes = bmpData.Stride * _bitmapHeight; 
var getChangesBuffer = (GetChangesBuffer)Marshal 
    .PtrToStructure(_getChangesBuffer, typeof (GetChangesBuffer)); 
var data = new byte[bytes]; 
Marshal.Copy(getChangesBuffer.UserBuffer, data, 0, bytes); 

// Copy the RGB values into the bitmap. 
Marshal.Copy(data, 0, ptr, bytes); 
result.UnlockBits(bmpData); 
return result; 

này là rất tốt và hoạt động tốt. Đối tượng Bitmap kết quả hiện có các pixel của toàn bộ màn hình. Nhưng nếu tôi muốn trích xuất một hình chữ nhật của dữ liệu pixel thay vì lấy dữ liệu pixel từ toàn bộ màn hình, tôi có thể làm như thế nào? Tôi đoán đây là một câu hỏi về rawbitmap-scan-stride, nhưng tôi đã gõ tất cả những câu hỏi này để bạn có thể biết nó đến từ đâu. Vì vậy, bất kỳ thông tin chi tiết nào về cách lấy chỉ một phần dữ liệu pixel thay vì dữ liệu pixel toàn màn hình?

Cập nhật: Tìm thấy thứ gì đó interesting (chỉ phần mã).

Trả lời

0

Dưới đây là một chức năng để sao chép một vùng hình chữ nhật từ một số bộ đệm hình ảnh nguồn để một Bitmap:

private static Bitmap ExtractImageRectangle(byte[] sourceBuffer, int sourceStride, PixelFormat sourcePixelFormat, Rectangle rectangle) 
{ 
    Bitmap result = new Bitmap(rectangle.Width, rectangle.Height, sourcePixelFormat); 
    BitmapData resultData = result.LockBits(new Rectangle(0, 0, result.Width, result.Height), ImageLockMode.WriteOnly, result.PixelFormat); 

    int bytesPerPixel = GetBytesPerPixel(sourcePixelFormat); // Left as an exercise for the reader 

    try 
    { 
     // Bounds checking omitted for brevity 
     for (int rowIndex = 0; rowIndex < rectangle.Height; ++rowIndex) 
     { 
      // The address of the start of this row in the destination image 
      IntPtr destinationLineStart = resultData.Scan0 + resultData.Stride * rowIndex; 

      // The index at which the current row of our rectangle starts in the source image 
      int sourceIndex = sourceStride * (rowIndex + rectangle.Top) + rectangle.Left * bytesPerPixel; 

      // Copy the row from the source to the destination 
      Marshal.Copy(sourceBuffer, sourceIndex, destinationLineStart, rectangle.Width * bytesPerPixel); 
     } 
    } 
    finally 
    { 
     result.UnlockBits(resultData); 
    } 

    return result; 
} 

Sau đó, bạn có thể sử dụng nó như thế này:

Rectangle roi = new Rectangle(100, 150, 200, 250); 
Bitmap result = ExtractImageRectangle(getChangesBuffer.UserBuffer, getChangesBuffer.Stride, getChangesBuffer.PixelFormat, roi); 

này giả định rằng GetChangesBuffer có thuộc tính cho stride và pixelformat của bộ đệm ảnh nguồn. Nó rất có thể không, nhưng bạn nên có một số phương tiện để xác định các định dạng stride và pixel của hình ảnh đầu vào của bạn. Trong ví dụ của bạn, bạn giả thiết rằng hình ảnh đầu vào bằng với hình ảnh đầu ra của bạn, đó là một giả định phức tạp.

Các vấn đề liên quan