[Python] 357 画像に枠を描画

[M1 Mac, Ventura 13.3.1, Python 3.10.4]

macOSのプレビューでは外枠を直接描けないようなので、Pythonで描きました。

下のスクリプトでは太さ2pxの黒い外枠を描画します。

C++画像加工アプリにこの機能を追加したいです。

import cv2
import numpy as np

# 画像ファイル設定
pic_name="test.PNG"
pic_name_out="test2.PNG"

# 枠ピクセル数
num_insert=2

# 画像読み込み
img = cv2.imread(pic_name,cv2.IMREAD_COLOR)

# 枠追加処理(上下)
bk1=np.zeros((num_insert,img.shape[1],3),np.uint8)

# 上下枠色設定
bk1[:,:,0]=bk1[:,:,0]+0 # 青
bk1[:,:,1]=bk1[:,:,1]+0 # 緑
bk1[:,:,2]=bk1[:,:,2]+0 # 赤
array=np.insert(img, 0, bk1, axis=0)
array=np.insert(array, array.shape[0], bk1, axis=0)

# 枠追加処理(左右)
bk2=np.zeros((array.shape[0],num_insert,3),np.uint8)

# 左右枠色設定
bk2[:,:,0]=bk2[:,:,0]+0 # 青
bk2[:,:,1]=bk2[:,:,1]+0 # 緑
bk2[:,:,2]=bk2[:,:,2]+0 # 赤
array=np.insert(array, [0], bk2, axis=1)
array=np.insert(array, [array.shape[1]], bk2, axis=1)

# 画像出力
cv2.imwrite(pic_name_out,np.array(array))

参考サイト

[Swift] 29 ChatGPTアプリ製作 その1 クリップボード貼付

[M1 Mac, Ventura 13.3.1, Xcode 14.3]

ChatGPTアプリiOS版の製作に着手しました。

取りあえずリクエスト文を入力できるようにしました。メモアプリのコードを一部流用しています。

クリップボードからテキストをペーストできます。macOSなどからOSをまたいでのペーストは次回以降対応するつもりです。

次にこれをAPIに送信してレスポンスを表示するようにします。

2023/7/4追記
TextEditorのタップ時にPasteやSelect Allなどが選択できるため、緑字のペーストボタンは削除しました。

アプリ画面
TextEditor画面
import SwiftUI

struct Draft: View {
    @State var text = ""
    @FocusState var nameFieldIsForcused: Bool
    @Environment(\.managedObjectContext)var viewContext
    var interaction: Interaction?

    var body: some View {
        TextEditor(text:$text)
            .frame(minHeight: 0, maxHeight: .infinity) // 行数無制限
            .focused($nameFieldIsForcused)
            .onAppear{
                DispatchQueue.main.asyncAfter(deadline:DispatchTime.now()+0.5){
                    nameFieldIsForcused = true
                }
            }
            .toolbar{
                ToolbarItem(placement:.navigationBarLeading){
                    if(nameFieldIsForcused){
                        Button(action:{
                            pasteText()

                        }){
                            Text("ペースト")
                            .foregroundColor(.green)
                        }
                    }
                }

                ToolbarItem(placement:.navigationBarTrailing){
                    if(nameFieldIsForcused){
                        Button(action:{
                            if interaction != nil{
                                updateContent(interaction: self.interaction!)
                            }else{
                                addContent()
                            }

                        }){
                            Text("完了")
                        }
                    }
                }
            }
    }

    func updateContent(interaction:Interaction){
        interaction.request = text
        
        do{
            try viewContext.save()
        }catch{
            fatalError("セーブに失敗")
        }

        nameFieldIsForcused = false
    }

    func addContent(){
        let newContent = Interaction(context:viewContext)
        newContent.request = text
        
        do{
            try viewContext.save()
            
        }catch{
            fatalError("セーブに失敗")
        }

        nameFieldIsForcused = false

    }

    func pasteText(){
        let pasteboard = UIPasteboard.general

        if let clipboardString = pasteboard.string {
            text += clipboardString
        }
    }
}

struct Draft_Previews: PreviewProvider {
    static var previews: some View {
        Draft()
    }
}