2011-11-01 30 views
5

Hi tôi có hai Writablebitmap, một từ jpg và khác từ png và sử dụng phương pháp này để trộn màu sắc trong một vòng lặp:Png trên jpeg (hiệu ứng nước) chất lượng kém?

private static Color Mix(Color from, Color to, float percent) 
{ 
    float amountFrom = 1.0f - percent; 
    return Color.FromArgb(
     (byte)(from.A * amountFrom + to.A * percent), 
     (byte)(from.R * amountFrom + to.R * percent), 
     (byte)(from.G * amountFrom + to.G * percent), 
     (byte)(from.B * amountFrom + to.B * percent)); 
} 

Vấn đề của tôi là trong kênh alpha, kết quả hiệu ứng mờ của tôi là xấu (chất lượng)!

Result

Đây là png gốc.

Original Pgn

Đây là jpg gốc.

Original Jpg

Bất kỳ trợ giúp nào?

+0

Bạn có thể cụ thể hơn về " chất lượng kém "của watermark của bạn mà bạn muốn tránh? – ObscureRobot

+0

png của bạn là chống răng cưa, nó sẽ chỉ nhìn tốt trên nền trắng. Recompressing nó để jpeg là cổ bắn. Không có giải pháp đơn giản cho điều này, watermark không thể sử dụng anti-aliasing. –

+0

Tôi nghĩ rằng điều này đã làm với việc có một nguồn jpg. Nén mất dữ liệu trên một jpeg sử dụng các mô hình tâm lý để làm cho các hiện vật nén ít nhìn thấy hơn. Việc phủ một hình ảnh lên trên hình ảnh được nén này sẽ thổi mô hình này ra khỏi cò. Cách tốt nhất để giải quyết vấn đề này là sử dụng nguồn ảnh không nén được cho cả hình mờ và hình ảnh nguồn của bạn. –

Trả lời

5

Trong trường hợp này, bạn có thể không muốn kết quả nhận bất kỳ alpha nào từ hình mờ, bạn muốn giữ lại 100% độ mờ đục của JPEG. Thay vì đặt alpha mới thành from.A * amountFrom + to.A * percent, chỉ cần sử dụng from.A.

Chỉnh sửa: Ngoài ra, bạn muốn percent được điều chỉnh theo alpha của PNG. Dưới đây là mẫu của bạn, Cập nhật:

private static Color Mix(Color from, Color to, float percent) 
{ 
    float amountTo = percent * to.A/255.0; 
    float amountFrom = 1.0f - amountTo; 
    return Color.FromArgb( 
     from.A, 
     (byte)(from.R * amountFrom + to.R * amountTo), 
     (byte)(from.G * amountFrom + to.G * amountTo), 
     (byte)(from.B * amountFrom + to.B * amountTo)); 
} 

tôi chuyển đổi mã này vào Python và chạy hình ảnh mẫu của bạn thông qua nó với 0,5 phần trăm, đây là kết quả:

enter image description here

+0

Bạn đã nói trước khi có thể. 1 trên hình ảnh nếu tôi chỉ có thể đánh giá nó một cách riêng biệt. – Candide

+0

@Ingenu, tôi đã tự hỏi nếu có ai chú ý đến avatar mới của tôi. Tôi đã thay đổi nó đêm qua. –

+0

Tốt, được giải quyết, cảm ơn Mark nó hoạt động! – JoeLoco

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