• Vui lòng đọc nội qui diễn đàn để tránh bị xóa bài viết
  • Tìm kiếm trước khi đặt câu hỏi

Lấy Texture chèn vào bitmap

Các thủ thuật về truyền thông đa phương tiện, đồ họa

Điều hành viên: tungcan5diop, QUANITGROBEST

Hình đại diện của người dùng
PhapSuXeko
Mạnh Thường Quân
Mạnh Thường Quân
Bài viết: 295
Ngày tham gia: CN 03/05/2009 7:44 pm
Đến từ: Tây Ninh
Has thanked: 1 time
Been thanked: 10 time
Liên hệ:

Lấy Texture chèn vào bitmap

Gửi bàigửi bởi PhapSuXeko » T.Năm 25/02/2010 12:36 pm

Thủ thuật: Lấy Texture chèn vào bitmap
Tác giả: Kourosh Derakshan
Mô tả: Xem hình nha!


Hình ảnh

Híc, trưa quá rồi, ráng post nốt bài này...

Convert texture thành grayscale, những pixel có màu trắng nhất (giá trị củ R, G hoặc B cao nhất) sẽ có độ trong suốt nhất. pixel tối nhất có độ trong suốt ít nhất.

Nếu tốc độ là một vấn đề, bạn có thể viết lại mã không dùng GetPixel và SetPixel. Có hai chức năng rất chậm vì với mỗi lần gọi, các bitmap cần phải được khóa và mở khóa trong bộ nhớ. Ta sẽ không làm điều này, nhưng nếu bạn tìm kiếm trên net bạn sẽ tìm thấy cách: thay thế getpixel và setpixel bằng Marshal.WriteInt32 () và Marshal.ReadInt32 (). Bạn cần phải khóa và mở khóa bitmap trước khi làm như vậy!

Code VB.NET:
  1. 'written by Kourosh Derakshan (MrPolite @ vbforums.com)
  2. Imports System.Drawing.Imaging
  3.  
  4. Namespace MrPolite
  5.     Public NotInheritable Class BitmapTexture
  6.  
  7.         ' Please do not remove
  8.         ' Written by Kourosh Derakshan
  9.         '
  10.  
  11.         ' Modifies the ORIGINAL bitmap
  12.         ' textureTransparency  has to be between 0 and 1,
  13.         ' with 0 being the least transparent, and 1 the most transparent
  14.         Public Shared Sub ApplyTexture(ByVal bmp As Bitmap, _
  15.             ByVal texture As Bitmap, _
  16.             ByVal textureTransparency As Single)
  17.  
  18.             If (bmp Is Nothing) OrElse (texture Is Nothing) Then Throw New ArgumentNullException
  19.             If textureTransparency < 0 OrElse textureTransparency > 1 Then
  20.                 Throw New ArgumentOutOfRangeException("textureTransparency must be between 0 and 1.")
  21.             End If
  22.  
  23.             ' Convert the texture to grayscale before using it
  24.             MakeImageGrayscale(texture)
  25.  
  26.  
  27.             Dim x, y, alpha As Integer
  28.  
  29.             ' Adjust the alpha value of each pixel in the texture bitmap.
  30.             ' The white-most pixels will have the the most transparency (highest alpha),
  31.             ' and the dark-most pixels will have the least transparency.
  32.             For x = 0 To texture.Width - 1
  33.                 For y = 0 To texture.Height - 1
  34.                     Dim c As Color = texture.GetPixel(x, y)
  35.                     ' c.R -> all of the RGB values are the same since the image is in grayscale
  36.                     alpha = CInt(c.R * textureTransparency)
  37.                     c = Color.FromArgb(alpha, c)
  38.  
  39.                     texture.SetPixel(x, y, c)
  40.                 Next
  41.             Next
  42.  
  43.             Dim gr As Graphics = Graphics.FromImage(bmp)
  44.             Dim myBrush As New TextureBrush(texture)
  45.  
  46.             ' Draw the texture over the original bitmap
  47.             gr.FillRectangle(myBrush, bmp.GetBounds(GraphicsUnit.Pixel))
  48.             myBrush.Dispose()
  49.             gr.Dispose()
  50.         End Sub
  51.  
  52.         ' Converts the image to grayscale
  53.         Private Shared Sub MakeImageGrayscale(ByVal bmp As Bitmap)
  54.             Dim cMatrix As New ColorMatrix(New Single()() _
  55.              {New Single() {0.299, 0.299, 0.299, 0, 0}, _
  56.              New Single() {0.587, 0.587, 0.587, 0, 0}, _
  57.               New Single() {0.114, 0.114, 0.114, 0, 0}, _
  58.               New Single() {0, 0, 0, 1, 0}, _
  59.               New Single() {0, 0, 0, 0, 1}})
  60.  
  61.             Dim imageAttrib As New ImageAttributes
  62.             imageAttrib.SetColorMatrix(cMatrix)
  63.  
  64.  
  65.             Dim gr As Graphics = Graphics.FromImage(bmp)
  66.             ' Apply the grayscale image attribute
  67.             gr.DrawImage(bmp, New Rectangle(0, 0, bmp.Width, bmp.Height), _
  68.               0, 0, bmp.Width, bmp.Height, GraphicsUnit.Pixel, imageAttrib)
  69.             gr.Dispose()
  70.         End Sub
  71.  
  72.     End Class
  73. End Namespace


Code C#:
  1. //written by Kourosh Derakshan (MrPolite @ vbforums.com)
  2. using System;
  3. using System.Drawing.Imaging;
  4. using System.Drawing;
  5.  
  6. namespace MrPolite
  7. {
  8.     // Your project needs to be able to execute unsafe code:
  9.     // Right click on your project, go to Properties, click on Configuration Properties
  10.     // in the Build section, make "Allow unsafe code blocks" to true
  11.     // written by Kourosh Derakshan (MrPolite @ vbforums.com)
  12.     public unsafe abstract class BitmapTxtr
  13.     {
  14.         /// <summary>
  15.         /// Applies the given texture to the bitmap
  16.         /// </summary>
  17.         /// <param name="img">Image to be texturized</param>
  18.         /// <param name="texture">Texture image. This will be turned to grayscale in the process.
  19.         /// Make sure the texture isnt of an indexed image format.</param>
  20.         /// <param name="textureTransparency">Tarnsparency value of the texture, between 0 and 1</param>
  21.         public static void ApplyTexture (
  22.             Image img,
  23.             Image texture,
  24.             float textureTransparency)
  25.         {
  26.             if ( (img ==null) || (texture==null) )
  27.                 throw new ArgumentNullException();
  28.             if (textureTransparency < 0 || textureTransparency > 1)
  29.                 throw new ArgumentOutOfRangeException(
  30.                     "Value must be between 0 and 1.");
  31.  
  32.             // Convert the texture to grayscale before using it
  33.             MakeImageGrayscale (texture);
  34.  
  35.  
  36.             Bitmap txtr = new Bitmap(texture);
  37.             BitmapData bmData = txtr.LockBits(new Rectangle(0, 0,
  38.                 txtr.Width, txtr.Height),
  39.                 ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb);
  40.             int stride = bmData.Stride;
  41.             System.IntPtr Scan0 = bmData.Scan0;
  42.             // Adjust the alpha value of each pixel in the texture bitmap.
  43.             // The white-most pixels will have the the
  44.             // most transparency (highest alpha),
  45.             // and the dark-most pixels will have the least transparency.
  46.             byte * p = (byte *)(void *)Scan0;
  47.             int nOffset = stride - txtr.Width*4;
  48.  
  49.  
  50.             for (int y=0; y < txtr.Height; ++y)
  51.             {
  52.                 for (int x=0; x < txtr.Width; ++x)
  53.                 {
  54.                     // p[3] is alpha  -  array is BGRA (blue, green ,
  55.                     // red, alpha)
  56.                     p[3] = (byte)(*p * textureTransparency);
  57.                     p += 4; // Move to the next pixel
  58.                 }
  59.                 p += nOffset;
  60.             }
  61.             txtr.UnlockBits(bmData);
  62.  
  63.             Graphics gr = Graphics.FromImage(img);
  64.             TextureBrush myBrush = new TextureBrush(txtr);
  65.             gr.FillRectangle (myBrush,0,0,img.Width, img.Height);
  66.             myBrush.Dispose();
  67.             gr.Dispose();
  68.             txtr.Dispose();
  69.         }
  70.  
  71.  
  72.  
  73.         /// <summary>
  74.         ///  Converts the image to grayscale
  75.         /// </summary>
  76.         private static void MakeImageGrayscale (Image img)
  77.         {
  78.             ColorMatrix cMatrix = new ColorMatrix (
  79.                 new float[][]  {
  80.                                    new float[] {0.299F, 0.299F, 0.299F, 0, 0},
  81.                                    new float[] {0.587F, 0.587F, 0.587F, 0, 0},
  82.                                    new float[] {0.114F, 0.114F, 0.114F, 0, 0},
  83.                                    new float[] {0, 0, 0, 1, 0},
  84.                                    new float[] {0,  0,  0,  1, 0}});
  85.  
  86.             ImageAttributes imageAttrib = new ImageAttributes();
  87.             imageAttrib.SetColorMatrix(cMatrix);
  88.  
  89.             Graphics gr = Graphics.FromImage (img);
  90.             // Apply the grayscale image attribute
  91.             gr.DrawImage (img, new Rectangle(0, 0, img.Width, img.Height),
  92.                 0, 0, img.Width, img.Height, GraphicsUnit.Pixel,
  93.                 imageAttrib);
  94.             gr.Dispose();
  95.         }
  96.     }
  97. }


Download:
TextureSample.zip
VB.NET Code
(160.68 KiB) Đã tải 519 lần

TextureSample (C).zip
C# Code
(161.09 KiB) Đã tải 420 lần


Trang chủ phần mềm xem ảnh ImageGlass: http://www.imageglass.org

Quay về “[.NET] Âm thanh và Đồ họa”

Đang trực tuyến

Đang xem chuyên mục này: Không có thành viên nào trực tuyến.0 khách