Exemple #1
0
    def test_insert_convert(self):
        image_modle = sh.model('Image')
        image_model.use_convert = True # 改变图片
        image_model.convert_type = 'png'
        image_model.max_width = 50
        image_model.max_height = 60
        data = sh.storage({'data_name': 'User', 'data_id': 1, image_model.image_key: test_image_data})
        id = image_model.insert(data)
        item = image_model.get(id)
        image_path = sh.urlToPath(item.url)
        # 转换为png格式
        self.assertTrue(image_path.endswith('/%d.png' % (id)))
        self.assertEqual(imghdr.what(None, open(image_path).read()), 'png')
        # 压缩为50x50. 因为会保持原有比例,所以压缩后高度依然是50, 不是60
        self.assertEqual(Image.open(image_path).size, (50, 50))

        # 当max_height与max_width有其中之一为None时就不压缩
        image_model.max_height = None
        id2 = image_model.insert(data)
        item2 = image_model.get(id2)
        # 虽然不压缩尺寸,但是要转换格式
        image_path = sh.urlToPath(item2.url)
        self.assertTrue(image_path.endswith('/%d.png' % (id2)))
        # 依然是原来的尺寸
        self.assertEqual(Image.open(image_path).size, Image.open(test_image_data.filename).size)
Exemple #2
0
    def test_insert(self):
        imgitem_model.use_convert = True
        imgitem_model.convert_type = 'png'
        imgitem_model.max_width = 50
        imgitem_model.max_height = 60

        data = sh.copy(test_data)
        data[image_model.image_key] = test_image_data
        old_count = len(image_model.all())
        id = imgitem_model.insert(data)

        # 创建了一张图片
        self.assertEqual(len(image_model.all()), old_count+1)

        # 关联Imageid, 等于最后一张图片的id
        item = imgitem_model.get(id)
        self.assertEqual(item.Imageid, image_model.all()[-1].id)

        # 验证getImageId和getImageUrl
        self.assertEqual(item.Imageid, imgitem_model.getImageId(id))
        self.assertEqual(item.image.url, imgitem_model.getImageUrl(id))

        # 转换为png格式
        image_path = sh.urlToPath(item.image.url)
        self.assertTrue(image_path.endswith('/%d.png' % (item.Imageid)))
        self.assertEqual(imghdr.what(None, open(image_path).read()), 'png')

        # 压缩为50x50. 因为会保持原有比例,所以压缩后高度依然是50, 不是60
        self.assertEqual(Image.open(image_path).size, (50, 50))
Exemple #3
0
    def POST(self):
        inputs = sh.inputs()
        assert inputs.has_key('model_name'), u'请指定需要裁剪的数据类型'
        assert inputs.has_key('model_id'), u'请指定需要裁剪的数据ID'
        assert inputs.has_key('column_name'), u'请指定裁剪的列名'
        assert int(float(inputs.get('region_width', '0'))) > 0
        assert int(float(inputs.get('region_height', '0'))) > 0

        model = sh.model(inputs.model_name)
        item = model.get(inputs.model_id)
        image = item.image

        real_width, real_height = sh.imageSize(image.url) # 图片的真实宽高
        crop = inputs.crop
        region_width = int(float(inputs.region_width)) # 选择区域的宽度
        region_height = int(float(inputs.region_height)) # 选择区域的高度

        start_x  = int(crop.split()[0]) # 选中的起始位置
        start_y  = int(crop.split()[1])
        region_x  = int(crop.split()[2])# 选中的宽度
        region_y = int(crop.split()[3]) # 选中的高度
        
        # convert 裁剪区域
        region = '%dx%d+%d+%d' % (region_x * real_width / region_width, 
                                region_y * real_height / region_height,
                                real_width * start_x / region_width, 
                                real_height * start_y / region_height)

        path = sh.urlToPath(image.url)
        os.system('convert %s -crop %s %s' % (path, region, path+'.crop'))
        model.update(inputs.model_id, {inputs.column_name: crop})
        return sh.refresh()
Exemple #4
0
    def savePortrait(self, Userid, image_file):
        user_model = sh.model('User')
        user = user_model.get(Userid)

        if user.image and image_file:
            path = sh.urlToPath(user.image.url)
            os.system('rm %s' % (path + '.crop'))

        user_model.update(Userid, {sh.model('Image').image_key: image_file})

        # 自动设置裁剪区域为整个图片
        user = user_model.get(Userid)  # 为了重新拿到image数据
        size = sh.imageSize(user.image.url)
        user_model.update(user.id, {'crop': '0 0 %d %d' % size})
        path = sh.urlToPath(user.image.url)
        os.system('cp %s %s' % (path, path + '.crop'))
Exemple #5
0
    def savePortrait(self, Userid, image_file):
        user_model = sh.model('User')
        user = user_model.get(Userid)

        if user.image and image_file:
            path = sh.urlToPath(user.image.url)
            os.system('rm %s' % (path+'.crop'))

        user_model.update(Userid, {sh.model('Image').image_key: image_file})

        # 自动设置裁剪区域为整个图片
        user = user_model.get(Userid) # 为了重新拿到image数据
        size = sh.imageSize(user.image.url)
        user_model.update(user.id, {'crop': '0 0 %d %d' % size})
        path = sh.urlToPath(user.image.url)
        os.system('cp %s %s' % (path, path+'.crop'))
Exemple #6
0
 def test_getUrl_getFilePath(self):
     image_modle = sh.model('Image')
     image_model.use_convert = False
     data = sh.storage({'data_name': 'User', 'data_id': 1, image_model.image_key: test_image_data})
     id = image_model.insert(data)
     item = image_model.get(id)
     self.assertEqual(item.url, image_model.getUrl(id))
     self.assertEqual(sh.urlToPath(item.url), image_model.getFilePath(id))
Exemple #7
0
    def POST(self):
        if not sh.session.is_login:
            return sh.redirectToLogin()
        image_model = sh.model('Image')
        user_model = sh.model('User')
        user = user_model.get(sh.session.id)

        inputs = sh.inputs()
        assert inputs.get('action', '')

        if inputs.action == 'upload':
            if user.image:
                path = sh.urlToPath(user.image.url)
                os.system('rm %s' % (path+'.crop'))

            user_model.update(sh.session.id, {image_model.image_key: inputs.image_file})
            return sh.redirect('/accounts/portrait')

        elif inputs.action == 'crop':

            if not user.image:
                return sh.alert('请先上传头像')

            assert int(float(inputs.get('region_width', '0'))) > 0
            assert int(float(inputs.get('region_height', '0'))) > 0
            real_width, real_height = sh.imageSize(user.image.url) # 图片的真实宽高
            crop = inputs.crop
            region_width = int(float(inputs.region_width)) # 选择区域的宽度
            region_height = int(float(inputs.region_height)) # 选择区域的高度

            start_x  = int(crop.split()[0]) # 选中的起始位置
            start_y  = int(crop.split()[1])
            region_x  = int(crop.split()[2])# 选中的宽度
            region_y = int(crop.split()[3]) # 选中的高度
            
            # convert 裁剪区域
            region = '%dx%d+%d+%d' % (region_x * real_width / region_width, 
                                    region_y * real_height / region_height,
                                    real_width * start_x / region_width, 
                                    real_height * start_y / region_height)

            path = sh.urlToPath(user.image.url)
            os.system('convert %s -crop %s %s' % (path, region, path+'.crop'))
            user_model.update(sh.session.id, {'crop': crop})
            return sh.redirect('/accounts')
Exemple #8
0
 def test_ignore_convert_image(self):
     imgitem_model.use_convert = True
     imgitem_model.convert_type = 'png'
     imgitem_model.max_width  = 50
     imgitem_model.max_height = 60
     data = sh.copy(test_data)
     data[image_model.image_key] = test_image_data
     data['__ignore_convert_image'] = True
     id = imgitem_model.insert(data)
     item = imgitem_model.get(id)
     image_path = sh.urlToPath(item.image.url)
     # 保存的文件数据与测试数据一致, 文件没有被convert
     self.assertEqual(open(image_path).read(), test_image_data.value)
Exemple #9
0
 def test_ignore_convert_image(self):
     image_modle = sh.model('Image')
     image_model.use_convert = True
     image_model.convert_type = 'png'
     image_model.max_width  = 50
     image_model.max_height = 60
     data = sh.storage({'data_name': 'User', 'data_id': 1, image_model.image_key: test_image_data})
     data['__ignore_convert_image'] = True
     id = image_model.insert(data)
     item = image_model.get(id)
     image_path = sh.urlToPath(item.url)
     # 保存的文件数据与测试数据一致, 文件没有被convert
     self.assertEqual(open(image_path).read(), test_image_data.value)
Exemple #10
0
 def test_insert_savesuccess(self):
     image_modle = sh.model('Image')
     image_model.use_convert = False # 不改变图片
     data = sh.storage({'data_name': 'User', 'data_id': 1, image_model.image_key: test_image_data})
     id = image_model.insert(data)
     item = image_model.get(id)
     # 访问路径以sh.config.UPLOAD_IMAGE_URL开头
     self.assertTrue(item.url.startswith(sh.config.UPLOAD_IMAGE_URL))
     image_path = sh.urlToPath(item.url)
     self.assertEqual(item.url, sh.pathToUrl(image_path)) # urlToPath和pathToUrl可互转
     # 用数据id命名, 并保持相同后缀
     self.assertTrue(image_path.endswith('/%d.%s' % (id, test_image_data.imagetype)))
     # 保存的文件数据与测试数据一致
     self.assertTrue(os.path.exists(image_path))
     self.assertEqual(open(image_path).read(), test_image_data.value)
Exemple #11
0
 def test_insert_savesuccess(self):
     image_modle = sh.model('Image')
     image_model.use_convert = False # 不改变图片
     data = sh.storage({'data_name': 'User', 'data_id': 1,
         image_model.image_key: test_image_data})
     id = image_model.insert(data)
     item = image_model.get(id)
     # 访问路径以sh.config.UPLOAD_IMAGE_URL开头
     self.assertTrue(item.url.startswith(sh.config.UPLOAD_IMAGE_URL))
     image_path = sh.urlToPath(item.url)
     self.assertEqual(item.url, sh.pathToUrl(image_path)) # urlToPath和pathToUrl可互转
     # 用数据id命名, 并保持相同后缀
     self.assertTrue(image_path.endswith('/%d.%s' % (id, test_image_data.imagetype)))
     # 保存的文件数据与测试数据一致
     self.assertTrue(os.path.exists(image_path))
     self.assertEqual(open(image_path).read(), test_image_data.value)
Exemple #12
0
    def POST(self):
        inputs = sh.inputs()
        assert inputs.has_key('model_name'), u'请指定需要裁剪的数据类型'
        assert inputs.has_key('model_id'), u'请指定需要裁剪的数据ID'
        assert inputs.has_key('column_name'), u'请指定裁剪的列名'
        assert int(float(inputs.get('region_width', '0'))) > 0
        assert int(float(inputs.get('region_height', '0'))) > 0

        model = sh.model(inputs.model_name)
        item = model.get(inputs.model_id)
        image = item.image

        real_width, real_height = sh.imageSize(image.url)  # 图片的真实宽高
        crop = inputs.crop
        region_width = int(float(inputs.region_width))  # 选择区域的宽度
        region_height = int(float(inputs.region_height))  # 选择区域的高度

        start_x = int(crop.split()[0])  # 选中的起始位置
        start_y = int(crop.split()[1])
        region_x = int(crop.split()[2])  # 选中的宽度
        region_y = int(crop.split()[3])  # 选中的高度

        # convert 裁剪区域
        region = '%dx%d+%d+%d' % (region_x * real_width / region_width,
                                  region_y * real_height / region_height,
                                  real_width * start_x / region_width,
                                  real_height * start_y / region_height)

        path = sh.urlToPath(image.url)
        os.system('convert %s -crop %s %s' % (path, region, path + '.crop'))
        model.update(inputs.model_id, {inputs.column_name: crop})

        # 删除以前裁剪图片的各种尺寸副本
        os.system('rm %s.crop_*' % path)

        return sh.refresh()
Exemple #13
0
 def getFilePath(self, item_id):
     url = self.getUrl(item_id)
     return sh.urlToPath(url) if url else ''
Exemple #14
0
 def getFilePath(self, item_id):
     url = self.getUrl(item_id)
     return sh.urlToPath(url) if url else ''