commit
84db6cfc94
10 changed files with 335 additions and 0 deletions
-
BIN.DS_Store
-
6.idea/inspectionProfiles/profiles_settings.xml
-
4.idea/misc.xml
-
217.idea/workspace.xml
-
108app.py
-
BINimg/.DS_Store
-
BINimg/1.pic.jpg
-
BINimg/2.pic.jpg
-
BINimg/a.png
-
BINimg/lie.jpg
@ -0,0 +1,6 @@ |
|||||
|
<component name="InspectionProjectProfileManager"> |
||||
|
<settings> |
||||
|
<option name="USE_PROJECT_PROFILE" value="false" /> |
||||
|
<version value="1.0" /> |
||||
|
</settings> |
||||
|
</component> |
@ -0,0 +1,4 @@ |
|||||
|
<?xml version="1.0" encoding="UTF-8"?> |
||||
|
<project version="4"> |
||||
|
<component name="ProjectRootManager" version="2" project-jdk-name="$USER_HOME$/anaconda3 (2)" project-jdk-type="Python SDK" /> |
||||
|
</project> |
@ -0,0 +1,217 @@ |
|||||
|
<?xml version="1.0" encoding="UTF-8"?> |
||||
|
<project version="4"> |
||||
|
<component name="AutoImportSettings"> |
||||
|
<option name="autoReloadType" value="SELECTIVE" /> |
||||
|
</component> |
||||
|
<component name="ChangeListManager"> |
||||
|
<list default="true" id="89e8558a-64c4-41a4-8fb7-95d18b1c5bb8" name="Changes" comment="" /> |
||||
|
<option name="SHOW_DIALOG" value="false" /> |
||||
|
<option name="HIGHLIGHT_CONFLICTS" value="true" /> |
||||
|
<option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" /> |
||||
|
<option name="LAST_RESOLUTION" value="IGNORE" /> |
||||
|
</component> |
||||
|
<component name="FlaskConsoleOptions" custom-start-script="import sys sys.path.extend([WORKING_DIR_AND_PYTHON_PATHS]) from flask.cli import ScriptInfo locals().update(ScriptInfo(create_app=None).load_app().make_shell_context()) print("Python %s on %s\nApp: %s [%s]\nInstance: %s" % (sys.version, sys.platform, app.import_name, app.env, app.instance_path))"> |
||||
|
<envs> |
||||
|
<env key="FLASK_APP" value="app" /> |
||||
|
</envs> |
||||
|
<option name="myCustomStartScript" value="import sys sys.path.extend([WORKING_DIR_AND_PYTHON_PATHS]) from flask.cli import ScriptInfo locals().update(ScriptInfo(create_app=None).load_app().make_shell_context()) print("Python %s on %s\nApp: %s [%s]\nInstance: %s" % (sys.version, sys.platform, app.import_name, app.env, app.instance_path))" /> |
||||
|
<option name="myEnvs"> |
||||
|
<map> |
||||
|
<entry key="FLASK_APP" value="app" /> |
||||
|
</map> |
||||
|
</option> |
||||
|
</component> |
||||
|
<component name="ProjectId" id="2Sj1dGp6OZglii4ep4rXpDFntQl" /> |
||||
|
<component name="ProjectViewState"> |
||||
|
<option name="hideEmptyMiddlePackages" value="true" /> |
||||
|
<option name="showLibraryContents" value="true" /> |
||||
|
</component> |
||||
|
<component name="PropertiesComponent"><![CDATA[{ |
||||
|
"keyToString": { |
||||
|
"RunOnceActivity.ShowReadmeOnStart": "true", |
||||
|
"WebServerToolWindowFactoryState": "false", |
||||
|
"node.js.detected.package.eslint": "true", |
||||
|
"node.js.detected.package.tslint": "true", |
||||
|
"node.js.selected.package.eslint": "(autodetect)", |
||||
|
"node.js.selected.package.tslint": "(autodetect)", |
||||
|
"settings.editor.selected.configurable": "com.jetbrains.python.configuration.PyActiveSdkModuleConfigurable", |
||||
|
"vue.rearranger.settings.migration": "true" |
||||
|
} |
||||
|
}]]></component> |
||||
|
<component name="RecentsManager"> |
||||
|
<key name="MoveFile.RECENT_KEYS"> |
||||
|
<recent name="$PROJECT_DIR$/template" /> |
||||
|
</key> |
||||
|
</component> |
||||
|
<component name="RunManager" selected="Python.app"> |
||||
|
<configuration name="app" type="PythonConfigurationType" factoryName="Python" temporary="true" nameIsGenerated="true"> |
||||
|
<module name="opencv" /> |
||||
|
<option name="INTERPRETER_OPTIONS" value="" /> |
||||
|
<option name="PARENT_ENVS" value="true" /> |
||||
|
<envs> |
||||
|
<env name="PYTHONUNBUFFERED" value="1" /> |
||||
|
</envs> |
||||
|
<option name="SDK_HOME" value="" /> |
||||
|
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" /> |
||||
|
<option name="IS_MODULE_SDK" value="true" /> |
||||
|
<option name="ADD_CONTENT_ROOTS" value="true" /> |
||||
|
<option name="ADD_SOURCE_ROOTS" value="true" /> |
||||
|
<EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" /> |
||||
|
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/app.py" /> |
||||
|
<option name="PARAMETERS" value="" /> |
||||
|
<option name="SHOW_COMMAND_LINE" value="false" /> |
||||
|
<option name="EMULATE_TERMINAL" value="false" /> |
||||
|
<option name="MODULE_MODE" value="false" /> |
||||
|
<option name="REDIRECT_INPUT" value="false" /> |
||||
|
<option name="INPUT_FILE" value="" /> |
||||
|
<method v="2" /> |
||||
|
</configuration> |
||||
|
<configuration name="color" type="PythonConfigurationType" factoryName="Python" temporary="true" nameIsGenerated="true"> |
||||
|
<module name="opencv" /> |
||||
|
<option name="INTERPRETER_OPTIONS" value="" /> |
||||
|
<option name="PARENT_ENVS" value="true" /> |
||||
|
<envs> |
||||
|
<env name="PYTHONUNBUFFERED" value="1" /> |
||||
|
</envs> |
||||
|
<option name="SDK_HOME" value="" /> |
||||
|
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" /> |
||||
|
<option name="IS_MODULE_SDK" value="true" /> |
||||
|
<option name="ADD_CONTENT_ROOTS" value="true" /> |
||||
|
<option name="ADD_SOURCE_ROOTS" value="true" /> |
||||
|
<EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" /> |
||||
|
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/color.py" /> |
||||
|
<option name="PARAMETERS" value="" /> |
||||
|
<option name="SHOW_COMMAND_LINE" value="false" /> |
||||
|
<option name="EMULATE_TERMINAL" value="false" /> |
||||
|
<option name="MODULE_MODE" value="false" /> |
||||
|
<option name="REDIRECT_INPUT" value="false" /> |
||||
|
<option name="INPUT_FILE" value="" /> |
||||
|
<method v="2" /> |
||||
|
</configuration> |
||||
|
<configuration name="main" type="PythonConfigurationType" factoryName="Python" nameIsGenerated="true"> |
||||
|
<module name="opencv" /> |
||||
|
<option name="INTERPRETER_OPTIONS" value="" /> |
||||
|
<option name="PARENT_ENVS" value="true" /> |
||||
|
<envs> |
||||
|
<env name="PYTHONUNBUFFERED" value="1" /> |
||||
|
</envs> |
||||
|
<option name="SDK_HOME" value="" /> |
||||
|
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" /> |
||||
|
<option name="IS_MODULE_SDK" value="true" /> |
||||
|
<option name="ADD_CONTENT_ROOTS" value="true" /> |
||||
|
<option name="ADD_SOURCE_ROOTS" value="true" /> |
||||
|
<EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" /> |
||||
|
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/main.py" /> |
||||
|
<option name="PARAMETERS" value="" /> |
||||
|
<option name="SHOW_COMMAND_LINE" value="false" /> |
||||
|
<option name="EMULATE_TERMINAL" value="false" /> |
||||
|
<option name="MODULE_MODE" value="false" /> |
||||
|
<option name="REDIRECT_INPUT" value="false" /> |
||||
|
<option name="INPUT_FILE" value="" /> |
||||
|
<method v="2" /> |
||||
|
</configuration> |
||||
|
<configuration name="temp" type="PythonConfigurationType" factoryName="Python" temporary="true" nameIsGenerated="true"> |
||||
|
<module name="opencv" /> |
||||
|
<option name="INTERPRETER_OPTIONS" value="" /> |
||||
|
<option name="PARENT_ENVS" value="true" /> |
||||
|
<envs> |
||||
|
<env name="PYTHONUNBUFFERED" value="1" /> |
||||
|
</envs> |
||||
|
<option name="SDK_HOME" value="" /> |
||||
|
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" /> |
||||
|
<option name="IS_MODULE_SDK" value="true" /> |
||||
|
<option name="ADD_CONTENT_ROOTS" value="true" /> |
||||
|
<option name="ADD_SOURCE_ROOTS" value="true" /> |
||||
|
<EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" /> |
||||
|
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/temp.py" /> |
||||
|
<option name="PARAMETERS" value="" /> |
||||
|
<option name="SHOW_COMMAND_LINE" value="false" /> |
||||
|
<option name="EMULATE_TERMINAL" value="false" /> |
||||
|
<option name="MODULE_MODE" value="false" /> |
||||
|
<option name="REDIRECT_INPUT" value="false" /> |
||||
|
<option name="INPUT_FILE" value="" /> |
||||
|
<method v="2" /> |
||||
|
</configuration> |
||||
|
<configuration name="test" type="PythonConfigurationType" factoryName="Python" temporary="true" nameIsGenerated="true"> |
||||
|
<module name="opencv" /> |
||||
|
<option name="INTERPRETER_OPTIONS" value="" /> |
||||
|
<option name="PARENT_ENVS" value="true" /> |
||||
|
<envs> |
||||
|
<env name="PYTHONUNBUFFERED" value="1" /> |
||||
|
</envs> |
||||
|
<option name="SDK_HOME" value="" /> |
||||
|
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" /> |
||||
|
<option name="IS_MODULE_SDK" value="true" /> |
||||
|
<option name="ADD_CONTENT_ROOTS" value="true" /> |
||||
|
<option name="ADD_SOURCE_ROOTS" value="true" /> |
||||
|
<EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" /> |
||||
|
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/test.py" /> |
||||
|
<option name="PARAMETERS" value="" /> |
||||
|
<option name="SHOW_COMMAND_LINE" value="false" /> |
||||
|
<option name="EMULATE_TERMINAL" value="false" /> |
||||
|
<option name="MODULE_MODE" value="false" /> |
||||
|
<option name="REDIRECT_INPUT" value="false" /> |
||||
|
<option name="INPUT_FILE" value="" /> |
||||
|
<method v="2" /> |
||||
|
</configuration> |
||||
|
<configuration name="transform" type="PythonConfigurationType" factoryName="Python" temporary="true" nameIsGenerated="true"> |
||||
|
<module name="opencv" /> |
||||
|
<option name="INTERPRETER_OPTIONS" value="" /> |
||||
|
<option name="PARENT_ENVS" value="true" /> |
||||
|
<envs> |
||||
|
<env name="PYTHONUNBUFFERED" value="1" /> |
||||
|
</envs> |
||||
|
<option name="SDK_HOME" value="" /> |
||||
|
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" /> |
||||
|
<option name="IS_MODULE_SDK" value="true" /> |
||||
|
<option name="ADD_CONTENT_ROOTS" value="true" /> |
||||
|
<option name="ADD_SOURCE_ROOTS" value="true" /> |
||||
|
<EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" /> |
||||
|
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/transform.py" /> |
||||
|
<option name="PARAMETERS" value="" /> |
||||
|
<option name="SHOW_COMMAND_LINE" value="false" /> |
||||
|
<option name="EMULATE_TERMINAL" value="false" /> |
||||
|
<option name="MODULE_MODE" value="false" /> |
||||
|
<option name="REDIRECT_INPUT" value="false" /> |
||||
|
<option name="INPUT_FILE" value="" /> |
||||
|
<method v="2" /> |
||||
|
</configuration> |
||||
|
<recent_temporary> |
||||
|
<list> |
||||
|
<item itemvalue="Python.app" /> |
||||
|
<item itemvalue="Python.test" /> |
||||
|
<item itemvalue="Python.temp" /> |
||||
|
<item itemvalue="Python.color" /> |
||||
|
<item itemvalue="Python.transform" /> |
||||
|
</list> |
||||
|
</recent_temporary> |
||||
|
</component> |
||||
|
<component name="SpellCheckerSettings" RuntimeDictionaries="0" Folders="0" CustomDictionaries="0" DefaultDictionary="application-level" UseSingleDictionary="true" transferred="true" /> |
||||
|
<component name="TaskManager"> |
||||
|
<task active="true" id="Default" summary="Default task"> |
||||
|
<changelist id="89e8558a-64c4-41a4-8fb7-95d18b1c5bb8" name="Changes" comment="" /> |
||||
|
<created>1689645263707</created> |
||||
|
<option name="number" value="Default" /> |
||||
|
<option name="presentableId" value="Default" /> |
||||
|
<updated>1689645263707</updated> |
||||
|
<workItem from="1689645275071" duration="259000" /> |
||||
|
<workItem from="1689646243955" duration="50254000" /> |
||||
|
</task> |
||||
|
<servers /> |
||||
|
</component> |
||||
|
<component name="TypeScriptGeneratedFilesManager"> |
||||
|
<option name="version" value="3" /> |
||||
|
</component> |
||||
|
<component name="com.intellij.coverage.CoverageDataManagerImpl"> |
||||
|
<SUITE FILE_PATH="coverage/opencv$hello_opencv.coverage" NAME="hello_opencv Coverage Results" MODIFIED="1689645383118" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" /> |
||||
|
<SUITE FILE_PATH="coverage/opencv$threshold.coverage" NAME="threshold Coverage Results" MODIFIED="1689749307625" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" /> |
||||
|
<SUITE FILE_PATH="coverage/opencv$temp.coverage" NAME="temp Coverage Results" MODIFIED="1689835956021" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" /> |
||||
|
<SUITE FILE_PATH="coverage/opencv$test.coverage" NAME="test Coverage Results" MODIFIED="1689841734801" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" /> |
||||
|
<SUITE FILE_PATH="coverage/opencv$main.coverage" NAME="main Coverage Results" MODIFIED="1689730812259" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" /> |
||||
|
<SUITE FILE_PATH="coverage/opencv$app.coverage" NAME="app Coverage Results" MODIFIED="1689848027328" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" /> |
||||
|
<SUITE FILE_PATH="coverage/opencv$color.coverage" NAME="color Coverage Results" MODIFIED="1689835570756" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" /> |
||||
|
<SUITE FILE_PATH="coverage/opencv$sift.coverage" NAME="sift Coverage Results" MODIFIED="1689729874855" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" /> |
||||
|
<SUITE FILE_PATH="coverage/opencv$lie.coverage" NAME="lie Coverage Results" MODIFIED="1689758832253" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" /> |
||||
|
<SUITE FILE_PATH="coverage/opencv$transform.coverage" NAME="transform Coverage Results" MODIFIED="1689834348789" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" /> |
||||
|
</component> |
||||
|
</project> |
@ -0,0 +1,108 @@ |
|||||
|
# coding=utf-8 |
||||
|
import cv2 |
||||
|
import numpy as np |
||||
|
import math |
||||
|
|
||||
|
# 修改图像的对比度,coefficent>0, <1降低对比度,>1提升对比度 建议0-2 |
||||
|
def change_contrast(img, coefficent): |
||||
|
imggray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) |
||||
|
m = cv2.mean(img)[0] |
||||
|
graynew = m + coefficent * (imggray - m) |
||||
|
img1 = np.zeros(img.shape, np.float32) |
||||
|
k = np.divide(graynew, imggray, out=np.zeros_like(graynew), where=imggray != 0) |
||||
|
img1[:, :, 0] = img[:, :, 0] * k |
||||
|
img1[:, :, 1] = img[:, :, 1] * k |
||||
|
img1[:, :, 2] = img[:, :, 2] * k |
||||
|
img1[img1 > 255] = 255 |
||||
|
img1[img1 < 0] = 0 |
||||
|
return img1.astype(np.uint8) |
||||
|
|
||||
|
# 修改图像的亮度,brightness取值0~2 <1表示变暗 >1表示变亮 |
||||
|
def change_brightness(img, brightness): |
||||
|
[averB, averG, averR] = np.array(cv2.mean(img))[:-1] / 3 |
||||
|
k = np.ones((img.shape)) |
||||
|
k[:, :, 0] *= averB |
||||
|
k[:, :, 1] *= averG |
||||
|
k[:, :, 2] *= averR |
||||
|
img = img + (brightness - 1) * k |
||||
|
img[img > 255] = 255 |
||||
|
img[img < 0] = 0 |
||||
|
return img.astype(np.uint8) |
||||
|
|
||||
|
# 对图像二值化并取中值滤波 |
||||
|
def threshold_img(image): |
||||
|
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) |
||||
|
retval, dst = cv2.threshold(gray, 0, 255, cv2.THRESH_OTSU) |
||||
|
img_median = cv2.medianBlur(dst, 3) |
||||
|
return img_median |
||||
|
|
||||
|
# 腐蚀图像 |
||||
|
def corrosion_img(image): |
||||
|
# 腐蚀操作会把裂痕也消除 |
||||
|
kernel = np.ones((9, 9), dtype=np.uint8) |
||||
|
opening = cv2.morphologyEx(image, cv2.MORPH_OPEN, kernel, 1) |
||||
|
return opening |
||||
|
|
||||
|
# 找出最右侧的近似竖直直线 通过直线与水平的角度判断是否倾斜 大于容错率的竖直 小于容错率的倾斜 |
||||
|
def lines_img(image): |
||||
|
slopes = [] |
||||
|
yErrorRange = 3 |
||||
|
xErrorRange = 3 |
||||
|
minLength = 20 |
||||
|
# 创建一个LSD对象 |
||||
|
lsd = cv2.createLineSegmentDetector(0) |
||||
|
# 执行检测结果 |
||||
|
dlines = lsd.detect(image) |
||||
|
# 绘制检测结果 |
||||
|
for dline in dlines[0]: |
||||
|
x0 = int(round(dline[0][0])) |
||||
|
y0 = int(round(dline[0][1])) |
||||
|
x1 = int(round(dline[0][2])) |
||||
|
y1 = int(round(dline[0][3])) |
||||
|
length = math.hypot(x1 - x0, y1 - y0) |
||||
|
if (x0 > 605 and x1 > 605): |
||||
|
# print((x0, y0), (x1, y1)) |
||||
|
# 需要根据角坐标排除 横向线,针对纵向线判断是否有倾斜 |
||||
|
# 过滤横线 |
||||
|
if not (abs(x1 - x0) > xErrorRange and abs(y1 - y0) < yErrorRange): |
||||
|
# 过滤线段长度 |
||||
|
if not (length < minLength): |
||||
|
if x1 - x0 != 0: |
||||
|
k = abs(y1 - y0) / abs(x1 - x0) |
||||
|
angle = math.atan(k) * 180 / math.pi |
||||
|
slopes.append(angle) |
||||
|
print(angle) |
||||
|
# cv2.line(img0, (x0, y0), (x1,y1), (0,255,0), 1, cv2.LINE_AA) |
||||
|
# 有小于85度的就证明胶带倾斜了 |
||||
|
threshold = 85 |
||||
|
res = any(x < threshold for x in slopes) |
||||
|
if res: |
||||
|
print("胶带倾斜") |
||||
|
else: |
||||
|
print("胶带正确") |
||||
|
|
||||
|
|
||||
|
def detectionImg(): |
||||
|
# 读取输入图片 |
||||
|
img = cv2.imread("img/a.png") |
||||
|
l = 0 |
||||
|
c = 34 |
||||
|
# 亮度 -1~1 |
||||
|
imgBrightness = change_brightness(img, float(l - 50) / float(50)) |
||||
|
# 对比度 0~2 |
||||
|
img0 = change_contrast(imgBrightness, c / 50) |
||||
|
thresholdImg = threshold_img(img0) |
||||
|
corrosionImg = corrosion_img(thresholdImg) |
||||
|
lines_img(corrosionImg) |
||||
|
# 显示并保存结果 |
||||
|
cv2.imshow("gray", corrosionImg) |
||||
|
cv2.imshow("lines", img0) |
||||
|
cv2.waitKey(0) |
||||
|
cv2.destroyAllWindows() |
||||
|
|
||||
|
|
||||
|
if __name__ == '__main__': |
||||
|
detectionImg() |
||||
|
|
||||
|
|
||||
|
|
After Width: 1276 | Height: 1702 | Size: 352 KiB |
After Width: 1276 | Height: 1702 | Size: 323 KiB |
After Width: 632 | Height: 1266 | Size: 1.4 MiB |
After Width: 736 | Height: 1952 | Size: 343 KiB |
Write
Preview
Loading…
Cancel
Save
Reference in new issue