basicapp3 Pythonで画像ファイルをドラッグ&ドロップして表示するひな形
Table of Contents
概要
Pythonで複数テキストファイルをドラッグ&ドロップして何かに変換するひな形です。
GUIの為にPyQt5を使っています。
画像表示の為にcv2(opencv-python)を使っています。
ファイルをドラッグ&ドロップすると、別ウィンドウで画像を表示します。
スクリーンショット
ソースコード
basicapp3.py
# coding: utf-8 import os,sys,re import fileproc,imageproc from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QTextEdit, QSlider class BasicApp3(QWidget): """ """ def __init__(self): super(BasicApp3, self).__init__() self.setAcceptDrops(True) self.initUi() def fileProc( self, filename ): self.textEdit.append("inputfile: " + filename) name, ext = os.path.splitext( os.path.basename(filename) ) outputfilename = os.path.join( os.path.dirname(filename), name + "_convert" + ext ) self.textEdit.append("outputfile: " + outputfilename) self.textEdit.append("\n") self.myImage = imageproc.MyImage() self.myImage.openfile(filename) self.textEdit.append("height=") self.textEdit.append(str(self.myImage.height)) self.textEdit.append("width=") self.textEdit.append(str(self.myImage.width)) self.textEdit.append("scale=") self.textEdit.append(str(self.myImage.scale)) self.textImageScale.setText(str(self.myImage.imageScale)) self.myImage.show(self.mouseEvent) def dragEnterEvent( self, event ): if event.mimeData().hasUrls(): event.accept() else: event.ignore() def dropEvent( self, event ): files = [u.toLocalFile() for u in event.mimeData().urls()] for f in files: self.fileProc(f) def doPlus(self, value): self.myImage.sizePlus() self.textImageScale.setText(str(self.myImage.imageScale)) def doMinus(self, value): self.myImage.sizeMinus() self.textImageScale.setText(str(self.myImage.imageScale)) def doCenter(self, value): self.myImage.sizeSet(1) self.slider.setValue(10); self.textImageScale.setText(str(self.myImage.imageScale)) def sliderMoved(self, value): self.myImage.sizeSet(value/100) self.textImageScale.setText(str(self.myImage.imageScale)) def mouseEvent(self, event, x, y, flags, param ): """ """ self.textEdit.append("pos=") self.textEdit.append(str(x)) self.textEdit.append(str(y)) pixelValue = self.myImage.getRGB(x,y) self.textEdit.append("R,G,B=") self.textEdit.append(str(pixelValue[2])) self.textEdit.append(str(pixelValue[1])) self.textEdit.append(str(pixelValue[0])) def doClear(self, value): self.textEdit.clear() def initUi(self): self.textImageScale = QTextEdit(self) self.textImageScale.resize(70,20) self.textImageScale.move(10,220) self.textImageScale.setReadOnly(1) self.btnPlus = QPushButton(u'+',self) self.btnPlus.resize(20,20) self.btnPlus.move(80,220) self.btnPlus.clicked.connect(self.doPlus) self.btnCenter = QPushButton(u'.',self) self.btnCenter.resize(20,20) self.btnCenter.move(100,220) self.btnCenter.clicked.connect(self.doCenter) self.btnMinus = QPushButton(u'-',self) self.btnMinus.resize(20,20) self.btnMinus.move(120,220) self.btnMinus.clicked.connect(self.doMinus) self.btnClear = QPushButton(u'clear',self) self.btnClear.move(200,220) self.btnClear.clicked.connect(self.doClear) self.textEdit = QTextEdit(self) self.textEdit.resize(500,200) self.textEdit.setReadOnly(1) self.slider = QSlider(1,self) self.slider.setTickInterval(1); self.slider.setMaximum(1000); self.slider.setValue(10); self.slider.move(10,250) self.slider.sliderMoved.connect(self.sliderMoved) self.show() def main(): """ """ app = QApplication(sys.argv) w = BasicApp3() w.setWindowTitle('BasicApp3') w.resize(500, 300) w.move(0, 0) sys.exit(app.exec_()) if __name__ == '__main__': main()
fileproc.py
def FileProc(inputFileName,outputFileName): file = open(inputFileName) file_content = file.read() outputfile = open(outputFileName,'w') outputfile.write(file_content) outputfile.close()
imageproc.py
# coding: utf-8 import numpy as np import cv2 class MyImage: """ """ def __init__(self): self.imageScale = 1; def openfile(self,inputFileName): screen_res = 2560, 1440 self.img = cv2.imread(inputFileName,cv2.IMREAD_UNCHANGED) self.scale = min((screen_res[0] / self.img.shape[1]), (screen_res[1] / self.img.shape[0])) self.windowHeight = int(self.img.shape[0]*self.scale) self.windowWidth = int(self.img.shape[1]*self.scale) self.height = int(self.img.shape[0]) self.width = int(self.img.shape[1]) def show(self,func): cv2.namedWindow('img', cv2.WINDOW_AUTOSIZE) cv2.setMouseCallback('img', func) cv2.resizeWindow('img',self.windowWidth,self.windowHeight) self.displayImg = cv2.resize(self.img,dsize=None,fx=self.imageScale,fy=self.imageScale, interpolation = cv2.INTER_NEAREST ) cv2.imshow('img',self.displayImg) def sizePlus(self): self.imageScale += 0.01 self.displayImg = cv2.resize(self.img,dsize=None,fx=self.imageScale,fy=self.imageScale) cv2.imshow('img',self.displayImg) def sizeMinus(self): self.imageScale -= 0.01 self.displayImg = cv2.resize(self.img,dsize=None,fx=self.imageScale,fy=self.imageScale) cv2.imshow('img',self.displayImg) def sizeSet(self,value): self.imageScale = max(value,0.01) self.displayImg = cv2.resize(self.img,dsize=None,fx=self.imageScale,fy=self.imageScale) cv2.imshow('img',self.displayImg) def getRGB(self,x,y): return self.img[y,x]
参考
- pythonで他の.pyプログラムを実行する - Qiita
- Python入門 - クラス
- Python - クラスを外部ファイル化して外から使用する方法 | 非IT企業に勤める中年サラリーマンのIT日記
- Python - OpenCV - imread - 画像を表示する - コードログ
- OpenCV - resize で画像をリサイズする方法 - Pynote
- PyQt(PySide)で画像処理その3(OpenCVとの連携) - tata色々な備忘録
- QSlider Class | Qt 4.8
- QSlider - 頑張って続けます
- Python OpenCVの基礎 画素へのアクセス - Pythonの学習の過程とか
- 【Python/OpenCV】バイキュービック補間法で拡大・縮小 | 技術雑記
- 画像の幾何変換 ― OpenCV-Python Tutorials 1 documentation
- PythonとOpenCVで画像処理(2)【ウィンドウ、画像のサイズ変更】 - 無能プログラマーのお勉強おメモ
- PythonとOpenCVで画像処理(4)【マウスイベント】 - 無能プログラマーのお勉強おメモ
- PythonとOpenCVで画像処理(5)【トラックバー】 - 無能プログラマーのお勉強おメモ