diff --git a/.vscode/settings.json b/.vscode/settings.json index 2b7e46d..a506c4d 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,3 +1,58 @@ { - "python.formatting.provider": "yapf" + "python.formatting.provider": "yapf", + "code-runner.runInTerminal": true, + "code-runner.saveFileBeforeRun": true, + "code-runner.executorMap": { + "javascript": "node", + "java": "cd $dir && javac $fileName && java $fileNameWithoutExt", + "c": "cd $dir && gcc $fileName -o $fileNameWithoutExt && $dir$fileNameWithoutExt", + "cpp": "cd $dir && g++ $fileName -o $fileNameWithoutExt && $dir$fileNameWithoutExt", + "objective-c": "cd $dir && gcc -framework Cocoa $fileName -o $fileNameWithoutExt && $dir$fileNameWithoutExt", + "php": "php", + "python": "python -u $fileName imgs/xjtu.bmp imgs/xjtu_new.bmp 512*512", + "perl": "perl", + "perl6": "perl6", + "ruby": "ruby", + "go": "go run", + "lua": "lua", + "groovy": "groovy", + "powershell": "powershell -ExecutionPolicy ByPass -File", + "bat": "cmd /c", + "shellscript": "bash", + "fsharp": "fsi", + "csharp": "scriptcs", + "vbscript": "cscript //Nologo", + "typescript": "ts-node", + "coffeescript": "coffee", + "scala": "scala", + "swift": "swift", + "julia": "julia", + "crystal": "crystal", + "ocaml": "ocaml", + "r": "Rscript", + "applescript": "osascript", + "clojure": "lein exec", + "haxe": "haxe --cwd $dirWithoutTrailingSlash --run $fileNameWithoutExt", + "rust": "cd $dir && rustc $fileName && $dir$fileNameWithoutExt", + "racket": "racket", + "scheme": "csi -script", + "ahk": "autohotkey", + "autoit": "autoit3", + "dart": "dart", + "pascal": "cd $dir && fpc $fileName && $dir$fileNameWithoutExt", + "d": "cd $dir && dmd $fileName && $dir$fileNameWithoutExt", + "haskell": "runhaskell", + "nim": "nim compile --verbosity:0 --hints:off --run", + "lisp": "sbcl --script", + "kit": "kitc --run", + "v": "v run", + "sass": "sass --style expanded", + "scss": "scss --style expanded", + "less": "cd $dir && lessc $fileName $fileNameWithoutExt.css", + "FortranFreeForm": "cd $dir && gfortran $fileName -o $fileNameWithoutExt && $dir$fileNameWithoutExt", + "fortran-modern": "cd $dir && gfortran $fileName -o $fileNameWithoutExt && $dir$fileNameWithoutExt", + "fortran_fixed-form": "cd $dir && gfortran $fileName -o $fileNameWithoutExt && $dir$fileNameWithoutExt", + "fortran": "cd $dir && gfortran $fileName -o $fileNameWithoutExt && $dir$fileNameWithoutExt", + "sml": "cd $dir && sml $fileName" + } } \ No newline at end of file diff --git a/imgs/wei.bmp b/imgs/wei.bmp new file mode 100644 index 0000000..36b4239 Binary files /dev/null and b/imgs/wei.bmp differ diff --git a/main.py b/main.py index bb8f284..aaf9be6 100644 --- a/main.py +++ b/main.py @@ -1,33 +1,107 @@ from math import floor, ceil from tqdm import tqdm +import sys +import os + + +def error(code): + print("[error:" + str(code) + "]", end="", file=sys.stderr) + if (code == 1): + print('参数数量错误', file=sys.stderr) + elif (code == 2): + print('文件无法读入,请检查你的图片路径', file=sys.stderr) + elif (code == 3): + print('输出路径无法写出,请检查你的路径', file=sys.stderr) + elif (code == 4): + print('参数有误,缩放请使用 __*__,旋转请使用 90/180/270', file=sys.stderr) + elif (code == 5): + print('缩放参数错误,新高/宽必须大于 0', file=sys.stderr) + elif (code == 6): + print('指定文件不是BMP格式,无法读入', file=sys.stderr) + elif (code == 7): + print('暂不支持此图片,目前仅支持 bpp=24/32 的文件', file=sys.stderr) + exit(code) + + +def warn(code): + print("[warn:" + str(code) + "]", end="") + if (code == 1): + print('缩放模式异常,已重置为双线性插值模式') + elif (code == 2): + print('附加功能异常,已恢复默认值') + else: + print('未知错误') + ################## 数据输入 Start ################## -# 输入数据 +if (len(sys.argv) not in [3, 4, 5, 6]): + error(1) -img = input("请输入图片路径:") -new_width = int(input("请输入新宽度(px):")) -new_height = int(input("请输入新高度(px):")) -print("模式 0 双线性插值") -print("模式 1 最邻近插值") -print("模式 2 高斯模糊缩放") -mode = int(input("请输入模式:")) +# 输入数据 +# img = input("请输入图片路径:") +# new_width = int(input("请输入新宽度(px):")) +# new_height = int(input("请输入新高度(px):")) +# print("模式 0 双线性插值") +# print("模式 1 最邻近插值") +# print("模式 2 高斯模糊缩放") +# mode = int(input("请输入模式:")) # img = 'imgs/text.bmp' # new_width = 2560 * 3 # new_height = 2560 # mode = 0 -if (mode not in [0, 1, 2]): - mode = 0 +input_file = sys.argv[1] +output_file = sys.argv[2] +new = sys.argv[3] + +# 模式 0 双线性插值 +# 模式 1 最邻近插值 +# 模式 2 旋转图片 + +mode = 0 +flur = 0 + +if ('*' in new): + new_width, new_height = map(int, sys.argv[3].split('*')) + if (new_width <= 0 or new_height <= 0): + error(5) + if (len(sys.argv) >= 5): + mode = int(sys.argv[4]) + if (mode not in [0, 1]): + warn(1) + mode = 0 + if (len(sys.argv) >= 6): + flur = int(sys.argv[5]) + if (flur not in [0, 1]): + warn(2) + flur = 0 + else: + mode = 0 +else: + angle = int(new) + if (angle not in [90, 180, 270]): + error(4) + + mode = 2 ################## 数据输入 End ################## ################## 文件读入 Start ################## +if (not os.path.exists(input_file) or not os.access(input_file, os.R_OK)): + error(2) + +if (not os.access(output_file, os.W_OK) and os.access(output_file, os.F_OK)): + error(3) + # 读入图片 -with open(img, 'rb') as f: - imgBytes = f.read() +with open(input_file, 'rb') as f: + try: + imgBytes = f.read() + except: + error(2) for _ in tqdm(range(len(imgBytes)), "读入文件中"): pass @@ -57,8 +131,7 @@ def sizeByte(size, length): # 位图文件头 # 检验文件头是否为 BM if (imgBytes[0] != 66 or imgBytes[1] != 77): - print("当前文件非 BMP 格式") - exit() + error(6) fileSize = byteSize(2, 4) #文件头中的文件大小 dataStart = byteSize(10, 4) #文件头中的数据开始字节 @@ -90,8 +163,7 @@ while (i < len(colorsBoard)): i += 4 if (not (bpp in [24, 32])): - print("不支持该图片") - exit() + error(7) ################## 文件头处理 End ################## ################## 像素点读入 Start ################## @@ -114,13 +186,6 @@ while (rowLength % 4 != 0 or rowLength == 0): i = dataStart for currentRow in tqdm(range(height), "读入像素点中"): currentCol = 0 - # if (bpp in [1, 2, 4, 8]): - # # 其实可以直接存入索引,之后再取出,但是为了易于理解,这里直接将像素数据插入 pixels 数组,这会导致效率的损失 - # b = 0 - # # while(b < width*bpp): - # # if(bpp==1): - # # print("") - # else: while (currentCol < width * (bpp // 8)): if (bpp == 32): pixels[currentRow].append({ @@ -148,7 +213,10 @@ for currentRow in tqdm(range(height), "读入像素点中"): currentCol += bpp // 8 # 读入图片为像素数组完成 -# 缩放图片 +################## 像素点读入 End ################## + +################## 缩放图片 Start ################## + # 变量预处理 scale_w = new_width / width scale_h = new_height / height @@ -217,6 +285,8 @@ for currentRow in tqdm(range(new_height), "计算新像素点中"): ori_col = floor(currentCol / scale_w) newpixels[currentRow].append(pixels[ori_row][ori_col]) +################## 缩放图片 End ################## + # 处理新文件 newimgArray = [66, 77] @@ -328,7 +398,8 @@ def flur(row, col): for i in tqdm(range(len(newpixels)), "将像素点格式化中"): row = newpixels[i] for col in range(len(row)): - if (mode == 2): + if (1 == flur): + print("?") newimgArray.extend(flur(i, col)) else: if (new_bpp // 8 == 3): @@ -347,7 +418,7 @@ for i in tqdm(range(len(newpixels)), "将像素点格式化中"): # 写入新的文件 newimgBytes = bytes(newimgArray) -with open(img[:-4] + "_" + str(mode) + "_new" + img[-4:], 'wb') as f: +with open(output_file, 'wb') as f: f.write(newimgBytes) for _ in tqdm(range(len(newimgBytes)), "写出图片中"): pass \ No newline at end of file