Start create python version.
3
.idea/.gitignore
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
# Default ignored files
|
||||
/shelf/
|
||||
/workspace.xml
|
6
.idea/encodings.xml
Normal file
@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="Encoding">
|
||||
<file url="file://$PROJECT_DIR$/cpp/skeletonApp/skeletonApp/skeletonApp.cpp" charset="UTF-8" />
|
||||
</component>
|
||||
</project>
|
48
.idea/inspectionProfiles/Project_Default.xml
Normal file
@ -0,0 +1,48 @@
|
||||
<component name="InspectionProjectProfileManager">
|
||||
<profile version="1.0">
|
||||
<option name="myName" value="Project Default" />
|
||||
<inspection_tool class="PyArgumentEqualDefaultInspection" enabled="true" level="WEAK WARNING" enabled_by_default="true" />
|
||||
<inspection_tool class="PyAugmentAssignmentInspection" enabled="true" level="WEAK WARNING" enabled_by_default="true" />
|
||||
<inspection_tool class="PyClassicStyleClassInspection" enabled="true" level="WARNING" enabled_by_default="true" />
|
||||
<inspection_tool class="PyCompatibilityInspection" enabled="true" level="WARNING" enabled_by_default="true">
|
||||
<option name="ourVersions">
|
||||
<value>
|
||||
<list size="5">
|
||||
<item index="0" class="java.lang.String" itemvalue="3.7" />
|
||||
<item index="1" class="java.lang.String" itemvalue="3.8" />
|
||||
<item index="2" class="java.lang.String" itemvalue="3.9" />
|
||||
<item index="3" class="java.lang.String" itemvalue="3.10" />
|
||||
<item index="4" class="java.lang.String" itemvalue="3.10" />
|
||||
</list>
|
||||
</value>
|
||||
</option>
|
||||
</inspection_tool>
|
||||
<inspection_tool class="PyMandatoryEncodingInspection" enabled="true" level="WARNING" enabled_by_default="true" />
|
||||
<inspection_tool class="PyMissingOrEmptyDocstringInspection" enabled="true" level="WEAK WARNING" enabled_by_default="true" />
|
||||
<inspection_tool class="PyMissingTypeHintsInspection" enabled="true" level="WEAK WARNING" enabled_by_default="true" />
|
||||
<inspection_tool class="PyPackageRequirementsInspection" enabled="true" level="WARNING" enabled_by_default="true">
|
||||
<option name="ignoredPackages">
|
||||
<value>
|
||||
<list size="1">
|
||||
<item index="0" class="java.lang.String" itemvalue="argparse" />
|
||||
</list>
|
||||
</value>
|
||||
</option>
|
||||
</inspection_tool>
|
||||
<inspection_tool class="PyPep8NamingInspection" enabled="true" level="WEAK WARNING" enabled_by_default="true">
|
||||
<option name="ignoredErrors">
|
||||
<list>
|
||||
<option value="N802" />
|
||||
<option value="N803" />
|
||||
</list>
|
||||
</option>
|
||||
</inspection_tool>
|
||||
<inspection_tool class="PyUnresolvedReferencesInspection" enabled="true" level="WARNING" enabled_by_default="true">
|
||||
<option name="ignoredIdentifiers">
|
||||
<list>
|
||||
<option value="anc.models.samples.Sample._meta" />
|
||||
</list>
|
||||
</option>
|
||||
</inspection_tool>
|
||||
</profile>
|
||||
</component>
|
6
.idea/inspectionProfiles/profiles_settings.xml
Normal file
@ -0,0 +1,6 @@
|
||||
<component name="InspectionProjectProfileManager">
|
||||
<settings>
|
||||
<option name="USE_PROJECT_PROFILE" value="false" />
|
||||
<version value="1.0" />
|
||||
</settings>
|
||||
</component>
|
10
.idea/lpo-image-processing.iml
Normal file
@ -0,0 +1,10 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<module type="PYTHON_MODULE" version="4">
|
||||
<component name="NewModuleRootManager">
|
||||
<content url="file://$MODULE_DIR$">
|
||||
<excludeFolder url="file://$MODULE_DIR$/venv" />
|
||||
</content>
|
||||
<orderEntry type="jdk" jdkName="Python 3.9 (lpo-image-processing)" jdkType="Python SDK" />
|
||||
<orderEntry type="sourceFolder" forTests="false" />
|
||||
</component>
|
||||
</module>
|
7
.idea/misc.xml
Normal file
@ -0,0 +1,7 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.9 (lpo-image-processing)" project-jdk-type="Python SDK" />
|
||||
<component name="PythonCompatibilityInspectionAdvertiser">
|
||||
<option name="version" value="3" />
|
||||
</component>
|
||||
</project>
|
8
.idea/modules.xml
Normal file
@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="ProjectModuleManager">
|
||||
<modules>
|
||||
<module fileurl="file://$PROJECT_DIR$/.idea/lpo-image-processing.iml" filepath="$PROJECT_DIR$/.idea/lpo-image-processing.iml" />
|
||||
</modules>
|
||||
</component>
|
||||
</project>
|
6
.idea/vcs.xml
Normal file
@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="VcsDirectoryMappings">
|
||||
<mapping directory="$PROJECT_DIR$" vcs="Git" />
|
||||
</component>
|
||||
</project>
|
3
cpp/skeletonApp/skeletonApp/SkeletonApp_en_150.ts
Normal file
@ -0,0 +1,3 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!DOCTYPE TS>
|
||||
<TS version="2.1" language="en_150"></TS>
|
@ -1,484 +1,483 @@
|
||||
#include <QToolBar>
|
||||
#include <QIcon>
|
||||
#include <QClipboard>
|
||||
#include <QColorSpace>
|
||||
#include <QDir>
|
||||
#include <QFileDialog>
|
||||
#include <QImageReader>
|
||||
#include <QImageWriter>
|
||||
#include <QBuffer>
|
||||
#include <QLabel>
|
||||
#include <QMenuBar>
|
||||
#include <QMessageBox>
|
||||
#include <QMimeData>
|
||||
#include <QPainter>
|
||||
#include <QScreen>
|
||||
#include <QScrollArea>
|
||||
#include <QScrollBar>
|
||||
#include <QStandardPaths>
|
||||
#include <QStatusBar>
|
||||
#include <iostream>
|
||||
#include <fstream>
|
||||
|
||||
|
||||
#include "skeletonApp.h"
|
||||
|
||||
skeletonApp::skeletonApp(QWidget *parent)
|
||||
: QMainWindow(parent), imageLabel(new QLabel)
|
||||
, scrollArea(new QScrollArea)
|
||||
{
|
||||
ui.setupUi(this);
|
||||
|
||||
imageLabel->setBackgroundRole(QPalette::Base);
|
||||
imageLabel->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored);
|
||||
imageLabel->setScaledContents(true);
|
||||
|
||||
scrollArea->setBackgroundRole(QPalette::Dark);
|
||||
scrollArea->setWidget(imageLabel);
|
||||
scrollArea->setVisible(false);
|
||||
setCentralWidget(scrollArea);
|
||||
|
||||
createActions();
|
||||
|
||||
resize(QGuiApplication::primaryScreen()->availableSize() * 3 / 5);
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
bool skeletonApp::loadFile(const QString& fileName)
|
||||
{
|
||||
|
||||
data.clear();
|
||||
|
||||
QImageReader reader(fileName);
|
||||
reader.setAutoTransform(true);
|
||||
const QImage newImage = reader.read();
|
||||
if (newImage.isNull()) {
|
||||
QMessageBox::information(this, QGuiApplication::applicationDisplayName(),
|
||||
tr("Cannot load %1: %2")
|
||||
.arg(QDir::toNativeSeparators(fileName), reader.errorString()));
|
||||
return false;
|
||||
}
|
||||
|
||||
//testFilter->setEnabled(true);
|
||||
filtersMenu->setDisabled(false);
|
||||
|
||||
setImage(newImage);
|
||||
|
||||
|
||||
|
||||
width = image.width();
|
||||
height = image.height();
|
||||
int bitPlanes = image.bitPlaneCount();
|
||||
int depth = image.depth();
|
||||
QImage::Format format = image.format();
|
||||
int bytesPerLine = image.bytesPerLine();//niezale¿nie od formatu( pbm, pgm, ppm), wyrównanie do 4B
|
||||
|
||||
|
||||
nbChannels = 1;
|
||||
if (image.depth() > 1)
|
||||
nbChannels = image.depth() / 8;
|
||||
|
||||
nbRealChannels = 1;
|
||||
if (image.bitPlaneCount() > 1)
|
||||
nbRealChannels = image.bitPlaneCount() / 8;
|
||||
|
||||
std::ofstream file("test_zapisu.txt", std::ios::out);
|
||||
|
||||
if (file.good())
|
||||
{
|
||||
|
||||
for (int i = 0; i < image.height(); i++)
|
||||
{
|
||||
std::vector<std::vector<int>> row;
|
||||
|
||||
for (int j = 0; j < image.width(); j++)
|
||||
{
|
||||
QRgb impix = image.pixel(j, i);//pixel() dzia³a w logice pixel(x,y) - najpierw specyfikuje kolumnê
|
||||
|
||||
std::vector<int> pixel;
|
||||
|
||||
switch (nbChannels)
|
||||
{
|
||||
case 1:
|
||||
pixel = { qRed(impix) };
|
||||
file << pixel[0] << " ";
|
||||
break;
|
||||
case 3:
|
||||
pixel = { qRed(impix), qGreen(impix), (int)qBlue(impix) };
|
||||
file << pixel[0] << " " << pixel[1] << " " << pixel[2];
|
||||
break;
|
||||
case 4:
|
||||
pixel = { qRed(impix), qGreen(impix), qBlue(impix), qAlpha(impix) };
|
||||
file << pixel[0] << " " << pixel[1] << " " << pixel[2] << " " << pixel[3];
|
||||
break;
|
||||
}
|
||||
file << "\n";
|
||||
row.push_back(pixel);
|
||||
}
|
||||
// file << "\n";
|
||||
data.push_back(row);
|
||||
//std::cout << "\n";
|
||||
}
|
||||
|
||||
file.close();
|
||||
}
|
||||
setWindowFilePath(fileName);
|
||||
|
||||
|
||||
const QString message = tr("Opened \"%1\", %2x%3, Depth: %4, Bit planes: %5")
|
||||
.arg(QDir::toNativeSeparators(fileName)).arg(image.width()).arg(image.height()).arg(image.depth()).arg(image.bitPlaneCount());
|
||||
statusBar()->showMessage(message);
|
||||
return true;
|
||||
}
|
||||
|
||||
void skeletonApp::setImage(const QImage& newImage)
|
||||
{
|
||||
image = newImage;
|
||||
if (image.colorSpace().isValid())
|
||||
image.convertToColorSpace(QColorSpace::SRgb);
|
||||
imageLabel->setPixmap(QPixmap::fromImage(image));
|
||||
scaleFactor = 1.0;
|
||||
|
||||
scrollArea->setVisible(true);
|
||||
// printAct->setEnabled(true);
|
||||
fitToWindowAct->setEnabled(true);
|
||||
updateActions();
|
||||
|
||||
if (!fitToWindowAct->isChecked())
|
||||
imageLabel->adjustSize();
|
||||
}
|
||||
|
||||
|
||||
void skeletonApp::scaleImage(double factor)
|
||||
{
|
||||
scaleFactor *= factor;
|
||||
imageLabel->resize(scaleFactor * imageLabel->pixmap(Qt::ReturnByValue).size());
|
||||
|
||||
adjustScrollBar(scrollArea->horizontalScrollBar(), factor);
|
||||
adjustScrollBar(scrollArea->verticalScrollBar(), factor);
|
||||
|
||||
zoomInAct->setEnabled(scaleFactor < 3.0);
|
||||
zoomOutAct->setEnabled(scaleFactor > 0.333);
|
||||
}
|
||||
|
||||
|
||||
void skeletonApp::adjustScrollBar(QScrollBar* scrollBar, double factor)
|
||||
{
|
||||
scrollBar->setValue(int(factor * scrollBar->value()
|
||||
+ ((factor - 1) * scrollBar->pageStep() / 2)));
|
||||
}
|
||||
|
||||
|
||||
void skeletonApp::about()
|
||||
{
|
||||
QMessageBox::about(this, tr("About skeletonApp"),
|
||||
tr("<p>Aplikacja<b> szkieletowa</b> do kursu <i>Przetwarzanie obrazu</i></p>"));
|
||||
}
|
||||
|
||||
|
||||
|
||||
bool skeletonApp::saveFile(const QString& fileName)
|
||||
{
|
||||
QImageWriter writer(fileName);
|
||||
|
||||
if (!writer.write(image)) {
|
||||
QMessageBox::information(this, QGuiApplication::applicationDisplayName(),
|
||||
tr("Cannot write %1: %2")
|
||||
.arg(QDir::toNativeSeparators(fileName)), writer.errorString());
|
||||
return false;
|
||||
}
|
||||
const QString message = tr("Wrote \"%1\"").arg(QDir::toNativeSeparators(fileName));
|
||||
statusBar()->showMessage(message);
|
||||
return true;
|
||||
}
|
||||
|
||||
//! [1]
|
||||
|
||||
static void initializeImageFileDialog(QFileDialog& dialog, QFileDialog::AcceptMode acceptMode)
|
||||
{
|
||||
static bool firstDialog = true;
|
||||
|
||||
if (firstDialog) {
|
||||
firstDialog = false;
|
||||
const QStringList picturesLocations = QStandardPaths::standardLocations(QStandardPaths::PicturesLocation);
|
||||
dialog.setDirectory(picturesLocations.isEmpty() ? QDir::currentPath() : picturesLocations.last());
|
||||
}
|
||||
|
||||
QStringList mimeTypeFilters;
|
||||
const QByteArrayList supportedMimeTypes = acceptMode == QFileDialog::AcceptOpen
|
||||
? QImageReader::supportedMimeTypes() : QImageWriter::supportedMimeTypes();
|
||||
for (const QByteArray& mimeTypeName : supportedMimeTypes)
|
||||
mimeTypeFilters.append(mimeTypeName);
|
||||
mimeTypeFilters.sort();
|
||||
|
||||
dialog.setMimeTypeFilters(mimeTypeFilters);
|
||||
dialog.selectMimeTypeFilter("image/x-portable-pixmap");
|
||||
if (acceptMode == QFileDialog::AcceptSave)
|
||||
dialog.setDefaultSuffix("ppm");
|
||||
}
|
||||
|
||||
void skeletonApp::open()
|
||||
{
|
||||
QFileDialog dialog(this, tr("Open File"));
|
||||
initializeImageFileDialog(dialog, QFileDialog::AcceptOpen);
|
||||
|
||||
while (dialog.exec() == QDialog::Accepted && !loadFile(dialog.selectedFiles().first())) {}
|
||||
}
|
||||
//! [1]
|
||||
|
||||
void skeletonApp::saveAs()
|
||||
{
|
||||
QFileDialog dialog(this, tr("Save File As"));
|
||||
initializeImageFileDialog(dialog, QFileDialog::AcceptSave);
|
||||
|
||||
while (dialog.exec() == QDialog::Accepted && !saveFile(dialog.selectedFiles().first())) {}
|
||||
}
|
||||
|
||||
|
||||
|
||||
void skeletonApp::copy()
|
||||
{
|
||||
#ifndef QT_NO_CLIPBOARD
|
||||
QGuiApplication::clipboard()->setImage(image);
|
||||
#endif // !QT_NO_CLIPBOARD
|
||||
}
|
||||
|
||||
#ifndef QT_NO_CLIPBOARD
|
||||
static QImage clipboardImage()
|
||||
{
|
||||
if (const QMimeData* mimeData = QGuiApplication::clipboard()->mimeData()) {
|
||||
if (mimeData->hasImage()) {
|
||||
const QImage image = qvariant_cast<QImage>(mimeData->imageData());
|
||||
if (!image.isNull())
|
||||
return image;
|
||||
}
|
||||
}
|
||||
return QImage();
|
||||
}
|
||||
#endif // !QT_NO_CLIPBOARD
|
||||
|
||||
|
||||
void skeletonApp::paste()
|
||||
{
|
||||
#ifndef QT_NO_CLIPBOARD
|
||||
const QImage newImage = clipboardImage();
|
||||
if (newImage.isNull()) {
|
||||
statusBar()->showMessage(tr("No image in clipboard"));
|
||||
}
|
||||
else {
|
||||
setImage(newImage);
|
||||
setWindowFilePath(QString());
|
||||
const QString message = tr("Obtained image from clipboard, %1x%2, Depth: %3")
|
||||
.arg(newImage.width()).arg(newImage.height()).arg(newImage.depth());
|
||||
statusBar()->showMessage(message);
|
||||
}
|
||||
#endif // !QT_NO_CLIPBOARD
|
||||
}
|
||||
|
||||
void skeletonApp::zoomIn()
|
||||
{
|
||||
scaleImage(1.25);
|
||||
}
|
||||
|
||||
void skeletonApp::zoomOut()
|
||||
{
|
||||
scaleImage(0.8);
|
||||
}
|
||||
|
||||
void skeletonApp::normalSize()
|
||||
{
|
||||
imageLabel->adjustSize();
|
||||
scaleFactor = 1.0;
|
||||
}
|
||||
|
||||
|
||||
void skeletonApp::fitToWindow()
|
||||
{
|
||||
bool fitToWindow = fitToWindowAct->isChecked();
|
||||
scrollArea->setWidgetResizable(fitToWindow);
|
||||
if (!fitToWindow)
|
||||
normalSize();
|
||||
updateActions();
|
||||
}
|
||||
|
||||
|
||||
|
||||
void skeletonApp::applyTestFilter()
|
||||
{
|
||||
dataResult.clear();
|
||||
|
||||
for (int i = 0; i < height; i++)
|
||||
{
|
||||
std::vector<std::vector<int>> row;
|
||||
for (int j = 0; j < width; j++)
|
||||
{
|
||||
std::vector<int> pixel;
|
||||
|
||||
for (int k = 0; k < nbRealChannels; k++)
|
||||
{
|
||||
pixel.push_back(255 - data[i][j][k]);
|
||||
}//k
|
||||
|
||||
if (nbRealChannels < nbChannels)
|
||||
pixel.push_back(255);
|
||||
|
||||
row.push_back(pixel);
|
||||
}//j
|
||||
dataResult.push_back(row);
|
||||
}//i
|
||||
|
||||
|
||||
//uchar* img = new uchar[width * height * nbChannels];
|
||||
|
||||
//std::vector<int> img;
|
||||
|
||||
//for (int i = 0; i < height; i++)
|
||||
//{
|
||||
// for (int j = 0; j < width; j++)
|
||||
// {
|
||||
// //std::vector<int> pixel1;
|
||||
|
||||
// for (int k = 0; k < nbChannels; k++)
|
||||
// {
|
||||
// uchar t;
|
||||
// t = (uchar)dataResult[i][j][k];
|
||||
|
||||
|
||||
// //img[i * width * nbChannels + j * nbChannels + k] = (uchar)dataResult[i][j][k];
|
||||
// img.push_back(dataResult[i][j][k]);
|
||||
|
||||
// }//k
|
||||
// }//j
|
||||
//}//i
|
||||
|
||||
|
||||
|
||||
//std::ofstream file("test_zapisu_1.txt", std::ios::out);
|
||||
|
||||
//if (file.good())
|
||||
//{
|
||||
|
||||
// for (int i = 0; i < image.height(); i++)//obraz jest w pliku zapisany
|
||||
// {
|
||||
|
||||
// for (int j = 0; j < image.width(); j++)
|
||||
// {
|
||||
// file << img[i * width + j];
|
||||
// }
|
||||
// file << "\n";
|
||||
// }
|
||||
|
||||
// file.close();
|
||||
//}
|
||||
|
||||
|
||||
//const QByteArray dat = QByteArray::fromRawData(reinterpret_cast<const char*>(img.data()), img.size());
|
||||
//QBuffer buffer(&dat);
|
||||
// QImageReader reader(&buffer);
|
||||
imageResult = QImage(width, height, image.format());
|
||||
|
||||
if (nbChannels > 1)
|
||||
for (int i = 0; i < image.height(); i++)//obraz jest w pliku zapisany
|
||||
for (int j = 0; j < image.width(); j++)
|
||||
imageResult.setPixel(j, i, qRgba(dataResult[i][j][0], dataResult[i][j][1], dataResult[i][j][2], dataResult[i][j][3]));
|
||||
else
|
||||
if (image.bitPlaneCount() == 8)
|
||||
for (int i = 0; i < image.height(); i++)//obraz jest w pliku zapisany
|
||||
for (int j = 0; j < image.width(); j++)
|
||||
imageResult.setPixel(j, i, qRgba(dataResult[i][j][0], dataResult[i][j][0], dataResult[i][j][0],255));
|
||||
else
|
||||
{
|
||||
imageResult.setColorCount(2);
|
||||
imageResult.setColor(0, qRgba(0, 0, 0, 255)); // Index #0 = Red
|
||||
imageResult.setColor(1, qRgba(255, 0, 0, 0));
|
||||
|
||||
for (int i = 0; i < image.height(); i++)//obraz jest w pliku zapisany
|
||||
for (int j = 0; j < image.width(); j++)
|
||||
{
|
||||
if (dataResult[i][j][0] == 0)
|
||||
imageResult.setPixel(j, i, 0);
|
||||
else
|
||||
imageResult.setPixel(j, i, 1);
|
||||
}
|
||||
|
||||
}
|
||||
//imageResult = QImage(img,width,height,image.format());
|
||||
|
||||
|
||||
|
||||
setImage(imageResult);
|
||||
}
|
||||
|
||||
|
||||
|
||||
void skeletonApp::updateActions()
|
||||
{
|
||||
saveAsAct->setEnabled(!image.isNull());
|
||||
copyAct->setEnabled(!image.isNull());
|
||||
zoomInAct->setEnabled(!fitToWindowAct->isChecked());
|
||||
zoomOutAct->setEnabled(!fitToWindowAct->isChecked());
|
||||
normalSizeAct->setEnabled(!fitToWindowAct->isChecked());
|
||||
}
|
||||
|
||||
void skeletonApp::createActions()
|
||||
{
|
||||
QMenu* fileMenu = menuBar()->addMenu(tr("&File"));
|
||||
|
||||
QAction* openAct = fileMenu->addAction(tr("&Open..."), this, &skeletonApp::open);
|
||||
openAct->setShortcut(QKeySequence::Open);
|
||||
|
||||
saveAsAct = fileMenu->addAction(tr("&Save As..."), this, &skeletonApp::saveAs);
|
||||
saveAsAct->setEnabled(false);
|
||||
|
||||
|
||||
fileMenu->addSeparator();
|
||||
|
||||
QAction* exitAct = fileMenu->addAction(tr("E&xit"), this, &QWidget::close);
|
||||
exitAct->setShortcut(tr("Ctrl+Q"));
|
||||
|
||||
QMenu* editMenu = menuBar()->addMenu(tr("&Edit"));
|
||||
|
||||
copyAct = editMenu->addAction(tr("&Copy"), this, &skeletonApp::copy);
|
||||
copyAct->setShortcut(QKeySequence::Copy);
|
||||
copyAct->setEnabled(false);
|
||||
|
||||
QAction* pasteAct = editMenu->addAction(tr("&Paste"), this, &skeletonApp::paste);
|
||||
pasteAct->setShortcut(QKeySequence::Paste);
|
||||
|
||||
QMenu* viewMenu = menuBar()->addMenu(tr("&View"));
|
||||
|
||||
zoomInAct = viewMenu->addAction(tr("Zoom &In (25%)"), this, &skeletonApp::zoomIn);
|
||||
zoomInAct->setShortcut(QKeySequence::ZoomIn);
|
||||
zoomInAct->setEnabled(false);
|
||||
|
||||
zoomOutAct = viewMenu->addAction(tr("Zoom &Out (25%)"), this, &skeletonApp::zoomOut);
|
||||
zoomOutAct->setShortcut(QKeySequence::ZoomOut);
|
||||
zoomOutAct->setEnabled(false);
|
||||
|
||||
normalSizeAct = viewMenu->addAction(tr("&Normal Size"), this, &skeletonApp::normalSize);
|
||||
normalSizeAct->setShortcut(tr("Ctrl+S"));
|
||||
normalSizeAct->setEnabled(false);
|
||||
|
||||
viewMenu->addSeparator();
|
||||
|
||||
fitToWindowAct = viewMenu->addAction(tr("&Fit to Window"), this, &skeletonApp::fitToWindow);
|
||||
fitToWindowAct->setEnabled(false);
|
||||
fitToWindowAct->setCheckable(true);
|
||||
fitToWindowAct->setShortcut(tr("Ctrl+F"));
|
||||
|
||||
filtersMenu = menuBar()->addMenu(tr("&Filters"));
|
||||
filtersMenu->setDisabled(true);
|
||||
|
||||
testFilter = filtersMenu->addAction(tr("&TestFilter"), this, &skeletonApp::applyTestFilter);
|
||||
//testFilter->setDisabled(true);
|
||||
|
||||
|
||||
QMenu* helpMenu = menuBar()->addMenu(tr("&Help"));
|
||||
|
||||
helpMenu->addAction(tr("&About"), this, &skeletonApp::about);
|
||||
|
||||
}
|
||||
|
||||
#include <QToolBar>
|
||||
#include <QIcon>
|
||||
#include <QClipboard>
|
||||
#include <QColorSpace>
|
||||
#include <QDir>
|
||||
#include <QFileDialog>
|
||||
#include <QImageReader>
|
||||
#include <QImageWriter>
|
||||
#include <QBuffer>
|
||||
#include <QLabel>
|
||||
#include <QMenuBar>
|
||||
#include <QMessageBox>
|
||||
#include <QMimeData>
|
||||
#include <QPainter>
|
||||
#include <QScreen>
|
||||
#include <QScrollArea>
|
||||
#include <QScrollBar>
|
||||
#include <QStandardPaths>
|
||||
#include <QStatusBar>
|
||||
#include <iostream>
|
||||
#include <fstream>
|
||||
|
||||
|
||||
#include "skeletonApp.h"
|
||||
|
||||
skeletonApp::skeletonApp(QWidget *parent): QMainWindow(parent),
|
||||
imageLabel(new QLabel), scrollArea(new QScrollArea)
|
||||
{
|
||||
ui.setupUi(this);
|
||||
|
||||
imageLabel->setBackgroundRole(QPalette::Base);
|
||||
imageLabel->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored);
|
||||
imageLabel->setScaledContents(true);
|
||||
|
||||
scrollArea->setBackgroundRole(QPalette::Dark);
|
||||
scrollArea->setWidget(imageLabel);
|
||||
scrollArea->setVisible(false);
|
||||
setCentralWidget(scrollArea);
|
||||
|
||||
createActions();
|
||||
|
||||
resize(QGuiApplication::primaryScreen()->availableSize() * 3 / 5);
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
bool skeletonApp::loadFile(const QString& fileName)
|
||||
{
|
||||
|
||||
data.clear();
|
||||
|
||||
QImageReader reader(fileName);
|
||||
reader.setAutoTransform(true);
|
||||
const QImage newImage = reader.read();
|
||||
if (newImage.isNull()) {
|
||||
QMessageBox::information(this, QGuiApplication::applicationDisplayName(),
|
||||
tr("Cannot load %1: %2")
|
||||
.arg(QDir::toNativeSeparators(fileName), reader.errorString()));
|
||||
return false;
|
||||
}
|
||||
|
||||
//testFilter->setEnabled(true);
|
||||
filtersMenu->setDisabled(false);
|
||||
|
||||
setImage(newImage);
|
||||
|
||||
|
||||
|
||||
width = image.width();
|
||||
height = image.height();
|
||||
int bitPlanes = image.bitPlaneCount();
|
||||
int depth = image.depth();
|
||||
QImage::Format format = image.format();
|
||||
int bytesPerLine = image.bytesPerLine();//niezale<6C>nie od formatu( pbm, pgm, ppm), wyr<79>wnanie do 4B
|
||||
|
||||
|
||||
nbChannels = 1;
|
||||
if (image.depth() > 1)
|
||||
nbChannels = image.depth() / 8;
|
||||
|
||||
nbRealChannels = 1;
|
||||
if (image.bitPlaneCount() > 1)
|
||||
nbRealChannels = image.bitPlaneCount() / 8;
|
||||
|
||||
std::ofstream file("test_zapisu.txt", std::ios::out);
|
||||
|
||||
if (file.good())
|
||||
{
|
||||
|
||||
for (int i = 0; i < image.height(); i++)
|
||||
{
|
||||
std::vector<std::vector<int>> row;
|
||||
|
||||
for (int j = 0; j < image.width(); j++)
|
||||
{
|
||||
QRgb impix = image.pixel(j, i);//pixel() dzia<69>a w logice pixel(x,y) - najpierw specyfikuje kolumn<6D>
|
||||
|
||||
std::vector<int> pixel;
|
||||
|
||||
switch (nbChannels)
|
||||
{
|
||||
case 1:
|
||||
pixel = { qRed(impix) };
|
||||
file << pixel[0] << " ";
|
||||
break;
|
||||
case 3:
|
||||
pixel = { qRed(impix), qGreen(impix), (int)qBlue(impix) };
|
||||
file << pixel[0] << " " << pixel[1] << " " << pixel[2];
|
||||
break;
|
||||
case 4:
|
||||
pixel = { qRed(impix), qGreen(impix), qBlue(impix), qAlpha(impix) };
|
||||
file << pixel[0] << " " << pixel[1] << " " << pixel[2] << " " << pixel[3];
|
||||
break;
|
||||
}
|
||||
file << "\n";
|
||||
row.push_back(pixel);
|
||||
}
|
||||
// file << "\n";
|
||||
data.push_back(row);
|
||||
//std::cout << "\n";
|
||||
}
|
||||
|
||||
file.close();
|
||||
}
|
||||
setWindowFilePath(fileName);
|
||||
|
||||
|
||||
const QString message = tr("Opened \"%1\", %2x%3, Depth: %4, Bit planes: %5")
|
||||
.arg(QDir::toNativeSeparators(fileName)).arg(image.width()).arg(image.height()).arg(image.depth()).arg(image.bitPlaneCount());
|
||||
statusBar()->showMessage(message);
|
||||
return true;
|
||||
}
|
||||
|
||||
void skeletonApp::setImage(const QImage& newImage)
|
||||
{
|
||||
image = newImage;
|
||||
if (image.colorSpace().isValid())
|
||||
image.convertToColorSpace(QColorSpace::SRgb);
|
||||
imageLabel->setPixmap(QPixmap::fromImage(image));
|
||||
scaleFactor = 1.0;
|
||||
|
||||
scrollArea->setVisible(true);
|
||||
// printAct->setEnabled(true);
|
||||
fitToWindowAct->setEnabled(true);
|
||||
updateActions();
|
||||
|
||||
if (!fitToWindowAct->isChecked())
|
||||
imageLabel->adjustSize();
|
||||
}
|
||||
|
||||
|
||||
void skeletonApp::scaleImage(double factor)
|
||||
{
|
||||
scaleFactor *= factor;
|
||||
imageLabel->resize(scaleFactor * imageLabel->pixmap(Qt::ReturnByValue).size());
|
||||
|
||||
adjustScrollBar(scrollArea->horizontalScrollBar(), factor);
|
||||
adjustScrollBar(scrollArea->verticalScrollBar(), factor);
|
||||
|
||||
zoomInAct->setEnabled(scaleFactor < 3.0);
|
||||
zoomOutAct->setEnabled(scaleFactor > 0.333);
|
||||
}
|
||||
|
||||
|
||||
void skeletonApp::adjustScrollBar(QScrollBar* scrollBar, double factor)
|
||||
{
|
||||
scrollBar->setValue(int(factor * scrollBar->value()
|
||||
+ ((factor - 1) * scrollBar->pageStep() / 2)));
|
||||
}
|
||||
|
||||
|
||||
void skeletonApp::about()
|
||||
{
|
||||
QMessageBox::about(this, tr("About skeletonApp"),
|
||||
tr("<p>Aplikacja<b> szkieletowa</b> do kursu <i>Przetwarzanie obrazu</i></p>"));
|
||||
}
|
||||
|
||||
|
||||
|
||||
bool skeletonApp::saveFile(const QString& fileName)
|
||||
{
|
||||
QImageWriter writer(fileName);
|
||||
|
||||
if (!writer.write(image)) {
|
||||
QMessageBox::information(this, QGuiApplication::applicationDisplayName(),
|
||||
tr("Cannot write %1: %2")
|
||||
.arg(QDir::toNativeSeparators(fileName)), writer.errorString());
|
||||
return false;
|
||||
}
|
||||
const QString message = tr("Wrote \"%1\"").arg(QDir::toNativeSeparators(fileName));
|
||||
statusBar()->showMessage(message);
|
||||
return true;
|
||||
}
|
||||
|
||||
//! [1]
|
||||
|
||||
static void initializeImageFileDialog(QFileDialog& dialog, QFileDialog::AcceptMode acceptMode)
|
||||
{
|
||||
static bool firstDialog = true;
|
||||
|
||||
if (firstDialog) {
|
||||
firstDialog = false;
|
||||
const QStringList picturesLocations = QStandardPaths::standardLocations(QStandardPaths::PicturesLocation);
|
||||
dialog.setDirectory(picturesLocations.isEmpty() ? QDir::currentPath() : picturesLocations.last());
|
||||
}
|
||||
|
||||
QStringList mimeTypeFilters;
|
||||
const QByteArrayList supportedMimeTypes = acceptMode == QFileDialog::AcceptOpen
|
||||
? QImageReader::supportedMimeTypes() : QImageWriter::supportedMimeTypes();
|
||||
for (const QByteArray& mimeTypeName : supportedMimeTypes)
|
||||
mimeTypeFilters.append(mimeTypeName);
|
||||
mimeTypeFilters.sort();
|
||||
|
||||
dialog.setMimeTypeFilters(mimeTypeFilters);
|
||||
dialog.selectMimeTypeFilter("image/x-portable-pixmap");
|
||||
if (acceptMode == QFileDialog::AcceptSave)
|
||||
dialog.setDefaultSuffix("ppm");
|
||||
}
|
||||
|
||||
void skeletonApp::open()
|
||||
{
|
||||
QFileDialog dialog(this, tr("Open File"));
|
||||
initializeImageFileDialog(dialog, QFileDialog::AcceptOpen);
|
||||
|
||||
while (dialog.exec() == QDialog::Accepted && !loadFile(dialog.selectedFiles().first())) {}
|
||||
}
|
||||
//! [1]
|
||||
|
||||
void skeletonApp::saveAs()
|
||||
{
|
||||
QFileDialog dialog(this, tr("Save File As"));
|
||||
initializeImageFileDialog(dialog, QFileDialog::AcceptSave);
|
||||
|
||||
while (dialog.exec() == QDialog::Accepted && !saveFile(dialog.selectedFiles().first())) {}
|
||||
}
|
||||
|
||||
|
||||
|
||||
void skeletonApp::copy()
|
||||
{
|
||||
#ifndef QT_NO_CLIPBOARD
|
||||
QGuiApplication::clipboard()->setImage(image);
|
||||
#endif // !QT_NO_CLIPBOARD
|
||||
}
|
||||
|
||||
#ifndef QT_NO_CLIPBOARD
|
||||
static QImage clipboardImage()
|
||||
{
|
||||
if (const QMimeData* mimeData = QGuiApplication::clipboard()->mimeData()) {
|
||||
if (mimeData->hasImage()) {
|
||||
const QImage image = qvariant_cast<QImage>(mimeData->imageData());
|
||||
if (!image.isNull())
|
||||
return image;
|
||||
}
|
||||
}
|
||||
return QImage();
|
||||
}
|
||||
#endif // !QT_NO_CLIPBOARD
|
||||
|
||||
|
||||
void skeletonApp::paste()
|
||||
{
|
||||
#ifndef QT_NO_CLIPBOARD
|
||||
const QImage newImage = clipboardImage();
|
||||
if (newImage.isNull()) {
|
||||
statusBar()->showMessage(tr("No image in clipboard"));
|
||||
}
|
||||
else {
|
||||
setImage(newImage);
|
||||
setWindowFilePath(QString());
|
||||
const QString message = tr("Obtained image from clipboard, %1x%2, Depth: %3")
|
||||
.arg(newImage.width()).arg(newImage.height()).arg(newImage.depth());
|
||||
statusBar()->showMessage(message);
|
||||
}
|
||||
#endif // !QT_NO_CLIPBOARD
|
||||
}
|
||||
|
||||
void skeletonApp::zoomIn()
|
||||
{
|
||||
scaleImage(1.25);
|
||||
}
|
||||
|
||||
void skeletonApp::zoomOut()
|
||||
{
|
||||
scaleImage(0.8);
|
||||
}
|
||||
|
||||
void skeletonApp::normalSize()
|
||||
{
|
||||
imageLabel->adjustSize();
|
||||
scaleFactor = 1.0;
|
||||
}
|
||||
|
||||
|
||||
void skeletonApp::fitToWindow()
|
||||
{
|
||||
bool fitToWindow = fitToWindowAct->isChecked();
|
||||
scrollArea->setWidgetResizable(fitToWindow);
|
||||
if (!fitToWindow)
|
||||
normalSize();
|
||||
updateActions();
|
||||
}
|
||||
|
||||
|
||||
|
||||
void skeletonApp::applyTestFilter()
|
||||
{
|
||||
dataResult.clear();
|
||||
|
||||
for (int i = 0; i < height; i++)
|
||||
{
|
||||
std::vector<std::vector<int>> row;
|
||||
for (int j = 0; j < width; j++)
|
||||
{
|
||||
std::vector<int> pixel;
|
||||
|
||||
for (int k = 0; k < nbRealChannels; k++)
|
||||
{
|
||||
pixel.push_back(255 - data[i][j][k]);
|
||||
}//k
|
||||
|
||||
if (nbRealChannels < nbChannels)
|
||||
pixel.push_back(255);
|
||||
|
||||
row.push_back(pixel);
|
||||
}//j
|
||||
dataResult.push_back(row);
|
||||
}//i
|
||||
|
||||
|
||||
//uchar* img = new uchar[width * height * nbChannels];
|
||||
|
||||
//std::vector<int> img;
|
||||
|
||||
//for (int i = 0; i < height; i++)
|
||||
//{
|
||||
// for (int j = 0; j < width; j++)
|
||||
// {
|
||||
// //std::vector<int> pixel1;
|
||||
|
||||
// for (int k = 0; k < nbChannels; k++)
|
||||
// {
|
||||
// uchar t;
|
||||
// t = (uchar)dataResult[i][j][k];
|
||||
|
||||
|
||||
// //img[i * width * nbChannels + j * nbChannels + k] = (uchar)dataResult[i][j][k];
|
||||
// img.push_back(dataResult[i][j][k]);
|
||||
|
||||
// }//k
|
||||
// }//j
|
||||
//}//i
|
||||
|
||||
|
||||
|
||||
//std::ofstream file("test_zapisu_1.txt", std::ios::out);
|
||||
|
||||
//if (file.good())
|
||||
//{
|
||||
|
||||
// for (int i = 0; i < image.height(); i++)//obraz jest w pliku zapisany
|
||||
// {
|
||||
|
||||
// for (int j = 0; j < image.width(); j++)
|
||||
// {
|
||||
// file << img[i * width + j];
|
||||
// }
|
||||
// file << "\n";
|
||||
// }
|
||||
|
||||
// file.close();
|
||||
//}
|
||||
|
||||
|
||||
//const QByteArray dat = QByteArray::fromRawData(reinterpret_cast<const char*>(img.data()), img.size());
|
||||
//QBuffer buffer(&dat);
|
||||
// QImageReader reader(&buffer);
|
||||
imageResult = QImage(width, height, image.format());
|
||||
|
||||
if (nbChannels > 1)
|
||||
for (int i = 0; i < image.height(); i++)//obraz jest w pliku zapisany
|
||||
for (int j = 0; j < image.width(); j++)
|
||||
imageResult.setPixel(j, i, qRgba(dataResult[i][j][0], dataResult[i][j][1], dataResult[i][j][2], dataResult[i][j][3]));
|
||||
else
|
||||
if (image.bitPlaneCount() == 8)
|
||||
for (int i = 0; i < image.height(); i++)//obraz jest w pliku zapisany
|
||||
for (int j = 0; j < image.width(); j++)
|
||||
imageResult.setPixel(j, i, qRgba(dataResult[i][j][0], dataResult[i][j][0], dataResult[i][j][0],255));
|
||||
else
|
||||
{
|
||||
imageResult.setColorCount(2);
|
||||
imageResult.setColor(0, qRgba(0, 0, 0, 255)); // Index #0 = Red
|
||||
imageResult.setColor(1, qRgba(255, 0, 0, 0));
|
||||
|
||||
for (int i = 0; i < image.height(); i++)//obraz jest w pliku zapisany
|
||||
for (int j = 0; j < image.width(); j++)
|
||||
{
|
||||
if (dataResult[i][j][0] == 0)
|
||||
imageResult.setPixel(j, i, 0);
|
||||
else
|
||||
imageResult.setPixel(j, i, 1);
|
||||
}
|
||||
|
||||
}
|
||||
//imageResult = QImage(img,width,height,image.format());
|
||||
|
||||
|
||||
|
||||
setImage(imageResult);
|
||||
}
|
||||
|
||||
|
||||
|
||||
void skeletonApp::updateActions()
|
||||
{
|
||||
saveAsAct->setEnabled(!image.isNull());
|
||||
copyAct->setEnabled(!image.isNull());
|
||||
zoomInAct->setEnabled(!fitToWindowAct->isChecked());
|
||||
zoomOutAct->setEnabled(!fitToWindowAct->isChecked());
|
||||
normalSizeAct->setEnabled(!fitToWindowAct->isChecked());
|
||||
}
|
||||
|
||||
void skeletonApp::createActions()
|
||||
{
|
||||
QMenu* fileMenu = menuBar()->addMenu(tr("&File"));
|
||||
|
||||
QAction* openAct = fileMenu->addAction(tr("&Open..."), this, &skeletonApp::open);
|
||||
openAct->setShortcut(QKeySequence::Open);
|
||||
|
||||
saveAsAct = fileMenu->addAction(tr("&Save As..."), this, &skeletonApp::saveAs);
|
||||
saveAsAct->setEnabled(false);
|
||||
|
||||
|
||||
fileMenu->addSeparator();
|
||||
|
||||
QAction* exitAct = fileMenu->addAction(tr("E&xit"), this, &QWidget::close);
|
||||
exitAct->setShortcut(tr("Ctrl+Q"));
|
||||
|
||||
QMenu* editMenu = menuBar()->addMenu(tr("&Edit"));
|
||||
|
||||
copyAct = editMenu->addAction(tr("&Copy"), this, &skeletonApp::copy);
|
||||
copyAct->setShortcut(QKeySequence::Copy);
|
||||
copyAct->setEnabled(false);
|
||||
|
||||
QAction* pasteAct = editMenu->addAction(tr("&Paste"), this, &skeletonApp::paste);
|
||||
pasteAct->setShortcut(QKeySequence::Paste);
|
||||
|
||||
QMenu* viewMenu = menuBar()->addMenu(tr("&View"));
|
||||
|
||||
zoomInAct = viewMenu->addAction(tr("Zoom &In (25%)"), this, &skeletonApp::zoomIn);
|
||||
zoomInAct->setShortcut(QKeySequence::ZoomIn);
|
||||
zoomInAct->setEnabled(false);
|
||||
|
||||
zoomOutAct = viewMenu->addAction(tr("Zoom &Out (25%)"), this, &skeletonApp::zoomOut);
|
||||
zoomOutAct->setShortcut(QKeySequence::ZoomOut);
|
||||
zoomOutAct->setEnabled(false);
|
||||
|
||||
normalSizeAct = viewMenu->addAction(tr("&Normal Size"), this, &skeletonApp::normalSize);
|
||||
normalSizeAct->setShortcut(tr("Ctrl+S"));
|
||||
normalSizeAct->setEnabled(false);
|
||||
|
||||
viewMenu->addSeparator();
|
||||
|
||||
fitToWindowAct = viewMenu->addAction(tr("&Fit to Window"), this, &skeletonApp::fitToWindow);
|
||||
fitToWindowAct->setEnabled(false);
|
||||
fitToWindowAct->setCheckable(true);
|
||||
fitToWindowAct->setShortcut(tr("Ctrl+F"));
|
||||
|
||||
filtersMenu = menuBar()->addMenu(tr("&Filters"));
|
||||
filtersMenu->setDisabled(true);
|
||||
|
||||
testFilter = filtersMenu->addAction(tr("&TestFilter"), this, &skeletonApp::applyTestFilter);
|
||||
//testFilter->setDisabled(true);
|
||||
|
||||
|
||||
QMenu* helpMenu = menuBar()->addMenu(tr("&Help"));
|
||||
|
||||
helpMenu->addAction(tr("&About"), this, &skeletonApp::about);
|
||||
|
||||
}
|
||||
|
||||
|
27
cpp/skeletonApp/skeletonApp/skeletonApp.pro
Normal file
@ -0,0 +1,27 @@
|
||||
QT += core gui
|
||||
|
||||
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
|
||||
|
||||
CONFIG += c++20
|
||||
|
||||
# You can make your code fail to compile if it uses deprecated APIs.
|
||||
# In order to do so, uncomment the following line.
|
||||
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
|
||||
|
||||
SOURCES += \
|
||||
main.cpp \
|
||||
skeletonApp.cpp
|
||||
|
||||
HEADERS += \
|
||||
skeletonApp.h
|
||||
|
||||
FORMS += \
|
||||
skeletonApp.ui
|
||||
|
||||
TRANSLATIONS += \
|
||||
SkeletonApp_en_150.ts
|
||||
|
||||
# Default rules for deployment.
|
||||
qnx: target.path = /tmp/$${TARGET}/bin
|
||||
else: unix:!android: target.path = /opt/$${TARGET}/bin
|
||||
!isEmpty(target.path): INSTALLS += target
|
@ -1,15 +0,0 @@
|
||||
[[source]]
|
||||
url = "https://pypi.org/simple"
|
||||
verify_ssl = true
|
||||
name = "pypi"
|
||||
|
||||
[packages]
|
||||
pyqt6 = "*"
|
||||
pip = "*"
|
||||
pyqt6-sip = "*"
|
||||
pyqt5 = "*"
|
||||
|
||||
[dev-packages]
|
||||
|
||||
[requires]
|
||||
python_version = "3.9"
|
2
python/__init__.py
Normal file
@ -0,0 +1,2 @@
|
||||
"""Import classes"""
|
||||
from skeletonApp import SkeletonApp
|
BIN
python/icons/Information.chm
Normal file
BIN
python/icons/all-icons-1.png
Normal file
After Width: | Height: | Size: 238 KiB |
BIN
python/icons/disabled/bmp/16x16/Find text.bmp
Normal file
After Width: | Height: | Size: 822 B |
BIN
python/icons/disabled/bmp/16x16/New file.bmp
Normal file
After Width: | Height: | Size: 822 B |
BIN
python/icons/disabled/bmp/16x16/Palette.bmp
Normal file
After Width: | Height: | Size: 822 B |
BIN
python/icons/disabled/bmp/20x20/Find text.bmp
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
python/icons/disabled/bmp/20x20/New file.bmp
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
python/icons/disabled/bmp/20x20/Palette.bmp
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
python/icons/disabled/bmp/24x24/Find text.bmp
Normal file
After Width: | Height: | Size: 1.7 KiB |
BIN
python/icons/disabled/bmp/24x24/New file.bmp
Normal file
After Width: | Height: | Size: 1.7 KiB |
BIN
python/icons/disabled/bmp/24x24/Palette.bmp
Normal file
After Width: | Height: | Size: 1.7 KiB |
BIN
python/icons/disabled/bmp/32x32/Find text.bmp
Normal file
After Width: | Height: | Size: 3.1 KiB |
BIN
python/icons/disabled/bmp/32x32/New file.bmp
Normal file
After Width: | Height: | Size: 3.1 KiB |
BIN
python/icons/disabled/bmp/32x32/Palette.bmp
Normal file
After Width: | Height: | Size: 3.1 KiB |
BIN
python/icons/disabled/bmp/48x48/Find text.bmp
Normal file
After Width: | Height: | Size: 6.8 KiB |
BIN
python/icons/disabled/bmp/48x48/New file.bmp
Normal file
After Width: | Height: | Size: 6.8 KiB |
BIN
python/icons/disabled/bmp/48x48/Palette.bmp
Normal file
After Width: | Height: | Size: 6.8 KiB |
BIN
python/icons/disabled/gif/16x16/Find text.gif
Normal file
After Width: | Height: | Size: 370 B |
BIN
python/icons/disabled/gif/16x16/New file.gif
Normal file
After Width: | Height: | Size: 244 B |
BIN
python/icons/disabled/gif/16x16/Palette.gif
Normal file
After Width: | Height: | Size: 404 B |
BIN
python/icons/disabled/gif/20x20/Find text.gif
Normal file
After Width: | Height: | Size: 429 B |
BIN
python/icons/disabled/gif/20x20/New file.gif
Normal file
After Width: | Height: | Size: 296 B |
BIN
python/icons/disabled/gif/20x20/Palette.gif
Normal file
After Width: | Height: | Size: 501 B |
BIN
python/icons/disabled/gif/24x24/Find text.gif
Normal file
After Width: | Height: | Size: 505 B |
BIN
python/icons/disabled/gif/24x24/New file.gif
Normal file
After Width: | Height: | Size: 341 B |
BIN
python/icons/disabled/gif/24x24/Palette.gif
Normal file
After Width: | Height: | Size: 601 B |
BIN
python/icons/disabled/gif/32x32/Find text.gif
Normal file
After Width: | Height: | Size: 642 B |
BIN
python/icons/disabled/gif/32x32/New file.gif
Normal file
After Width: | Height: | Size: 464 B |
BIN
python/icons/disabled/gif/32x32/Palette.gif
Normal file
After Width: | Height: | Size: 820 B |
BIN
python/icons/disabled/gif/48x48/Find text.gif
Normal file
After Width: | Height: | Size: 968 B |
BIN
python/icons/disabled/gif/48x48/New file.gif
Normal file
After Width: | Height: | Size: 669 B |
BIN
python/icons/disabled/gif/48x48/Palette.gif
Normal file
After Width: | Height: | Size: 1.3 KiB |
BIN
python/icons/disabled/ico/Find text.ico
Normal file
After Width: | Height: | Size: 22 KiB |
BIN
python/icons/disabled/ico/New file.ico
Normal file
After Width: | Height: | Size: 22 KiB |
BIN
python/icons/disabled/ico/Palette.ico
Normal file
After Width: | Height: | Size: 22 KiB |
BIN
python/icons/disabled/png/16x16/Find text.png
Normal file
After Width: | Height: | Size: 619 B |
BIN
python/icons/disabled/png/16x16/New file.png
Normal file
After Width: | Height: | Size: 392 B |
BIN
python/icons/disabled/png/16x16/Palette.png
Normal file
After Width: | Height: | Size: 683 B |
BIN
python/icons/disabled/png/20x20/Find text.png
Normal file
After Width: | Height: | Size: 780 B |
BIN
python/icons/disabled/png/20x20/New file.png
Normal file
After Width: | Height: | Size: 442 B |
BIN
python/icons/disabled/png/20x20/Palette.png
Normal file
After Width: | Height: | Size: 920 B |
BIN
python/icons/disabled/png/24x24/Find text.png
Normal file
After Width: | Height: | Size: 960 B |
BIN
python/icons/disabled/png/24x24/New file.png
Normal file
After Width: | Height: | Size: 514 B |
BIN
python/icons/disabled/png/24x24/Palette.png
Normal file
After Width: | Height: | Size: 1.1 KiB |
BIN
python/icons/disabled/png/32x32/Find text.png
Normal file
After Width: | Height: | Size: 1.3 KiB |
BIN
python/icons/disabled/png/32x32/New file.png
Normal file
After Width: | Height: | Size: 704 B |
BIN
python/icons/disabled/png/32x32/Palette.png
Normal file
After Width: | Height: | Size: 1.6 KiB |
BIN
python/icons/disabled/png/48x48/Find text.png
Normal file
After Width: | Height: | Size: 2.0 KiB |
BIN
python/icons/disabled/png/48x48/New file.png
Normal file
After Width: | Height: | Size: 985 B |
BIN
python/icons/disabled/png/48x48/Palette.png
Normal file
After Width: | Height: | Size: 2.7 KiB |
BIN
python/icons/hot/bmp/16x16/Find text.bmp
Normal file
After Width: | Height: | Size: 822 B |
BIN
python/icons/hot/bmp/16x16/New file.bmp
Normal file
After Width: | Height: | Size: 822 B |
BIN
python/icons/hot/bmp/16x16/Palette.bmp
Normal file
After Width: | Height: | Size: 822 B |
BIN
python/icons/hot/bmp/20x20/Find text.bmp
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
python/icons/hot/bmp/20x20/New file.bmp
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
python/icons/hot/bmp/20x20/Palette.bmp
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
python/icons/hot/bmp/24x24/Find text.bmp
Normal file
After Width: | Height: | Size: 1.7 KiB |
BIN
python/icons/hot/bmp/24x24/New file.bmp
Normal file
After Width: | Height: | Size: 1.7 KiB |
BIN
python/icons/hot/bmp/24x24/Palette.bmp
Normal file
After Width: | Height: | Size: 1.7 KiB |
BIN
python/icons/hot/bmp/32x32/Find text.bmp
Normal file
After Width: | Height: | Size: 3.1 KiB |
BIN
python/icons/hot/bmp/32x32/New file.bmp
Normal file
After Width: | Height: | Size: 3.1 KiB |
BIN
python/icons/hot/bmp/32x32/Palette.bmp
Normal file
After Width: | Height: | Size: 3.1 KiB |
BIN
python/icons/hot/bmp/48x48/Find text.bmp
Normal file
After Width: | Height: | Size: 6.8 KiB |
BIN
python/icons/hot/bmp/48x48/New file.bmp
Normal file
After Width: | Height: | Size: 6.8 KiB |
BIN
python/icons/hot/bmp/48x48/Palette.bmp
Normal file
After Width: | Height: | Size: 6.8 KiB |
BIN
python/icons/hot/gif/16x16/Find text.gif
Normal file
After Width: | Height: | Size: 587 B |
BIN
python/icons/hot/gif/16x16/New file.gif
Normal file
After Width: | Height: | Size: 604 B |
BIN
python/icons/hot/gif/16x16/Palette.gif
Normal file
After Width: | Height: | Size: 1022 B |
BIN
python/icons/hot/gif/20x20/Find text.gif
Normal file
After Width: | Height: | Size: 1.0 KiB |
BIN
python/icons/hot/gif/20x20/New file.gif
Normal file
After Width: | Height: | Size: 722 B |
BIN
python/icons/hot/gif/20x20/Palette.gif
Normal file
After Width: | Height: | Size: 1.1 KiB |
BIN
python/icons/hot/gif/24x24/Find text.gif
Normal file
After Width: | Height: | Size: 1.1 KiB |
BIN
python/icons/hot/gif/24x24/New file.gif
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
python/icons/hot/gif/24x24/Palette.gif
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
python/icons/hot/gif/32x32/Find text.gif
Normal file
After Width: | Height: | Size: 1.3 KiB |
BIN
python/icons/hot/gif/32x32/New file.gif
Normal file
After Width: | Height: | Size: 1.5 KiB |
BIN
python/icons/hot/gif/32x32/Palette.gif
Normal file
After Width: | Height: | Size: 1.5 KiB |
BIN
python/icons/hot/gif/48x48/Find text.gif
Normal file
After Width: | Height: | Size: 1.6 KiB |
BIN
python/icons/hot/gif/48x48/New file.gif
Normal file
After Width: | Height: | Size: 2.2 KiB |
BIN
python/icons/hot/gif/48x48/Palette.gif
Normal file
After Width: | Height: | Size: 2.1 KiB |
BIN
python/icons/hot/ico/Find text.ico
Normal file
After Width: | Height: | Size: 22 KiB |
BIN
python/icons/hot/ico/New file.ico
Normal file
After Width: | Height: | Size: 22 KiB |
BIN
python/icons/hot/ico/Palette.ico
Normal file
After Width: | Height: | Size: 22 KiB |
BIN
python/icons/hot/png/16x16/Find text.png
Normal file
After Width: | Height: | Size: 735 B |
BIN
python/icons/hot/png/16x16/New file.png
Normal file
After Width: | Height: | Size: 614 B |
BIN
python/icons/hot/png/16x16/Palette.png
Normal file
After Width: | Height: | Size: 905 B |