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)
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))
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()
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'))
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'))
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))
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')
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)
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)
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)
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()
def getFilePath(self, item_id): url = self.getUrl(item_id) return sh.urlToPath(url) if url else ''