Từ 1 tới 4 trên tổng số 4 kết quả

Đề tài: sử dụng XOR raster operation trên Bitmap ko được

  1. #1
    Ngày gia nhập
    04 2007
    Bài viết
    30

    Mặc định sử dụng XOR raster operation trên Bitmap ko được

    chắc mọi người cũng từng nghe về XOR raster operation, đó là khi thực hiện các thao tác vẽ , color1 (là color của background) được XOR với color2 (là color của pen) tạo ra color3, sau đó nếu lấy color3 XOR color2 sẽ được lại color1. Người ta dùng cái này để vẽ các selection rectangle(còn gọi rubber band rectangle) trong các chương trình xử lý ảnh
    Vấn đề của mình là khi thử vẽ trên 1 Bitmap thì XOR mode ko hoạt động, chẳng hiểu sao
    Code:
    Graphics g = Graphics.FromImage(myBitmap);
    // lấy handle từ Graphics của Bitmap
    IntPrt hdc = g.GetHdc();
    // select brush cho nó
    IntPtr oldBrush = SelectObject(hdc, GetStockObject(NULL_BRUSH));
    // select pen cho nó
    IntPtr oldPen = SelectObject(hdc, CreatePen(PS_SOLID, 5, RGB(125, 200, 140)));
    // chọn chế độ vẽ là XOR
    SetRasterOperation(hdc, R2_XORPEN);
    // vẽ 1 hình chữ nhật ví dụ
    Rectangle(hdc,5,5,200,100);
    mình thử dùng cây pen có màu (125,200,140) để vẽ lên myBitmap ở chế độ XOR, kết quả luôn cho ra màu (112,195,128) dù myBitmap được tạo ở nhiều màu khác nhau. Lạ vậy nhỉ ? Ai từng dùng XOR để vẽ và có gặp trường hợp này giúp mình với
    Nói thêm là nếu mình vẽ trực tiếp lên form(nếu g là Graphics của Form) thì ko sao, vẫn XOR tốt, chỉ vẽ lên Bitmap mới vậy

  2. #2
    Ngày gia nhập
    10 2006
    Nơi ở
    In Your Bugs
    Bài viết
    823

    Bạn có thể attach lên đây project của bạn ko ?
    Để không thế này test oải lắm.

  3. #3
    Ngày gia nhập
    04 2007
    Bài viết
    30

    hic cái project của mình làm lộn xộn lắm, xem trong đó còn oải hơn vì mình chỉ viết "nháp" để thử tính năng XOR drawing này thôi, ko có trình tự gì cả
    Bạn chỉ việc tạo 1 cái Form, khai báo myBitmap
    Code:
    Bitmap myBitmap = new Bitmap(this.Width,this.Height);
    khai báo các hàm API

    Code:
    [DllImport("gdi32.dll", EntryName="SelectObject")]
    static extern IntPtr SelectObject(IntPtr hdc, IntPtr hobj);
    
    [DllImport("gdi32.dll", EntryName="GetStockObject")]
    static extern IntPtr GetStockObject(int fnObject);
    
    [DllImport("gdi32.dll", EntryName="CreatePen")]
    static extern IntPtr CreatePen(int fnPenStyle, int nWidth, uint crColor);
    
    [DllImport("gdi32.dll", EntryName="SetROP2")])]
    static extern int SetRasterOperation(IntPtr hdc, int fnDrawMode);
    
    [DllImport("gdi32.dll", EntryName="Rectangle")])]
    static extern void Rectangle(IntPtr hdc, int left, int top, int right, int bottom);
    
    int RGB(int r, int g, int b)
    {
        return b | (g<<8) | (r<<16);
    }
    khai báo các const

    Code:
    const int NULL_BRUSH = 5;
    const int R2_XORPEN = 7;
    const int PS_SOLID = 0;
    trong OnPaint event handler
    Code:
    e.Graphics.DrawImageUnscaled(myBitmap, new Point(0,0));
    ... xong rồi đặt đoạn code lần trước vào MouseDownEventHandler là được, để mỗi lần click chuột sẽ có 1 hình CN vẽ ra theo kiểu XOR, bạn thử đổi màu nền của myBitmap nhưng sau khi XOR với màu của Pen, kết quả luôn là 1 màu nhất định, thế mới lạ. Mình đau đầu mấy ngày ko tìm ra lí do (à cái Project mình viết ko gọn vậy đâu, tùm lum lắm, cái này mình làm gọn lại để bạn dễ test thôi)

  4. #4
    Ngày gia nhập
    04 2007
    Bài viết
    30

    hic sao topic em cứ chìm xuống thế này, cái lỗi này ko trả lời được chắc em điên lên mất
    Đành rằng em có cách khác để làm XOR drawing, vẽ trên Form thì ngon lành, chỉ có vẽ trên Bitmap là "tầm bậy" . Nhưng em muốn biết do đâu có cái "tầm bậy" ấy, lập trình mà cứ gặp lỗi ko giải thích được thế này thì khó chịu lắm, thà có câu trả lời đơn giản như "do cái GDI interop với GDI+ ko tốt" cũng làm em nhẹ nhõm bớt ^^
    Đã được chỉnh sửa lần cuối bởi HKuspc : 02-03-2009 lúc 08:13 PM.

Các đề tài tương tự

  1. Hiển thị ảnh bitmap trên dialog box như thế nào ?
    Gửi bởi ga4ever trong diễn đàn Windows API, Hooking, xử lý Windows Message
    Trả lời: 1
    Bài viết cuối: 06-03-2014, 09:02 PM
  2. Graphic Làm thế nào để lấy được màu của pixcel trên ảnh bitmap trong lập trình c#?
    Gửi bởi xuan_dong_1992 trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 0
    Bài viết cuối: 16-07-2013, 09:42 PM
  3. Hướng dẫn tạo đối tượng bitmap bằng phương thức Bitmap(Type, String)
    Gửi bởi haui91 trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 1
    Bài viết cuối: 21-08-2011, 08:39 AM
  4. xóa ảnh bitmap trên màn hình ??? VC++6.0
    Gửi bởi aazz trong diễn đàn Thắc mắc lập trình Visual C++
    Trả lời: 5
    Bài viết cuối: 21-12-2009, 11:48 AM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn