Trang 1 trên tổng số 2 12 Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 12 kết quả

Đề tài: Tạo hiệu ứng mờ ảnh trong lập trình C#

  1. #1
    Ngày gia nhập
    11 2007
    Nơi ở
    Biết để làm gì?
    Bài viết
    827

    Mặc định Tạo hiệu ứng mờ ảnh trong lập trình C#

    Các bạn mà dùng picasa chắc biết cái xem ảnh theo chế độ slide của nó.Mình cũng muốn làm 1 cái tool có thể chạy slide ảnh như thế,nhưng có điều ko biết cách tạo hiệu ứng mờ ảnh dần khi chuyển từ ảnh này sang ảnh khác như thằng picasa.Mọi người có ý tưởng gì giúp mình với.
    Cánh Chym ứ mỏi

  2. #2
    Ngày gia nhập
    01 2008
    Bài viết
    20

    mình chưa dùng picasa bao h nhưng mình nghĩ ra luôn 1 y tưởng là mỗi lần chuyển ảnh thì chèn 1 cái pic màu đen vào xong cho opacity tăng dần lên ,cùng lúc đó thì chuyển ảnh khác xong lại cho opacity giảm xuống. Dùng timer.
    Nghe có vẻ nông dân nhỉ ?? )

  3. #3
    Ngày gia nhập
    01 2008
    Bài viết
    20

    bao h bạn làm thành công thì share cho mình với nhé.

  4. #4
    Ngày gia nhập
    11 2007
    Nơi ở
    Biết để làm gì?
    Bài viết
    827

    Hjc,mình thử theo cách của bạn mà vẫn chưa dc :|.tạm gác lại ôn thi đã
    Cánh Chym ứ mỏi

  5. #5
    Ngày gia nhập
    09 2007
    Bài viết
    724

    đây là một bài viết trên diễn đàn hướng dẫn tạo 2 bức hình lồng nhau của 1 tác giả. (sorry vì zkday đã quên, làm biếng search lại )

    Điếu cày thử cái này + double buffer thử được không (mới nghĩ tới đây à thui đi cài ubuntu chơi đã )

    Visual C# Code:
    1. public static void ApplyTexture (Image img, Image texture,
    2.     float textureTransparency)
    3. {
    4.     if ( (img ==null) || (texture==null) )
    5.         throw new ArgumentNullException();
    6.     if (textureTransparency < 0 || textureTransparency > 1)
    7.         throw new ArgumentOutOfRangeException(
    8.               "Gia tri tu 0 den 1.");
    9.  
    10.     // Chuyen anh qua mau gray truoc
    11.     MakeImageGrayscale (texture);
    12.  
    13.  
    14.     Bitmap txtr = new Bitmap(texture);
    15.     BitmapData bmData = txtr.LockBits(new Rectangle(0, 0,
    16.                  txtr.Width, txtr.Height),
    17.         ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb);
    18.     int stride = bmData.Stride;
    19.     System.IntPtr Scan0 = bmData.Scan0;
    20.    
    21.     unsafe
    22.     {
    23.         byte * p = (byte *)(void *)Scan0;
    24.         int nOffset = stride - txtr.Width*4;
    25.  
    26.  
    27.         for (int y=0; y < txtr.Height; ++y)
    28.         {
    29.             for (int x=0; x < txtr.Width; ++x)
    30.             {
    31.                 p[3] = (byte)(p[0] * textureTransparency);
    32.                 p += 4; // Move to the next pixel
    33.             }
    34.             p += nOffset;
    35.         }
    36.     }
    37.     txtr.UnlockBits(bmData);
    38.  
    39.     Graphics gr = Graphics.FromImage(img);
    40.     TextureBrush myBrush = new TextureBrush(txtr);
    41.     gr.FillRectangle (myBrush,0,0,img.Width, img.Height);
    42.     myBrush.Dispose();
    43.     gr.Dispose();
    44.     txtr.Dispose();
    45. }
    46.  
    47.  
    48.  
    49. // Chuyen mot anh thanh mau xam
    50. public static void MakeImageGrayscale (Image img)
    51. {
    52.     ColorMatrix cMatrix = new ColorMatrix (
    53.        new float[][]  {
    54.          new float[] {0.299F, 0.299F, 0.299F, 0, 0},
    55.          new float[] {0.587F, 0.587F, 0.587F, 0, 0},
    56.          new float[] {0.114F, 0.114F, 0.114F, 0, 0},
    57.          new float[] {0, 0, 0, 1, 0},
    58.          new float[] {0,  0,  0,  1, 0}});
    59.  
    60.     ImageAttributes imageAttrib = new ImageAttributes();
    61.     imageAttrib.SetColorMatrix(cMatrix);
    62.  
    63.     Graphics gr = Graphics.FromImage (img);
    64.    
    65.     gr.DrawImage (img, new Rectangle(0, 0, img.Width, img.Height),
    66.                     0, 0, img.Width, img.Height, GraphicsUnit.Pixel,
    67.                     imageAttrib);
    68.     gr.Dispose();
    69. }

  6. #6
    Ngày gia nhập
    11 2007
    Nơi ở
    Biết để làm gì?
    Bài viết
    827

    Mặc định Tạo hiệu ứng mờ ảnh trong lập trình C#

    Thanks Z,nhưng qua C# rùi mà chơi với pointer thì ko hay lắm,đang nghĩ cách dùng thread + timer + GDI
    Cánh Chym ứ mỏi

  7. #7
    Ngày gia nhập
    01 2008
    Nơi ở
    Gameloft Studio
    Bài viết
    294

    Trích dẫn Nguyên bản được gửi bởi dieucay555
    thread + timer + GDI
    Đang tưởng tượng thử dieucay làm thế nào nè...

    Xử lý đồ họa thì pointer chính là trái tim. Managed memory là một ưu điểm của C# nhưng cũng có lúc không có cái này lại giết chính nó. Vì vậy nên đoạn code trên bắc buộc phải unsafe để đảm bảo tốc độ.

    Xử lý đồ họa bản chất chính là xử lý bộ nhớ. Thông thường cứ 4 bytes sẽ là 1 pixel (bytes thứ 4 không xử dụng vào màu sắc). Và các hiệu ứng màu sắc thì bạn tính toán trên giá trị 3 bytes còn lại.

    * Hiệu ứng trên của ZK là Transparency: Có nghĩa trung hòa 2 ảnh theo % nào đó. Bạn đã có tỷ lệ (alpha từ 0 -> 1).

    pixelDst = pixelSrc1*alpha + pixelSrc2*(1- alpha)

    Nếu mình ko nhầm thì đó là công thức Transparency (code trên của ZK là trộn với màu đen -> công thức mất đi 1 vế vì màu đen = 0).

    * Còn hiệu ứng mờ mờ ảo ảo như nero của vista sự trộn giữa 8 pixel xung quanh nó và chia trung bình ra.

    pixel[x,y] = (k*pixel[x,y] + pixel[x-1,y] + pixel[x+1,y] + ....)/8

    Hằng số k có thể xác định độ nhòe của ảnh.


    Lúc trước có người hỏi là tại sao người ta lại dùng C++ để devgames mà ko dùng C#. Sẵn tiện trả lời luôn chính là do tốc độ.

    C# có thể dev games và viết cũng dễ hơn C++ nhưng sản phẩm tốc độ sẽ không thể nào bằng C++. Nên chỉ có thể chọn giải pháp games trên điện thoại hoặc games mini mà thôi.

    Nói thế này thì sẽ rõ hơn, khi bạn viết games thì đảm bảo tệ nhất thì games đó phải chạy ở tốc độ 20frames/s (trên 1 cấu hình xác định trước và gọi cấu hình đó là minimum) tức là 1 frames mất 50ms. 1 frames này sẽ bao gồm thời gian render và thời gian update xử lý. Những games hay hầu như đều chạy ở tốc độ 50frames/s hết.

    Thời gian render sẽ phụ thuộc vào độ chi tiết của đối tượng 3D thông thường sẽ mất khoảng 10 - 20ms (tức là 100-200frames/s nếu không xử lý update).

    Lúc này chỉ còn lại cho bạn 30 - 40ms để update cập nhật vị trí, xác định đụng độ của tất cả các đối tượng trong Games.

    Với tốc độ này thì chỉ có C/C++ và ASM mới có thể làm tốt được. Bởi vì code của nó chạy thẳng từ hệ điều hành chứ không phải từ máy ảo....

    Lập trình games rất khó, nó khó ở sự tối ưu chứ ko phải khó ở chỗ viết như thế nào. Có người vẫn bảo đã từng viết được games nhưng chỉ cần nhìn sơ qua đoạn code là có thể biết người đó nói thật hay xạo. Trong forums này thì người biết tối ưu code nhất mà mình thấy chính là Radical Light.

    Ngôn ngữ C# tiện lợi ở ứng dụng quản lý vì được hỗ trợ rất nhiều, nhưng với ứng dụng cần sự thực thi tức thời thì ko thể phù hợp.
    Đã được chỉnh sửa lần cuối bởi ZCoder87 : 15-12-2008 lúc 02:08 PM.

  8. #8
    Ngày gia nhập
    09 2008
    Nơi ở
    Kĩ viện
    Bài viết
    169

    Xử lý đồ họa thì pointer chính là trái tim
    Không hiểu , sao pointer lại là trái tim?.

    1 frames này sẽ bao gồm thời gian render và thời gian update xử lý. Những games hay hầu như đều chạy ở tốc độ 50frames/s hết.
    Thực ra thì nó không update per frame đâu, tốc độ update chỉ tối đa 60 lần/s thôi, nếu trong một lần loop mà nó thấy chưa đủ thời gian thì nó chỉ render chứ không update. Như thế FPS sẽ được đẩy cao hơn, FPS có thể lên tới vài ngàn nhưng UPS(tự nghĩ ra cái tên này ) chỉ < 60.

    Những games hay hầu như đều chạy ở tốc độ 50frames/s hết.
    FPS thì càng nhiều càng tốt,nhưng bét cũng phải trên 30.

    Với tốc độ này thì chỉ có C/C++ và ASM mới có thể làm tốt được. Bởi vì code của nó chạy thẳng từ hệ điều hành chứ không phải từ máy ảo....

    Ngôn ngữ C# tiện lợi ở ứng dụng quản lý vì được hỗ trợ rất nhiều, nhưng với ứng dụng cần sự thực thi tức thời thì ko thể phù hợp.
    Biết là chậm, nhưng chậm hơn bao nhiêu?. Khi mà chỉ hơn kém nhau có vài FPS và một tý Ram thì chậm không thành vấn đề với client dùng C#(server chết tại chỗ T.T, một tý cho mỗi thằng nó thành nhiều tý). Mà tối ưu quan trọng là cách làm, không phải ngôn ngữ.

    Lập trình games rất khó, nó khó ở sự tối ưu chứ ko phải khó ở chỗ viết như thế nào. Có người vẫn bảo đã từng viết được games nhưng chỉ cần nhìn sơ qua đoạn code là có thể biết người đó nói thật hay xạo
    Hay, nhưng cũng phải nói là "làm thế nào đã rồi hẵng nghĩ tới làm thế nào cho tốt". Tối ưu đương nhiên là khó nhưng viết như thế nào cũng là cả một vấn đề đấy.
    Phá toái hư không - Bạch nhật thăng thiên.

  9. #9
    Ngày gia nhập
    01 2008
    Nơi ở
    Gameloft Studio
    Bài viết
    294

    Không hiểu , sao pointer lại là trái tim?.
    Pointer là trái tim vì xử lý ảnh chính là xử lý memory. Tốc độ xử lý dịch bytes trên pointer sẽ luôn nhanh hơn nhảy bằng mảng [].

    Thực ra thì nó không update per frame đâu, tốc độ update chỉ tối đa 60 lần/s thôi, nếu trong một lần loop mà nó thấy chưa đủ thời gian thì nó chỉ render chứ không update. Như thế FPS sẽ được đẩy cao hơn, FPS có thể lên tới vài ngàn nhưng UPS(tự nghĩ ra cái tên này ) chỉ < 60.
    Trên 1frames thì phải tính toán lại trên các đối tượng. Tất cả đơn vị sẽ đưa về frames. Ví dụ như "Đối tượng quay bao nhiêu vòng - giây" -> Và có dữ kiện là tốc độ vẽ frames/giây => suy ra được tốc độ 1 frames ta sẽ update đối tượng đó quay khoảng bao nhiêu rad để đồng bộ thời gian.

    Nên ko có chuyện trong 1 frames không hề update.

    Biết là chậm, nhưng chậm hơn bao nhiêu?
    Cái này thì chưa tính thử. Nhưng xét về lý thuyết thì có thể như thế này.

    ví dụ đơn giản thế này.
    c++:
    int c; -> Sẽ là 4bytes trên memory.

    c#:
    int c; -> Khai báo một đối tượng int kế thừa object


    Khai báo 400 bytes trên memory và sự truy xuất dữ liệu hoàn toàn trực tiếp
    C++: int *c = new int[100];

    C#: int c = new int[100];
    CLR sẽ khai báo 400bytes trên memory -> c là 1 giá trị handle để CLR gần nắm giữ -> Lúc này sự truy xuất dữ liệu sẽ thông qua CLR vì nó đảm bảo chương trình luôn sử dụng đúng 100bytes. Chưa kể CLR phải đảm nhận công việc dọn rác.

    Đó là tiện lợi sự của máy ảo nhưng cũng có lúc không cần thiết như lập trình games vì nó đã làm speed giảm đi vì chúng ta cần xử lý tức thời.

    Dĩ nhiên tôi cũng ko muốn so sánh để gây xung đột nhưng đó là cái ta nên nhận thấy
    . C# không chỉ chậm hơn ko chỉ vài frames có khi tới vài chục frames...
    Đã được chỉnh sửa lần cuối bởi ZCoder87 : 15-12-2008 lúc 03:14 PM.

  10. #10
    Ngày gia nhập
    09 2008
    Nơi ở
    Kĩ viện
    Bài viết
    169

    Pointer là trái tim vì xử lý ảnh chính là xử lý memory. Tốc độ xử lý dịch bytes trên pointer sẽ luôn nhanh hơn nhảy bằng mảng [].
    Cái này nếu dùng MdirectX trên C# thì không phải lo , wrap lại thôi mà.

    Trên 1frames thì phải tính toán lại trên các đối tượng. Tất cả đơn vị sẽ đưa về frames. Ví dụ như "Đối tượng quay bao nhiêu vòng - giây" -> Và có dữ kiện là tốc độ vẽ frames/giây => suy ra được tốc độ 1 frames ta sẽ update đối tượng đó quay khoảng bao nhiêu rad để đồng bộ thời gian.

    Nên ko có chuyện trong 1 frames không hề update.
    Đó là nằm luôn trong render rồi, update ý tớ là AI, physic, battle system ấy, mấy cái đó nếu làm per frame thì FPS sẽ giảm mạnh vì phải tính toán quá nhiều. Animation của nhân vật nằm trong quá trình render nhưng vị tí của nhân vật lại là update, và có delta time(thời gian giữa hai lần update) để tính.
    Đã được chỉnh sửa lần cuối bởi NamVoDang : 15-12-2008 lúc 03:28 PM.
    Phá toái hư không - Bạch nhật thăng thiên.

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