2012-02-04 38 views
5

Có một số câu hỏi tương tự về SO, nhưng không có câu hỏi nào trong số chúng thực sự hữu ích. Về cơ bản tôi đang cố gắng để thay đổi kích thước một hình ảnh png đơn giản, như đã thấy ở đây:Đổi kích thước png trong suốt với Thư viện hình ảnh Python và hiệu ứng quầng

http://media.spiralknights.com/wiki-images/3/3e/Equipment-Proto_Sword_icon.png (từ mmo Spiral Knights, bản quyền Three Rings Entertainment)

Ban đầu tôi đã thực hiện một tiện ích trong đó sử dụng những hình ảnh trong php, và tiện ích thay đổi kích thước ở đó hoạt động hoàn hảo tốt. Tôi đã sử dụng phương pháp được mô tả trên trang imagecopyresampled trong tài liệu của PHP.

Thành thật mà nói, tôi thậm chí không thể thay đổi kích thước tốt hơn trong Photoshop, nhưng kết quả gần như tai hại trong python. Tôi liên tục nhận được hiệu ứng hào quang, và tôi tin rằng điều này ít nhất là một phần cho các giá trị RGBA thực tế của các pixel trong suốt. Ở đây, hình ảnh này cho nó tốt hơn:

resize examples

(thứ hai để thay đổi kích thước cuối cùng chỉ là một gợi ý tôi thấy trên diễn đàn khác để thay đổi kích thước đầu tiên hai lần kích thước cuối cùng, và nó DID giúp đỡ ít nhất một chút, nhưng không đủ)

Hình ảnh đã ở chế độ RGBA khi đang được thay đổi kích thước.

Như bạn có thể thấy việc thay đổi kích thước của PHP và Photoshop là không có quầng. Thành thật mà nói, tất cả mọi thứ, nhưng PHP thay đổi kích thước làm quá nhiều công việc, tôi thích bảng màu tối thiểu trong hình ảnh php (nếu bạn nhìn vào các phiên bản lớn hơn bạn có thể thấy rằng PHP thay đổi kích thước sử dụng ít hơn giữa các màu), nhưng tôi có thể sống với cách Photoshop đã thay đổi kích thước nó, hoặc thậm chí phần bên trong của kích thước python thay đổi, nhưng quầng là không thể chấp nhận được. Có vẻ như với tôi - và sửa tôi nếu tôi sai - rằng PHP và Photoshop dường như không biết sử dụng màu của các điểm ảnh trong kênh alpha khi nội suy, nhưng python đang sử dụng đường viền ánh sáng đó, đó là minh bạch khác, trong kích thước của nó. Không may là có rất nhiều biểu tượng khác nhau mà tôi cần phải thay đổi kích thước, với các cấu hình khác nhau, vì vậy chúng không đơn giản như hình tròn này, nhưng đây chỉ là biểu tượng đầu tiên tôi đang sử dụng trong khi thử nghiệm.

Đó là không nhiều của một câu hỏi mã trong và của chính nó, nhưng nếu bạn cần một cái gì đó để nhìn vào thì đây là ý chính:

>> import Image 
>> img = Image.open('swordorig.png') 
>> img 
<PngImagePlugin.PngImageFile image mode=RGBA size=256x256 at 0x2A3AF58> 
>> img.resize((36,36), Image.ANTIALIAS).save('swordresize.png') 

cuối cùng câu hỏi hạnh phúc: có cách nào để nói PIL KHÔNG sử dụng màu của một pixel có alpha là 0 trong khi lấy lại mẫu?

+0

Không biết PIL, nhưng bạn có cố gắng sử dụng RGBa (không phải RGBA) để hướng dẫn nó xem xét hình ảnh là alpha được xử lý trước không? – rotoglup

+1

Tôi đã không, vì vậy cảm ơn cho đề nghị! Thật không may có vẻ như PIL không thể viết RGBa như png. "IOError: không thể ghi chế độ RGBa là PNG" – cogs

+0

Nếu bạn thích kết quả Bicubic Photoshop, có thể 'Image.BICUBIC' hoặc' Image.NEAREST' sẽ tốt hơn? http://pastebin.com/VRBKWZUh – reclosedev

Trả lời

6

Cảm ơn mọi người đã trả lời! Và đặc biệt là rotoglup cho tôi biết thuật ngữ cho những gì tôi đang thực sự tìm kiếm. Đi qua các trang tràn ngăn xếp cho alpha được cấp phép trước trong PIL tôi đã tìm thấy một giải pháp hoạt động; đây là một tấm bản cập nhật của đồ họa thay đổi kích thước:

resize sheet 2

Các thanh màu xám chỉ là để đưa ra một ấn tượng về những gì họ sẽ như thế nào trên một nền nhẹ.

https://stackoverflow.com/a/6882161/1189554

Nhờ madlag

Vì vậy, mã của tôi kết thúc lên tim như thế này:

>> import Image, numpy 
>> img = Image.open('swordorig.png') 
>> premult = numpy.fromstring(img.tostring(), dtype=numpy.uint8) 
>> alphaLayer = premult[3::4]/255.0 
>> premult[::4] *= alphaLayer 
>> premult[1::4] *= alphaLayer 
>> premult[2::4] *= alphaLayer 
>> img = Image.fromstring("RGBA", img.size, premult.tostring()) 
>> img.resize((36,36), Image.ANTIALIAS).save('swordresize.png') 

Và bạn sẽ có được biểu tượng đó là trên dưới cùng của bảng. Vẫn còn nhiều màu sắc hơn so với phiên bản PHP, và một chiếc nhẫn rất nhẹ, nhưng tổng thể nhiều, đẹp hơn nhiều. Tôi chắc chắn rằng các thuật toán có thể được tinh chỉnh để cải thiện nó nhiều hơn. Một lần nữa cảm ơn mọi người đã trả lời!

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