2009-04-25 32 views
5

Tôi đang cố gắng xây dựng một thứ gì đó giống như bộ lọc Liquify trong Photoshop. Tôi đã đọc qua mã biến dạng hình ảnh nhưng tôi đang đấu tranh với việc tìm ra những gì sẽ tạo ra các hiệu ứng tương tự. Các tài liệu tham khảo gần nhất tôi có thể tìm thấy là bộ lọc iWarp trong GIMP nhưng mã cho rằng không phải là nhận xét cả.Bình lọc/iwarp

Tôi cũng đã xem xét những nơi như ImageMagick nhưng họ không có bất cứ điều gì trong lĩnh vực này

Bất kỳ con trỏ hoặc mô tả các thuật toán sẽ được đánh giá rất nhiều.

Trả lời

0

Xin lỗi nếu tôi làm cho âm thanh này đơn giản hơn một chút, tôi không chắc bạn biết bao nhiêu về lập trình gfx hoặc thậm chí kỹ thuật bạn đang sử dụng (tôi sẽ tự làm với HLSL).

Cách tôi tiếp cận vấn đề này là tạo ra một kết cấu có chứa các tọa độ x/y trong các kênh r/g. Sau đó, màu đầu ra của một pixel sẽ là:
Đầu vào kết cấuImage
Biến dạng kết cấu Bản đồ
màu (x, y) = inputImage (x + distortionMap (x, y) .R, y + distortionMap (x, y) .G)
(Để nói sự thật là không đúng, sử dụng màu như bù đắp trực tiếp có nghĩa là bạn chỉ có thể đại diện cho vectơ dương, đủ đơn giản để trừ 0,5 để bạn có thể đại diện cho vectơ âm)

Hiện chỉ có vấn đề còn lại là làm thế nào để tạo ra bản đồ biến dạng này, đó là một câu hỏi hoàn toàn khác (bất kỳ hình ảnh nào sẽ tạo ra sự biến dạng của một loại nào đó, rõ ràng, làm việc trên một hiệu ứng hóa lỏng thích hợp là khá phức tạp và tôi sẽ để nó eone hơn đủ điều kiện).

0

Tôi nghĩ rằng hóa lỏng hoạt động bằng cách thay đổi lưới.
Hãy tưởng tượng mỗi pixel được xác định bởi vị trí của nó trên lưới.
Bây giờ, khi người dùng nhấp vào một vị trí và di chuyển chuột, anh ấy đang thay đổi vị trí lưới.
Lưới mới lại được chiếu vào không gian có thể xem 2D của người dùng.

0

Kiểm tra this tutorial về cách thực hiện bộ lọc hóa lỏng bằng Javascript. Về cơ bản, trong hướng dẫn, hiệu ứng được thực hiện chuyển đổi tọa độ Cartesian pixel (x, y) thành tọa độ Polar (r, α) và sau đó áp dụng Math.sqrt trên r.