Пример #1
0
class HisImage():
    def __init__(self, fdname, finame):
        self.fdname = fdname
        self.finame = finame
        self.webparent = r'/Test2/'
        self.im = ops.OpenSlide(self.fdname + self.finame + '.ndpi')
        self.root = self.ExtractRoot()

        self.an_num = self.root.__len__()
        self.mysite = Piwigo(url='http://qmul.piwigo.com/')
        self.login = self.Login()
        self.webimlist = self.mysite.images(self.mysite.plan.keys()[0])
        self.webfdlist = self.mysite.plan
        self.update = self.CheckMysite()  #Update or

    def __del__(self):
        self.Logout()

    def Logout(self):
        self.mysite.logout()

    def Login(self):
        return self.mysite.login(username="******", password="******")

    def CheckMysite(self):
        if self.webfdlist.has_key(self.webparent + self.finame):
            return True
        else:
            self.mysite.mkdir(self.webparent + self.finame)
            return False

    def ExtractRoot(self):
        with open(self.fdname + self.finame + '.ndpi.ndpa') as f:
            tree = ElementTree.parse(f)
        return tree.getroot()

    def ConvertXY(self, ax, by):
        xmpp = float(self.im.properties['openslide.mpp-x'])
        xoff = float(self.im.properties['hamamatsu.XOffsetFromSlideCentre'])
        ympp = float(self.im.properties['openslide.mpp-y'])
        yoff = float(self.im.properties['hamamatsu.YOffsetFromSlideCentre'])
        ld = self.im.dimensions
        nax = int((ax - xoff) / (xmpp * 1000.0) + ld[0] / 2.0)
        nby = int((by - yoff) / (ympp * 1000.0) + ld[1] / 2.0)
        return nax, nby

    def Upload(self, imgname):
        fdpath = self.webparent + self.finame + r'/' + imgname[-1].upper()
        if self.webfdlist.has_key(fdpath) == False:
            self.mysite.mkdir(fdpath)
        try:
            self.mysite.upload(imgname + '.png', fdpath)
        except Exception as e:
            print imgname
            print e
            self.mysite.upload(imgname + '.png', fdpath)

        os.remove(imgname + '.png')

    def NameAnnotation(self, index):
        if self.root[index][0].text != None and self.root[index][
                0].text != 'roi':
            name = 'ID-' + self.root[index].attrib['id'] + '-' + self.root[
                index][0].text
        elif self.root[index][0].text == 'roi' or self.root[index][
                0].text == 'ROI':
            name = 'ID-' + self.root[index].attrib['id'] + '-' + 'R'
        else:
            name = 'ID-' + self.root[index].attrib['id'] + '-' + 'O'
        return name

    def AnnotationDots(self, index):
        if self.root[index][-1][-1].tag == 'pointlist':
            tplist = self.root[index][-1][-1]
        elif self.root[index][-1][-1].tag == 'specialtype' and self.root[
                index][-1][-3].tag == 'pointlist':
            tplist = self.root[index][-1][-3]
        else:
            return np.array([])
        Plist1 = []
        for i in range(tplist.__len__()):
            Plist1.append(
                self.ConvertXY(int(tplist[i][0].text), int(tplist[i][1].text)))
        return np.array(Plist1)

    def LocateROI(self):
        ROIlist = []
        for index in range(self.root.__len__()):
            if self.root[index][0].text == 'roi' or self.root[index][
                    0].text == 'ROI':
                ROIlist.append([index, self.AnnotationDots(index)])
        return ROIlist

    def ExtractImage(self, index):
        name = self.NameAnnotation(index)
        pl_arr = self.AnnotationDots(index)
        pl_arr = np.vstack((pl_arr, pl_arr[0]))
        xi = pl_arr[:, 0].min()
        xa = pl_arr[:, 0].max()
        yi = pl_arr[:, 1].min()
        ya = pl_arr[:, 1].max()
        if (xa - xi) * (ya - yi) > 1000 * 1000:
            level = 2
        else:
            level = 0
        tmpim = self.im.read_region(
            (xi - 100, yi - 100), level,
            ((xa - xi + 200) / 2**level, (ya - yi + 200) / 2**level))
        fig, ax = plt.subplots()
        ax.imshow(tmpim)
        ax.axis('image')
        ax.axis('off')
        ax.plot((pl_arr[:, 0] - xi + 100.0) / 2**level,
                (pl_arr[:, 1] - yi + 100.0) / 2**level,
                'y-',
                linewidth=3)
        #plt.savefig(name,dpi=fig.dpi )
        self.SaveFigureAsImage(name,
                               fig=fig,
                               orig_size=(np.array(tmpim).shape[0],
                                          np.array(tmpim).shape[1]))
        plt.close(fig)
        return name

    def ExtractandUpload(self, index):
        #ROIlist = LocateROI()
        #if self.root[index][0].text == 'roi' or self.root[index][0].text == 'ROI' :
        name = self.ExtractImage(index)
        self.Upload(name)

    def ExtractandUploadAll(self):
        #ROIlist = LocateROI()
        print 'uploading started'
        for index in range(self.root.__len__()):
            #if self.root[index][0].text == 'roi' or self.root[index][0].text == 'ROI' :
            #continue
            name = self.ExtractImage(index)
            self.Upload(name)
            print index + 'Uploaded'

    def ExtractandUpload_bak(self):
        for index in range(self.root.__len__()):
            #for index in range(2):
            name = self.NameAnnotation(index)
            pl_arr = self.AnnotationDots(index)

            xi = pl_arr[:, 0].min()
            xa = pl_arr[:, 0].max()
            yi = pl_arr[:, 1].min()
            ya = pl_arr[:, 1].max()
            tmpim = self.im.read_region((xi - 100, yi - 100), 0,
                                        (xa - xi + 200, ya - yi + 200))

            fig, ax = plt.subplots()
            ax.imshow(tmpim)
            ax.axis('image')
            ax.axis('off')
            ax.plot(pl_arr[:, 0] - xi + 100,
                    pl_arr[:, 1] - yi + 100,
                    'y-',
                    linewidth=3)
            #plt.savefig(name,dpi=fig.dpi )
            self.SaveFigureAsImage(name,
                                   fig=fig,
                                   orig_size=(np.array(tmpim).shape[0],
                                              np.array(tmpim).shape[1]))
            plt.close(fig)
            del (pl_arr)
            del (tmpim)
            self.Upload(name)

        self.Logout()

    def SaveFigureAsImage(self, fileName, fig=None, **kwargs):
        ''' Save a Matplotlib figure as an image without borders or frames.
           Args:
                fileName (str): String that ends in .png etc.
     
                fig (Matplotlib figure instance): figure you want to save as the image
            Keyword Args:
                orig_size (tuple): width, height of the original image used to maintain 
                aspect ratio.
        '''
        fig_size = fig.get_size_inches()
        w, h = fig_size[0], fig_size[1]
        fig.patch.set_alpha(0)
        if kwargs.has_key('orig_size'):  # Aspect ratio scaling if required
            w, h = kwargs['orig_size']
            w2, h2 = fig_size[0], fig_size[1]
            fig.set_size_inches([(w2 / w) * w, (w2 / w) * h])
            fig.set_dpi((w2 / w) * fig.get_dpi())
        a = fig.gca()
        a.set_frame_on(False)
        a.set_xticks([])
        a.set_yticks([])
        plt.axis('off')
        plt.xlim(0, h)
        plt.ylim(w, 0)
        fig.savefig(fileName,
                    transparent=True,
                    bbox_inches='tight',
                    pad_inches=0)
Пример #2
0
def main():
    usage = USAGE
    parser = OptionParser(version="%s %s" % (PROG,VERSION), usage=usage)
    parser.description= DESCRIPTION
    parser.epilog = AUTHOR
    try:
        add_dynamic_option(parser)
        (options, args) = parser.parse_args()
        verb = args[0]
        if verb == 'ws':
            piwigo = Piwigo(url=options.url)
            if 'user' and 'password' in options.__dict__:
                piwigo.login(options.user, options.password)
            kw = purge_kw(options.__dict__,('user','password','url'))
            pp = pprint.PrettyPrinter(indent=4)
            pp.pprint(Ws(piwigo, options.method)(**kw))
            if piwigo.islogged:
                piwigo.logout()
        if verb == "download":
            ana = Analyse('Analyze')
            ana.start()
            try:
                piwigo = Piwigo(url=options.url)
                piwigo.login(options.user, options.password)
                # check
                if not os.path.isdir(options.dest):
                    os.makedirs(options.dest)        
                options.dest = os.path.abspath(options.dest)
                piwigo.iscategory(options.category)
                if options.category[-2:] == ' /' : options.category = options.category[:-2]
                # treatment
                run = Run(verb, options.thread)
                kw = purge_kw(options.__dict__,('user','password','url','dest','category','thread'))
                for img in piwigo.images(options.category, **kw):
                    run.add(piwigo.download, 
                            ["%s / %s" % (options.category, str(img)), "%s%s%s" % (options.dest, os.path.sep, str(img))],
                            kw)
            except Exception as e:
                ana.stop()
                raise e
            ana.stop()
            run.start()
            piwigo.logout()
            if run.error:
               parser.error(run.strerror) 
        if verb == "upload":
            ana = Analyse('Analyze')
            ana.start()
            try:
                piwigo = Piwigo(url=options.url)
                piwigo.login(options.user, options.password)
                # check
                piwigo.makedirs(options.category)
                # treatment
                run = Run(verb, options.thread)
                kw = purge_kw(options.__dict__,('user','password','url','source','category','thread'))
                for img in glob.glob(options.source):
                    run.add(piwigo.upload,
                            [os.path.abspath(img), options.category], 
                            kw)
                ana.stop()
            except Exception as e:
                ana.stop()
                raise e
            run.start()
            piwigo.logout()
            if run.error:
                parser.error(run.strerror)
        if verb == "sync-up":
            ana = Analyse('Analyze')
            ana.start()
            try:
                piwigo = Piwigo(url=options.url)
                piwigo.login(options.user, options.password)
                # check
                options.source = os.path.abspath(options.source)
                if not os.path.isdir(options.source):
                    raise Exception("%s is not directory" % options.source)
                piwigo.iscategory(options.category)
                if len(options.category) and options.category[-1] != '/' and options.category[:-3] != ' / ':
                    options.category = options.category+ ' / '
                # treatment
                run = Run(verb, options.thread)
                kw = purge_kw(options.__dict__,('user','password','url','source','category','thread'))
                # local -> piwigo
                for root, dirnames, filenames in os.walk(options.source):
                    filtering = fnmatch.filter(filenames, options.extension.split(',')[0])
                    for ext in options.extension.split(',')[1:]:
                        filtering = filtering + fnmatch.filter(filenames, ext)
                    for filename in filtering:
                        pathrel = os.path.abspath(os.path.join(root, filename))[len(options.source)+1:]
                        pathabs = os.path.abspath(os.path.join(root, filename))
                        category = options.category + ' / '.join(pathrel.split(os.sep)[:-1])
                        if not piwigo.isimage(category + ' / ' + filename):
                            run.add(piwigo.makedirs,[category,], kw)
                            run.add(piwigo.upload,[pathabs, category], kw)
                ana.stop()
            except Exception as e:
                ana.stop()
                raise e
            run.start()
            piwigo.logout()
            if run.error:
                parser.error(run.strerror)
        if verb == "sync-down":
            ana = Analyse('Analyze')
            ana.start()
            try:
                piwigo = Piwigo(url=options.url)
                piwigo.login(options.user, options.password)
                # check
                options.source = os.path.abspath(options.source)
                if not os.path.isdir(options.source):
                    raise Exception("%s is not directory" % options.source)
                piwigo.iscategory(options.category)
                if len(options.category) and options.category[-1] != '/' and options.category[:-3] != ' / ':
                    options.category = options.category+ ' / '
                # treatment
                run = Run(verb, options.thread)
                kw = purge_kw(options.__dict__,('user','password','url','source','category','thread'))
                # piwigo -> local
                for category, item in piwigo.plan.iteritems():
                    if options.category == category[0:len(options.category)]:
                        path = os.path.join(options.source, *category[len(options.category):].split(' / '))
                        if not os.path.exists(path):
                            os.makedirs(path)
                        for img in piwigo.images(category):
                            pathimg = os.path.join(path, img)
                            if not os.path.exists(pathimg):
                                run.add(piwigo.download, 
                                    ["%s / %s" % (category, str(img)), pathimg],
                                    kw)
                ana.stop()
            except Exception as e:
                ana.stop()
                raise e
            run.start()
            piwigo.logout()
            if run.error:
                parser.error(run.strerror)
    except Exception as e:
        parser.error(e)
        sys.exit(1)
Пример #3
0
#print mysite.plan
#print mysite.idcategory(mysite.plan.keys()[0])

#print mysite.images(mysite.plan.keys()[-1])

#mysite.removedirs('/Test3')

flist = os.listdir('../Samples')
'''
for tmp in flist:
    if tmp[-3:] != 'png':
        flist.remove(tmp)
for im in flist:
    mysite.upload(im,mysite.plan.keys()[0])
'''
imlist = mysite.images(mysite.plan.keys()[0])


def UploadFolders(fp):
    mysite.mkdir('/Test2/' + fp)
    for category in ['T', 'M', 'F', 'H']:
        pathid = mysite.mkdir('/Test2/' + fp + r'/' + category)
        fdpath = '../Samples/' + fp + r'/' + category + r'/'
        flist = os.listdir(fdpath)
        for im in flist:
            # Return the image ID
            mysite.upload(
                fdpath + im,
                mysite.plan.keys()[mysite.plan.values().index(pathid)])

Пример #4
0
def main():
    usage = USAGE
    parser = OptionParser(version="%s %s" % (PROG, VERSION), usage=usage)
    parser.description = DESCRIPTION
    parser.epilog = AUTHOR
    try:
        add_dynamic_option(parser)
        (options, args) = parser.parse_args()
        verb = args[0]
        if verb == 'ws':
            piwigo = Piwigo(url=options.url)
            if 'user' and 'password' in options.__dict__:
                piwigo.login(options.user, options.password)
            kw = purge_kw(options.__dict__, ('user', 'password', 'url'))
            pp = pprint.PrettyPrinter(indent=4)
            pp.pprint(Ws(piwigo, options.method)(**kw))
            if piwigo.islogged:
                piwigo.logout()
        if verb == "download":
            ana = Analyse('Analyze')
            ana.start()
            try:
                piwigo = Piwigo(url=options.url)
                piwigo.login(options.user, options.password)
                # check
                if not os.path.isdir(options.dest):
                    os.makedirs(options.dest)
                options.dest = os.path.abspath(options.dest)
                piwigo.iscategory(options.category)
                if options.category[-2:] == ' /':
                    options.category = options.category[:-2]
                # treatment
                run = Run(verb, options.thread)
                kw = purge_kw(
                    options.__dict__,
                    ('user', 'password', 'url', 'dest', 'category', 'thread'))
                for img in piwigo.images(options.category, **kw):
                    run.add(piwigo.download, [
                        "%s / %s" % (options.category, str(img)),
                        "%s%s%s" % (options.dest, os.path.sep, str(img))
                    ], kw)
            except Exception as e:
                ana.stop()
                raise e
            ana.stop()
            run.start()
            piwigo.logout()
            if run.error:
                parser.error(run.strerror)
        if verb == "upload":
            ana = Analyse('Analyze')
            ana.start()
            try:
                piwigo = Piwigo(url=options.url)
                piwigo.login(options.user, options.password)
                # check
                piwigo.makedirs(options.category)
                # treatment
                run = Run(verb, options.thread)
                kw = purge_kw(options.__dict__,
                              ('user', 'password', 'url', 'source', 'category',
                               'thread'))
                for img in glob.glob(options.source):
                    run.add(piwigo.upload,
                            [os.path.abspath(img), options.category], kw)
                ana.stop()
            except Exception as e:
                ana.stop()
                raise e
            run.start()
            piwigo.logout()
            if run.error:
                parser.error(run.strerror)
        if verb == "sync-up":
            ana = Analyse('Analyze')
            ana.start()
            try:
                piwigo = Piwigo(url=options.url)
                piwigo.login(options.user, options.password)
                # check
                options.source = os.path.abspath(options.source)
                if not os.path.isdir(options.source):
                    raise Exception("%s is not directory" % options.source)
                piwigo.iscategory(options.category)
                if len(options.category) and options.category[
                        -1] != '/' and options.category[:-3] != ' / ':
                    options.category = options.category + ' / '
                # treatment
                run = Run(verb, options.thread)
                kw = purge_kw(options.__dict__,
                              ('user', 'password', 'url', 'source', 'category',
                               'thread'))
                # local -> piwigo
                for root, dirnames, filenames in os.walk(options.source):
                    filtering = fnmatch.filter(filenames,
                                               options.extension.split(',')[0])
                    for ext in options.extension.split(',')[1:]:
                        filtering = filtering + fnmatch.filter(filenames, ext)
                    for filename in filtering:
                        pathrel = os.path.abspath(os.path.join(
                            root, filename))[len(options.source) + 1:]
                        pathabs = os.path.abspath(os.path.join(root, filename))
                        category = options.category + ' / '.join(
                            pathrel.split(os.sep)[:-1])
                        if not piwigo.isimage(category + ' / ' + filename):
                            run.add(piwigo.makedirs, [
                                category,
                            ], kw)
                            run.add(piwigo.upload, [pathabs, category], kw)
                ana.stop()
            except Exception as e:
                ana.stop()
                raise e
            run.start()
            piwigo.logout()
            if run.error:
                parser.error(run.strerror)
        if verb == "sync-down":
            ana = Analyse('Analyze')
            ana.start()
            try:
                piwigo = Piwigo(url=options.url)
                piwigo.login(options.user, options.password)
                # check
                options.source = os.path.abspath(options.source)
                if not os.path.isdir(options.source):
                    raise Exception("%s is not directory" % options.source)
                piwigo.iscategory(options.category)
                if len(options.category) and options.category[
                        -1] != '/' and options.category[:-3] != ' / ':
                    options.category = options.category + ' / '
                # treatment
                run = Run(verb, options.thread)
                kw = purge_kw(options.__dict__,
                              ('user', 'password', 'url', 'source', 'category',
                               'thread'))
                # piwigo -> local
                for category, item in piwigo.plan.iteritems():
                    if options.category == category[0:len(options.category)]:
                        path = os.path.join(
                            options.source,
                            *category[len(options.category):].split(' / '))
                        if not os.path.exists(path):
                            os.makedirs(path)
                        for img in piwigo.images(category):
                            pathimg = os.path.join(path, img)
                            if not os.path.exists(pathimg):
                                run.add(piwigo.download, [
                                    "%s / %s" % (category, str(img)), pathimg
                                ], kw)
                ana.stop()
            except Exception as e:
                ana.stop()
                raise e
            run.start()
            piwigo.logout()
            if run.error:
                parser.error(run.strerror)
    except Exception as e:
        parser.error(e)
        sys.exit(1)