Pythonでheif-convertを実行してHEICファイルをJPEGに一括で変換する

カレントディレクトリの拡張子が「HEIC」のファイルが変換対象
変換後のファイル名はHEICファイルの拡張子を「jpg」に変えたもの

import subprocess
import glob

files = glob.glob('*.HEIC')
for file in files:
    file2 = file[:-5] + '.jpg'
    subprocess.run(['heif-convert', file, file2])

PythonでCSVファイルを辞書に変換する 1列目をキーにして2列目以降を値にする

PythonCSVファイルを辞書に変換する
1列目をキーにして2列目以降を値にする

CSVファイルの内容
sample.csv

k1,v11,v12
k2,v21,v22
k3,v31,v32
with open('sample.csv', 'r') as f:
  d = {}
  for line in f:
    k, v = line.rstrip().split(',', 1) #最初の1項目のみカンマで区切る
    d[k] = v

print(d)

プログラムの実行結果

{'k1': 'v11,v12', 'k2': 'v21,v22', 'k3': 'v31,v32'}

EndeavourOSで日本語入力を設定する

パッケージをインストールする

インストールするパッケージ
fcitx5, fcitx5-configtool, fcitx5-gtk, fcitx5-qt, fcitx5-mozc

最初の4個のパッケージは、「fcitx5-im」というグループに入っているので、
「fcitx5-im」をインストールすれば、まとめてインストールできる。

グループに入っているパッケージは、下記のコマンドで確認できる。

$ pacman -Sg fcitx5-im
fcitx5-im fcitx5
fcitx5-im fcitx5-configtool
fcitx5-im fcitx5-gtk
fcitx5-im fcitx5-qt

インストールコマンド

$ sudo pacman -S fcitx5-im fcitx5-mozc

環境変数を設定する

「~/.xprofile」を作成して、下記の内容を書き込む。

export GTK_IM_MODULE=fcitx5
export QT_IM_MODULE=fcitx5
export XMODIFIERS=@im=fcitx5

Python Pillow(PIL)で画像を読み込んでNumPyの配列に変換してRGBの要素ごとに編集する

下記の画像を使用しました。
Biljana JovanovicによるPixabayからの画像

from PIL import Image
import numpy as np

pil_img = Image.open('eggs-gbd58ab03b_640.png')
print('モード', pil_img.mode)

np_img = np.array(pil_img)   #PILからnumpyへ変換
np_img[:, :, 0] = 0   #赤の要素を削除
np_img[:, :, 1] = 0   #緑の要素を削除
new_pil_img = Image.fromarray(np_img)   #numpyからPILへ変換

new_pil_img.show()
new_pil_img.save('out.png')
元の画像
編集後の画像

Pythonのglobモジュールで複数の拡張子を指定してファイル一覧を取得する

カレントディレクトリの「画像」ディレクトリの中のファイルの中から
拡張子が「jpg」と「png」のファイルの一覧を取得する。

方法1
import glob

types = ('jpg', 'png')
files = []
for t in types:
    files += glob.glob('./画像/*.' + t)

for file in files:
    print(file)
方法2
import glob

for file in glob.glob('./画像/*'):
    type = file[-3:]
    if type in ('jpg', 'png'):
        print(file)
方法3
import glob
import re

for file in glob.glob('./画像/*'):
    if re.match('.+\.(png|jpg)$', file):
        print(file)

Pygame入門 ブロック崩しゲームを作る(途中) ボールと衝突したブロックを消す しかし、ボールはブロックに当たっても跳ね返らない

マウスの左クリックで開始します

import pygame
import sys

SCREEN = pygame.Rect(0, 0, 400, 400)
FPS = 30

WHITE = (255, 255, 255)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)

BALL_SIZE = 20

PADDLE_WIDTH = 60
PADDLE_HEIGHT = 5
PADDLE_POS_Y = SCREEN.bottom - 30

BLOCK_ROW = 5
BLOCK_COLUMN = 6
BLOCK_MARGIN = 10
BLOCK_WIDTH = ((SCREEN.width - BLOCK_MARGIN) / BLOCK_COLUMN) - BLOCK_MARGIN
BLOCK_HEIGHT = 20

class Ball(pygame.sprite.Sprite):
    def __init__(self, pos, speed):
        pygame.sprite.Sprite.__init__(self, self.containers)
        x, y = pos
        vx, vy = speed
        self.image = pygame.Surface((BALL_SIZE, BALL_SIZE))
        self.image.fill(WHITE)
        pygame.draw.circle(self.image, RED, self.image.get_rect().center, BALL_SIZE / 2)
        self.rect = pygame.Rect(x, y, BALL_SIZE, BALL_SIZE)
        self.vx = vx
        self.vy = vy
        self.update = self.start #これにより、updateメソッドが呼び出されるとstartメソッドが実行される

    def start(self):
        #Ballの初期X座標をPaddleのX座標にする
        self.rect.centerx = paddle.rect.centerx

        #マウスの左クリックによりBallを動かし始める
        if pygame.mouse.get_pressed()[0]:
            self.update = self.move #これにより、updateメソッドが呼び出されるとmoveメソッドが実行される

    def move(self):
        #Ballを移動させる
        self.rect.move_ip(self.vx, self.vy)
        #Paddleに当たったら跳ね返る
        if self.rect.colliderect(paddle.rect):
            self.vy = -self.vy
            self.rect.bottom = paddle.rect.top
        #画面の左端か右端に当たったら跳ね返る
        if self.rect.left < SCREEN.left or SCREEN.right < self.rect.right:
            self.vx = -self.vx
        #画面の上端に当たったら跳ね返る
        if self.rect.top < SCREEN.top:
            self.vy = -self.vy
        #画面の下端に当たったら止まる
        if SCREEN.bottom < self.rect.bottom:
            self.vx = 0
            self.vy = 0

        self.rect = self.rect.clamp(SCREEN) #SCREENから出ないようにする

class Paddle(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self, self.containers)
        self.image = pygame.Surface((PADDLE_WIDTH, PADDLE_HEIGHT))
        self.image.fill(GREEN)
        self.rect = pygame.Rect(0, PADDLE_POS_Y, PADDLE_WIDTH, PADDLE_HEIGHT)

    def update(self):
        self.rect.centerx = pygame.mouse.get_pos()[0] #Paddleの真ん中のX座標をマウスのX座標にする
        self.rect = self.rect.clamp(SCREEN) #SCREENから出ないようにする

class Block(pygame.sprite.Sprite):
    def __init__(self, pos):
        pygame.sprite.Sprite.__init__(self, self.containers)
        x, y = pos
        self.image = pygame.Surface((BLOCK_WIDTH, BLOCK_HEIGHT))
        self.image.fill(BLUE)
        self.rect = pygame.Rect(x, y, BLOCK_WIDTH, BLOCK_HEIGHT)

#main
pygame.init()
clock = pygame.time.Clock()
screen = pygame.display.set_mode(SCREEN.size)

sprite_group = pygame.sprite.Group() #すべてのスプライトの更新と描画を行うためのグループ
block_group = pygame.sprite.Group() #BallとBlockの衝突判定とBlockの削除を行うためのグループ
Ball.containers = sprite_group #これにより、Ballインスタンスが自動でsprite_groupに追加される
Paddle.containers = sprite_group #これにより、Paddleインスタンスが自動でsprite_groupに追加される
Block.containers = sprite_group, block_group #これにより、Blockインスタンスが自動でsprite_groupとblock_groupに追加される

ball = Ball((200, 150), (6, 6))
paddle = Paddle()
#Blockの作成
for r in range(BLOCK_ROW):
    for c in range(BLOCK_COLUMN):
        block_x =  BLOCK_MARGIN + (BLOCK_WIDTH + BLOCK_MARGIN) * c
        block_y = BLOCK_MARGIN + (BLOCK_HEIGHT + BLOCK_MARGIN) * r
        Block((block_x, block_y))

while True:
    #Ballと衝突したBlockを削除する
    #ballスプライトとblock_groupに属している各Blockスプライトの衝突を判定してくれる
    #3つ目の引数をTrueにするとballと衝突したBlockがblock_groupから削除される
    #それによりballと衝突したBlockは画面から消える。(画面描画はsprite_group.draw(screen)により行われているため。)
    pygame.sprite.spritecollide(ball, block_group, True)

    sprite_group.update()
    screen.fill(WHITE)
    sprite_group.draw(screen)
    pygame.display.update()
    clock.tick(FPS)

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()

PythonのSympyを使って2点を結ぶ2本の線分の交点の座標をベクトルを使って計算する

import numpy
import sympy

#点p1と点p2を結ぶ線分と点p3と点p4を結ぶ線分の交点を求める
def intersection(p1, p2, p3, p4):
    #各点をベクトルで表す
    a1 = numpy.array(p1)
    a2 = numpy.array(p2)
    a3 = numpy.array(p3)
    a4 = numpy.array(p4)

    #方程式で使う変数の準備
    k = sympy.Symbol('k')
    t = sympy.Symbol('t')

    #点p1と点p2を通るベクトル方程式
    vec1 = a1 + k * (a2 - a1)
    #点p3と点p4を通るベクトル方程式
    vec2 = a3 + t * (a4 - a3)

    eq1 = sympy.Eq(vec1[0], vec2[0])
    eq2 = sympy.Eq(vec1[1], vec2[1])

    s = sympy.solve((eq1, eq2))

    return (a1 + s[k] * (a2 - a1))

print(intersection((2,7),(6,1),(2,3),(6,5)))