import json import uuid import cv2 import numpy as np from django.http import HttpResponse from django.shortcuts import render # Create your views here. from django.views.decorators.csrf import csrf_exempt PREFIX = 'media/' DEFAULT_FORMAT = '.jpg' SUPPORT_FILE_FORMAT = ['png', 'jpg', 'bmp', 'jpeg', 'jpe', 'dib', 'pbm', 'pgm', 'ppm', 'tiff', 'tif'] # 获取uuid图片名 def getImageName(): return uuid.uuid1().__str__() # 保存图片,并判断是否为合适的扩展名 def getImage(request): print(request.FILES) file = request.FILES.get('image') suffix = file.name[file.name.rfind('.') + 1:].lower() if suffix not in SUPPORT_FILE_FORMAT: return '' filename = getImageName() + '.' + suffix img = open(PREFIX + filename, 'wb+') for chunk in file.chunks(): img.write(chunk) img.close() return filename # 接收图片,转发到getImage @csrf_exempt def upload(request): imageName = getImage(request) if imageName == '': return HttpResponse('Not supported image format') return HttpResponse(imageName) def process_bg(): img = np.zeros((800, 800, 3), np.uint8) filename = getImageName() + DEFAULT_FORMAT cv2.imwrite(PREFIX + filename, img) return filename def process_line(para): name, start, end, color, thickness = para['img'], para['start'], para['end'], para['color'], para['thickness'] img = cv2.imread(PREFIX + name) cv2.line(img, tuple(start), tuple(end), tuple(color), thickness) cv2.imwrite(PREFIX + name, img) return name def process_rectangle(para): name, start, end, color, thickness = para['img'], para['start'], para['end'], para['color'], para['thickness'] img = cv2.imread(PREFIX + name) cv2.rectangle(img, tuple(start), tuple(end), tuple(color), thickness) cv2.imwrite(PREFIX + name, img) return name def process_circle(para): name, center, radius, color, thickness = para['img'], para['center'], para['radius'], para['color'], para[ 'thickness'] img = cv2.imread(PREFIX + name) cv2.circle(img, tuple(center), radius, tuple(color), thickness) cv2.imwrite(PREFIX + name, img) return name def process_ellipse(para): name, center, axes, angle, startangle, endangle, color, thickness = para['img'], para['center'], para['axes'], para[ 'angle'], para['startangle'], para['endangle'], para['color'], para['thickness'] img = cv2.imread(PREFIX + name) cv2.ellipse(img, tuple(center), tuple(axes), angle, startangle, endangle, tuple(color), thickness) cv2.imwrite(PREFIX + name, img) return name def process_polylines(para): name, point, isclosed, color = para['img'], para['point'], para['isclosed'], para['color'] img = cv2.imread(PREFIX + name) pts = np.array(point, np.int32) pts = pts.reshape((-1, 1, 2)) cv2.polylines(img, [pts], isclosed, tuple(color)) cv2.imwrite(PREFIX + name, img) return name def process_text(para): name, text, org, fontsize, color = para['img'], para['text'], para['org'], para['fontsize'], para['color'] img = cv2.imread(PREFIX + name) cv2.putText(img, text, org, fontFace=cv2.FONT_HERSHEY_SCRIPT_COMPLEX, fontScale=fontsize, color=tuple(color)) cv2.imwrite(PREFIX + name, img) return name # 使用opencv 基本绘图 @csrf_exempt def basic_drawing(request): if request.method == 'POST': para = json.loads(request.body) draw_type = para['type'] if draw_type == 'bg': return HttpResponse(process_bg()) else: if draw_type == 'line': return HttpResponse(process_line(para)) elif draw_type == 'rectangle': return HttpResponse(process_rectangle(para)) elif draw_type == 'circle': return HttpResponse(process_circle(para)) elif draw_type == 'ellipse': return HttpResponse(process_ellipse(para)) elif draw_type == 'polylines': return HttpResponse(process_polylines(para)) elif draw_type == 'text': return HttpResponse(process_text(para)) return HttpResponse('请使用POST方法') def process_filter_rgb(para, data): limit = para.get('limit', 100) c_range = para.get('range', [90, 230]) if np.max(data) > limit: data = data * (255 / np.max(data)) tmp = np.zeros_like(data) tmp[((data > c_range[0]) & (data <= c_range[1]))] = 255 return tmp @csrf_exempt def rgb_color_space(request, color): if request.method == 'POST': para = json.loads(request.body) image_name = para['img'] img = cv2.imread(PREFIX + image_name) data = None if color == 'r': data = img[:, :, 2] elif color == 'g': data = img[:, :, 1] elif color == 'b': data = img[:, :, 0] if para.get('filter', False): data = process_filter_rgb(para, data) filename = color + '-' + image_name cv2.imwrite(PREFIX + filename, data) return HttpResponse(filename) return HttpResponse('请使用POST方法') @csrf_exempt def hsv_color_space(request, color): if request.method == 'POST': para = json.loads(request.body) image_name = para['img'] img = cv2.imread(PREFIX + image_name) hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) data = None if color == 'h': data = hsv[:, :, 0] elif color == 's': data = hsv[:, :, 1] elif color == 'v': data = hsv[:, :, 2] elif color == 'filter': upper_bound = para.get('ub', [0, 0, 0]) lower_bound = para.get('lb', [200, 40, 100]) data = cv2.inRange(hsv, np.array(upper_bound), np.array(lower_bound)) filename = color + '-' + image_name cv2.imwrite(PREFIX + filename, data) return HttpResponse(filename) return HttpResponse('请使用POST方法') def logic_and(img, has_color, base): if base == 2: img[0], img[1] = img[1], img[0] img1 = cv2.imread(PREFIX + img[0], has_color) img2 = cv2.imread(PREFIX + img[1], has_color) rows, cols = img1.shape[:2] img2 = cv2.resize(img2, (cols, rows), interpolation=cv2.INTER_CUBIC) ret = img1 & img2 filename = getImageName() + DEFAULT_FORMAT cv2.imwrite(PREFIX + filename, ret) return filename def logic_or(img, has_color, base): if base == 2: img[0], img[1] = img[1], img[0] img1 = cv2.imread(PREFIX + img[0], has_color) img2 = cv2.imread(PREFIX + img[1], has_color) rows, cols = img1.shape[:2] img2 = cv2.resize(img2, (cols, rows), interpolation=cv2.INTER_CUBIC) ret = img1 | img2 filename = getImageName() + DEFAULT_FORMAT cv2.imwrite(PREFIX + filename, ret) return filename def logic_not(img, has_color, base): if base == 2: img[0], img[1] = img[1], img[0] image = cv2.imread(PREFIX + img[0], has_color) ret = ~image filename = getImageName() + DEFAULT_FORMAT cv2.imwrite(PREFIX + filename, ret) return filename def arithmetic_add(img, has_color, base): if base == 2: img[0], img[1] = img[1], img[0] img1 = cv2.imread(PREFIX + img[0], has_color) img2 = cv2.imread(PREFIX + img[1], has_color) rows, cols = img1.shape[:2] img2 = cv2.resize(img2, (cols, rows), interpolation=cv2.INTER_CUBIC) ret = cv2.add(img1, img2) filename = getImageName() + DEFAULT_FORMAT cv2.imwrite(PREFIX + filename, ret) return filename def arithmetic_sub(img, has_color, base): img1 = cv2.imread(PREFIX + img[0], has_color) img2 = cv2.imread(PREFIX + img[1], has_color) if base == 1: rows, cols = img1.shape[:2] img2 = cv2.resize(img2, (cols, rows), interpolation=cv2.INTER_CUBIC) elif base == 2: rows, cols = img2.shape[:2] img1 = cv2.resize(img1, (cols, rows), interpolation=cv2.INTER_CUBIC) ret = cv2.subtract(img1, img2) filename = getImageName() + DEFAULT_FORMAT cv2.imwrite(PREFIX + filename, ret) return filename def arithmetic_multi(img, has_color, base): if base == 2: img[0], img[1] = img[1], img[0] img1 = cv2.imread(PREFIX + img[0], has_color) img2 = cv2.imread(PREFIX + img[1], has_color) rows, cols = img1.shape[:2] img2 = cv2.resize(img2, (cols, rows), interpolation=cv2.INTER_CUBIC) ret = cv2.multiply(img1, img2) filename = getImageName() + DEFAULT_FORMAT cv2.imwrite(PREFIX + filename, ret) return filename def arithmetic_div(img, has_color, base): img1 = cv2.imread(PREFIX + img[0], has_color) img2 = cv2.imread(PREFIX + img[1], has_color) if base == 1: rows, cols = img1.shape[:2] img2 = cv2.resize(img2, (cols, rows), interpolation=cv2.INTER_CUBIC) elif base == 2: rows, cols = img2.shape[:2] img1 = cv2.resize(img1, (cols, rows), interpolation=cv2.INTER_CUBIC) ret = cv2.divide(img1, img2) filename = getImageName() + DEFAULT_FORMAT cv2.imwrite(PREFIX + filename, ret) return filename @csrf_exempt def basic_operation(request): if request.method == 'POST': para = json.loads(request.body) operator = para['operator'] img = para['img'] has_color = para['color'] base = para['base'] if operator == 'and': return HttpResponse(logic_and(img, has_color, base)) elif operator == 'or': return HttpResponse(logic_or(img, has_color, base)) elif operator == 'not': return HttpResponse(logic_not(img, has_color, base)) elif operator == 'add': return HttpResponse(arithmetic_add(img, has_color, base)) elif operator == 'sub': return HttpResponse(arithmetic_sub(img, has_color, base)) elif operator == 'multi': return HttpResponse(arithmetic_multi(img, has_color, base)) elif operator == 'div': return HttpResponse(arithmetic_div(img, has_color, base)) return HttpResponse('请使用POST方法') @csrf_exempt def resize(request): if request.method == 'POST': para = json.loads(request.body) image = para['img'] img = cv2.imread(PREFIX + image) size = para.get('size', None) if size is not None: width = img.shape[0] height = img.shape[1] interpolation = None if width * height >= size[0] * size[1]: interpolation = cv2.INTER_AREA else: interpolation = cv2.INTER_CUBIC img = cv2.resize(img, tuple(size), interpolation) else: multiple = para['multiple'] if multiple < 1: interpolation = cv2.INTER_AREA else: interpolation = cv2.INTER_CUBIC img = cv2.resize(img, (0, 0), fx=multiple, fy=multiple, interpolation=interpolation) new_filename = getImageName() + DEFAULT_FORMAT cv2.imwrite(PREFIX + new_filename, img) return HttpResponse(new_filename) return HttpResponse('请使用POST方法') def rotate_bound(image, angle): (h, w) = image.shape[:2] (cX, cY) = (w // 2, h // 2) M = cv2.getRotationMatrix2D((cX, cY), -angle, 1.0) cos = np.abs(M[0, 0]) sin = np.abs(M[0, 1]) nW = int((h * sin) + (w * cos)) nH = int((h * cos) + (w * sin)) M[0, 2] += (nW / 2) - cX M[1, 2] += (nH / 2) - cY return cv2.warpAffine(image, M, (nW, nH)) @csrf_exempt def rotate(request): if request.method == 'POST': para = json.loads(request.body) image = para['img'] img = cv2.imread(PREFIX + image) angle = para['angle'] img = rotate_bound(img, angle) filename = getImageName() + DEFAULT_FORMAT cv2.imwrite(PREFIX + filename, img) return HttpResponse(filename) return HttpResponse('请使用POST方法') @csrf_exempt def translation(request): if request.method == 'POST': para = json.loads(request.body) image = para['img'] img = cv2.imread(PREFIX + image) offset = para['offset'] height, width = img.shape[:2] M = np.float32([[1, 0, offset[0]], [0, 1, offset[1]]]) img = cv2.warpAffine(img, M, (width, height)) filename = getImageName() + DEFAULT_FORMAT cv2.imwrite(PREFIX + filename, img) return HttpResponse(filename) return HttpResponse('请使用POST方法') def r(request): return render(request, 'upload.html')