2009-08-27 39 views
8

tôi đã tạo một Bitmap bằng GDI +. Tôi đang vẽ văn bản trên bitmap đó bằng GDI Drawtext.Using Drawtext tôi không thể áp dụng tính minh bạch. Bất kỳ trợ giúp hoặc mã nào sẽ được đánh giá cao.Tính minh bạch cho văn bản trong GDI

+1

Ngôn ngữ ưa thích? C, C++, VB.net, C# ?? –

+0

Được ưu tiên sẽ là đồng bằng Windows API/C++ – VideoDev

+1

GDI + là lỗi đánh máy? –

Trả lời

13

Nếu bạn muốn vẽ văn bản mà không tô nền, SetBkMode(hdc,TRANSPARENT) sẽ yêu cầu GDI thoát khỏi nền khi vẽ văn bản.


Để thực sự hiển thị màu nền trước của văn bản có alpha ... sẽ phức tạp hơn. GDI không thực sự hỗ trợ tất cả các kênh alpha rộng rãi trong các API của nó. Bên ngoài của AlphaBlend thực sự tất cả những gì nó làm là bảo vệ kênh. Nó thực sự không hợp lệ để thiết lập các bit trên của một giá trị COLOREF thành giá trị alpha vì byte cao thực sự được sử dụng cho các cờ để cho biết liệu COLOREF có phải là (thay vì giá trị RGB) một mục bảng màu hay không.

Vì vậy, thật không may, cách duy nhất thực sự của bạn về phía trước là:

  1. Tạo một DIBSection 32bit. (CreateDIBSection). Điều này mang lại cho bạn một HBITMAP được đảm bảo để có thể giữ thông tin alpha. Nếu bạn tạo một bitmap thông qua một trong các chức năng tạo bitmap khác, nó sẽ có ở colordepth thiết bị có thể không là 32bpp.
  2. DrawText vào DIBSection.
  3. Khi bạn tạo DIBSection, bạn có một con trỏ tới bộ nhớ thực. Tại thời điểm này, bạn cần phải đi qua bộ nhớ và thiết lập các giá trị alpha. Tôi không nghĩ rằng DrawText sẽ tự làm bất cứ điều gì với kênh alpha. Im suy nghĩ một kiểm tra đơn giản của các thành phần RGB của mỗi DWORD của bitmap - nếu chúng là màu forground, viết lại DWORD với một 50% (hoặc bất kỳ) alpha trong alpha byte, nếu chúng là màu nền, viết lại với 100% alpha trong byte alpha. *
  4. AlphaBlend bitmap vào đích cuối cùng. AlphaBlend yêu cầu kênh alpha trong nguồn được nhân trước.

* Có thể chỉ cần nhớ DIBSection với alpha 50% trước khi thực hiện DrawText và đảm bảo rằng BKColor có màu đen. Tôi không biết DrawText có thể làm gì với kênh alpha. Một số thử nghiệm được gọi cho.

+0

Cảm ơn bạn đã trả lời.Tôi đã sử dụng phương pháp này.Chuyển văn bản này được vẽ lên hình chữ nhật tranparently.But tôi muốn áp dụng độ trong suốt (alpha) cho văn bản được vẽ mà không thể sử dụng phương thức SetTextColor. Khi SetTextColor bỏ qua giá trị alpha của một Color.I đã trải qua một số ứng dụng sử dụng bitmap mặt nạ để áp dụng tính minh bạch, nhưng tôi chưa nhận được kết quả mong muốn. và tôi không muốn áp dụng tính minh bạch cho bitmap, tôi muốn áp dụng tính minh bạch cho Văn bản được vẽ trên Bitmap. Bất kỳ trợ giúp nào được đánh giá là – VideoDev

+0

Th ý tưởng là, vẽ lên một bitmap đen, không phải là một bitmap với thông tin ổn định trên đó. Sau khi đổ văn bản, bạn có thể quét bitmap cho các pixel không phải màu đen và điều chỉnh kênh alpha cho từng pixel dựa trên phần của văn bản. –

0

Hmmmm - cố gắng làm tương tự ở đây - tự hỏi - tôi thấy rằng khi bạn tạo một phần dib, bạn chỉ định "mặt nạ" là mặt nạ R, G, B (và alpha).

NẾU và thats lớn nếu nó thực sự không thay đổi chhannel alpha, thì bạn có thể chỉ định mặt nạ khác nhau cho hai tiêu đề bitmap. ONe chỉ định Thr RGB ở những vị trí thích hợp, cái kia làm cho tất cả chúng đều có bit được gán cho kênh alpha. (đặt màu văn bản thành màu trắng trong trường hợp này) sau đó hiển thị trong hai lần truyền, một để tải các giá trị màu, giá trị còn lại để tải các giá trị alpha.

???? anyway just musing :)

0

Trong khi câu hỏi này là về cách tạo văn bản nửa công khai, tôi đã có vấn đề ngược lại.

DrawText làm cho văn bản trong cửa sổ xếp lớp của tôi (UpdateLayeredWindow) nửa công khai ... và tôi không muốn nó.

Hãy xem điều này khác question ... vì trong câu hỏi khác tôi đăng một số mã mà bạn có thể dễ dàng sửa đổi ...và gần như chính xác những gì Chris Becke gợi ý trong câu trả lời của anh.

7

ĐƠN GIẢN và giải pháp dễ dàng :)

có vấn đề này, tôi đã cố gắng để thay đổi giá trị alpha và premultiply, nhưng có một vấn đề khác - phông chữ antialiased và ClearType nơi không được hiển thị một cách chính xác (cạnh xấu xí). Vì vậy, những gì tôi đã làm ...

  1. Soạn cảnh của bạn (bitmap, đồ họa, vv)
  2. bitblt cần hình chữ nhật từ cảnh này (giống như hình chữ nhật văn bản của bạn, từ các nơi mà bạn muốn văn bản của bạn sẽ được) vào bộ nhớ DC với bitmap tương thích được chọn tại 0,0 tọa độ đích
  3. Vẽ văn bản của bạn vào hình chữ nhật đó trong bộ nhớ DC.
  4. Bây giờ AlphaBlend hình chữ nhật đó mà không có AC_SRC_ALPHA trong BLENDFUNCTION và với SourceConstantAlpha mong muốn từ bộ nhớ này DC quay lại cảnh DC của bạn.

Tôi nghĩ Bạn đã nhận nó :)

0

Một câu trả lời hạn chế cho một tình huống cụ thể:

Nếu bạn có một hình ảnh với kênh alpha và bạn muốn vẽ chữ đục trên nền đục cục bộ, đầu tiên chuẩn bị bitmap 32 bit của bạn với các bàn chải 32 bit được tạo với CreateDIBPatternBrushPt. Sau đó quét qua bit bitmap đảo ngược kênh alpha, vẽ văn bản của bạn như bình thường (bao gồm SetBkMode đến TRANSPARENT), sau đó đảo ngược alpha trong bitmap một lần nữa. Bạn có thể bỏ qua đảo ngược đầu tiên nếu bạn đảo ngược alpha của bàn chải.

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