Thursday, December 12, 2013

How to install StegoTool

I have spent five days on the installation work of StegoTool. To deal with problems, it was common for me to question on StackOverflow, although I seldom asked due to the thought that someone must already meet my problems. But this experience taught me that reading official documents is very important. Recording my installation will be much meaningful for me, during which I always got stuck.

Official Site of this StegoTool is here.

Python : python-2.7.5.msi
SciPy & NumPy : scipy-0.13.2-win32-superpack-python2.7.exe, numpy-1.8.0-win32-superpack-python2.7.exe
PIL : PIL-1.1.7.win32-py2.7.exe
Matplotlib : matplotlib-1.3.1.win32-py2.7.exe
PyQt : PyQt4-4.10.3-gpl-Py2.7-Qt4.8.5-x32.exe
Qt : qt-windows-opensource-5.1.1-mingw48_opengl-x86-offline.exe

Libjpeg : jpegsr8b.zip (after "./configure", generate exe from ckconfig.c to generate jconfig.h and then "make")
MSYS & MinGW : MSYS-1.0.11.exe, MinGw4.5.0

SIP : sip-4.15.3.zip (Don't use MSYS, all could be done in cmd. "python configure.py -p win32-g++", set "mingw/bin" in your environment variable and then "mingw32-make", "mingw32-make install")
SetupTools : setuptools-2.0.tar.gz
Dateutil : python-dateutil-2.2.tar.gz
Pyparsing : pyparsing-2.0.1.tar.gz

All above is what you will need to install the tool. Most of my time was spent on fixing endless problems after installing Enthought Canopy (academic version). I thought it would be convenient but the fact was the opposite. So this morning installing libraries seperately made it through. Here is how the tool goes:


If you are to run on windows like me, please be sure to do the following changes:
1. StegoTool.py
def load_crypto_schemes():
    schemedict = {}
    cryptodir = os.path.join(WORK_DIR, config.CRYPTOFOLDER)
    for scheme in os.listdir(cryptodir):
        if scheme != '__init__.py' and scheme.endswith('.py'):
            name = scheme[:-3]
            # please be sure that CRYPTOFOLDER is written in UNIX form
            mod_name = (config.CRYPTOFOLDER + name).replace('/', '.')
            try:
                mod = __import__(mod_name, fromlist=mod_name)
                schemedict[name] = getattr(mod, name)
            except ImportError:
                logger.warning('"%s is not a Python module!' % name)
            except AttributeError:
                logger.warning('"%s does not contain a corresponding class'
                               % name)
    return schemedict

2. qtwidgets.py
class ImageWidget(QtGui.QWidget):
    """ Widget to display an image """

    def __init__(self, title, img, parent=None):
        """ img should be an PIL image. """
        QtGui.QWidget.__init__(self, parent)
        self.ui = parent.ui
        layout = QtGui.QVBoxLayout()
        label = QtGui.QLabel()
        # directly wrting "image=ImageQt.ImageQt(img)" works fine on linux but crash on windows
        # we can find solution here - http://skilldrick.co.uk/2010/03/pyqt-pil-and-windows/
        if os.name == 'nt':
            QtImage = ImageQt.ImageQt(img)
            image = QtImage.copy()
        else:
            image = ImageQt.ImageQt(img)

        pixmap = QtGui.QPixmap.fromImage(image)
        label.setPixmap(pixmap)
        layout.addWidget(label)

        save_image = QtGui.QPushButton('Save Image')

        def save():
            if hasattr(img, 'tmp_file'):
                shutil.copy(img.tmp_file, path)
            else:
                try:
                    img.save(str(path))
                except Exception:
                    self.ui.display_error('Could not save image!')
            

        save_image.clicked.connect(save)
        layout.addWidget(save_image)
        self.setLayout(layout)
        self.setWindowTitle(title)

3. Problems about using libjpeg please refer to  "How did I solve frequent crashing of libjpeg?"



No comments:

Post a Comment