Python Image Libraryを使用して、すべての白いピクセルを透明にしようとしています。 (私はpythonを学ぼうとしているCハッカーですので、穏やかです)変換は機能しています(少なくともピクセル値は正しく見えます)が、リストをバッファーに変換する方法がわかりませんイメージを再作成します。ここにコードがあります
img = Image.open('img.png')
imga = img.convert("RGBA")
datas = imga.getdata()
newData = list()
for item in datas:
if item[0] == 255 and item[1] == 255 and item[2] == 255:
newData.append([255, 255, 255, 0])
else:
newData.append(item)
imgb = Image.frombuffer("RGBA", imga.size, newData, "raw", "RGBA", 0, 1)
imgb.save("img2.png", "PNG")
次の変更を行う必要があります。
(255, 255, 255, 0)
_を追加します_[255, 255, 255, 0]
_img.putdata(newData)
を使用しますこれは作業コードです:
_from PIL import Image
img = Image.open('img.png')
img = img.convert("RGBA")
datas = img.getdata()
newData = []
for item in datas:
if item[0] == 255 and item[1] == 255 and item[2] == 255:
newData.append((255, 255, 255, 0))
else:
newData.append(item)
img.putdata(newData)
img.save("img2.png", "PNG")
_
ピクセルアクセスモードを使用して、画像をその場で変更することもできます。
from PIL import Image
img = Image.open('img.png')
img = img.convert("RGBA")
pixdata = img.load()
width, height = image.size
for y in xrange(height):
for x in xrange(width):
if pixdata[x, y] == (255, 255, 255, 255):
pixdata[x, y] = (255, 255, 255, 0)
img.save("img2.png", "PNG")
import Image
import ImageMath
def distance2(a, b):
return (a[0] - b[0]) * (a[0] - b[0]) + (a[1] - b[1]) * (a[1] - b[1]) + (a[2] - b[2]) * (a[2] - b[2])
def makeColorTransparent(image, color, thresh2=0):
image = image.convert("RGBA")
red, green, blue, alpha = image.split()
image.putalpha(ImageMath.eval("""convert(((((t - d(c, (r, g, b))) >> 31) + 1) ^ 1) * a, 'L')""",
t=thresh2, d=distance2, c=color, r=red, g=green, b=blue, a=alpha))
return image
if __== '__main__':
import sys
makeColorTransparent(Image.open(sys.argv[1]), (255, 255, 255)).save(sys.argv[2]);
これは現在、「真っ白から透明まで」を探している最初のGoogleの結果であるため、numpyでも同じことが達成できることを付け加えたいと思います。 10倍高速です(提案されたソリューションの3.28秒に対して約300ミリ秒)。コードも少し短くなっています。
_import numpy as np
def white_to_transparency(img):
x = np.asarray(img.convert('RGBA')).copy()
x[:, :, 3] = (255 * (x[:, :, :3] != 255).any(axis=2)).astype(np.uint8)
return Image.fromarray(x)
_
また、「ほぼ白」(たとえば、1つのチャネルが255ではなく254)が「ほぼ透明」なバージョンに簡単に変更できます。もちろん、これにより、純粋な黒を除いて、画像全体が部分的に透明になります。
_def white_to_transparency_gradient(img):
x = np.asarray(img.convert('RGBA')).copy()
x[:, :, 3] = (255 - x[:, :, :3].mean(axis=2)).astype(np.uint8)
return Image.fromarray(x)
_
注:デフォルトではPillowイメージは読み取り専用配列に変換されるため、.copy()
が必要です。
Dir内のすべてのファイルを含むPython 3バージョン
import glob
from PIL import Image
def transparent(myimage):
img = Image.open(myimage)
img = img.convert("RGBA")
pixdata = img.load()
width, height = img.size
for y in range(height):
for x in range(width):
if pixdata[x, y] == (255, 255, 255, 255):
pixdata[x, y] = (255, 255, 255, 0)
img.save(myimage, "PNG")
for image in glob.glob("*.png"):
transparent(image)