{"id":20317708,"url":"https://github.com/kuro337/imghttp","last_synced_at":"2026-06-11T14:31:16.556Z","repository":{"id":171828948,"uuid":"648471607","full_name":"kuro337/imgHTTP","owner":"kuro337","description":"High Performance Multi Threaded C++ Image Processing Web Server","archived":false,"fork":false,"pushed_at":"2024-01-17T01:16:25.000Z","size":25,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-06-19T20:03:26.835Z","etag":null,"topics":["cpp"],"latest_commit_sha":null,"homepage":"","language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/kuro337.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-06-02T03:46:24.000Z","updated_at":"2023-10-12T05:22:43.000Z","dependencies_parsed_at":null,"dependency_job_id":"1d315e3a-0974-48d5-aafa-6ae7ef699f1b","html_url":"https://github.com/kuro337/imgHTTP","commit_stats":null,"previous_names":["chinmay337/imghttp","kuro337/imghttp"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/kuro337/imgHTTP","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kuro337%2FimgHTTP","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kuro337%2FimgHTTP/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kuro337%2FimgHTTP/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kuro337%2FimgHTTP/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/kuro337","download_url":"https://codeload.github.com/kuro337/imgHTTP/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kuro337%2FimgHTTP/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34204177,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-11T02:00:06.485Z","response_time":57,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cpp"],"created_at":"2024-11-14T18:35:25.015Z","updated_at":"2026-06-11T14:31:15.784Z","avatar_url":"https://github.com/kuro337.png","language":"C++","funding_links":[],"categories":[],"sub_categories":[],"readme":"# C++ OpenCV Drogon Server\n\n_High Performance Multi Threaded C++ Image Processing Web Server_\n\n\u003c/br\u003e\n\n## Features\n\n\u003c/br\u003e\n\n- Resize Images by simply providing a `Link`, `Width`, and `Height`\n- Inbuilt `Caching` and `Multithreading` for `High Performance`\n- Automatically Detect Image Format and Perform Conversions\n- Adds Transparent Padding to Maintain Original Aspect Ratio\n- Download Images\n- Convert Images between `JPEG` , `WEBP` , `PNG`\n\n\u003c/br\u003e\n\n- `OpenCV` Image Resizing Algorithms :\n  - `INTER_NEAREST` - a nearest-neighbor interpolation\n  - `INTER_LINEAR` - a bilinear interpolation (used by default)\n  - `INTER_AREA` - resampling using pixel area relation. It may be a preferred method for image decimation, as it gives moire’-free results. But when the image is zoomed, it is similar to the `INTER_NEAREST` method.\n  - `INTER_CUBIC` - a bicubic interpolation over 4x4 pixel neighborhood\n  - `INTER_LANCZOS4` - a Lanczos interpolation over 8x8 pixel neighborhood\n\n\u003c/br\u003e\n\n- Fastest Algorithm - `INTER_NEAREST`\n- Highest Quality Algorithm - `INTER_AREA` || `INTER_LANCZOS4`\n\n## Usage and Performance\n\n\u003c/br\u003e\n\n```bash\nmkdir build \u0026\u0026 cd build\ncmake ..\nmake\n\ncd bin\n\n./simple\n./imghttp_test\n\n```\n\n- Endpoints\n\n```bash\n# Commands\n\n# Hello World\ncurl -X GET http://localhost\n\n# POST Return Link\ncurl -X POST -H \"Content-Type: application/json\" -d '{ \"imageLink\": \"https://example.com/image.jpg\", \"size\": \"500x400\" }' http://localhost\n\n# Download Image\ncurl -X POST -H \"Content-Type: application/json\" -d '{ \"imageLink\": \"https://example.com/image.jpg\", \"size\": \"500x400\" }' http://localhost:80/download\n\n# Resize Image\ncurl -X POST -H \"Content-Type: application/json\" -d '{ \"imageLink\": \"https://ex.com/image.jpg\", \"width\": 75, \"height\": 150, \"retainFormat\": true }' http://localhost:80/resize --output resizedImage5.jpeg\n\n# Sample Commands\n\n\n# Resize an Image (JPEG)\ncurl -X POST -H \"Content-Type: application/json\" -d '{ \"imageLink\": \"https://images.pexels.com/photos/5230612/pexels-photo-5230612.jpeg?auto=compress\u0026cs=tinysrgb\u0026w=1260\u0026h=750\u0026dpr=1\", \"width\": 75, \"height\": 150, \"retainFormat\": true }' http://localhost:80/resize --output resizedImage5.jpeg\n\n# Resize an Image (WebP)\ncurl -X POST -H \"Content-Type: application/json\" -d '{ \"imageLink\": \"https://cdn.mos.cms.futurecdn.net/GDy6nDyEtUkJbEvEpqDgoB-1600-80.jpg.webp\", \"width\": 100, \"height\": 150, \"retainFormat\": false }' http://localhost:80/resize --output resizedImage3.png\n\n# Resize Cat Image (WebP)\ncurl -X POST -H \"Content-Type: application/json\" -d '{ \"imageLink\": \"https://static01.nyt.com/images/2021/09/14/science/07CAT-STRIPES/07CAT-STRIPES-superJumbo.jpg?quality=75\u0026auto=webp\", \"width\": 100, \"height\": 150, \"retainFormat\": false }' http://localhost:80/resize --output resizedImage3.png\n\n\n# Download an Image\ncurl -X POST -H \"Content-Type: application/json\" -d '{ \"imageLink\": \"https://images.pexels.com/photos/5230612/pexels-photo-5230612.jpeg?auto=compress\u0026cs=tinysrgb\u0026w=1260\u0026h=750\u0026dpr=1\", \"size\": \"500x400\" }' http://localhost/download\n\n\ndocker exec img ls /app/images\n\n```\n\n## Performance\n\n- Create `request.lua` file\n\n```lua\nwrk.method = \"POST\"\nwrk.headers[\"Content-Type\"] = \"application/json\"\nwrk.body = '{ \"imageLink\": \"https://images.pexels.com/photos/5230612/pexels-photo-5230612.jpeg?auto=compress\u0026cs=tinysrgb\u0026w=1260\u0026h=750\u0026dpr=1\", \"width\": 100, \"height\": 150, \"format\": \"jpg\" }'\n\nfunction setup(thread)\n   thread:set(\"threadid\", thread.id)\nend\n\nfunction init(args)\n   requests = 10  -- Number of concurrent requests\n   thread_id = 0\nend\n\nfunction request()\n   thread_id = thread_id + 1\n   local id = thread_id % requests\n   local path = \"/resize?id=\" .. id\n   return wrk.format(\"POST\", path, nil, wrk.body)\nend\n```\n\n- Run `Performance Test`\n\n```bash\n# Measuring Performance using wrk\nsudo apt-get install wrk\n\n# Small Load\nwrk -c 10 -t 10 -d 10s -s request.lua http://localhost:80\n\n# Large Load\nwrk -c 100 -t 1000 -d 30s -s request.lua http://localhost:80\n\n\n# Monitoring CPU and Memory Usage\n\nsudo apt-get install docker-stats\ndocker stats \u003ccontainer_id\u003e\n\n# Increasing number of Open Files that can be created\nulimit -n # Shows file limit\nulimit -n 10000 # Sets file limit to 10000\n\n```\n\n- `C++` Sample Code included as a single `.cpp` file in case you want to run a Drogon server yourself\n\n```cpp\n\n#include \u003cdrogon/drogon.h\u003e\n#include \u003cjson/json.h\u003e\n\nusing namespace drogon;\n\nclass HelloWorldController : public drogon::HttpController\u003cHelloWorldController\u003e\n{\npublic:\n  METHOD_LIST_BEGIN\n  // Handler for GET request \"/\"\n  ADD_METHOD_TO(HelloWorldController::sayHello, \"/\", Get);\n  // Handler for POST request \"/\"\n  ADD_METHOD_TO(HelloWorldController::processImage, \"/\", Post);\n  METHOD_LIST_END\n\n  void sayHello(const HttpRequestPtr \u0026req, std::function\u003cvoid(const HttpResponsePtr \u0026)\u003e \u0026\u0026callback)\n  {\n    auto response = HttpResponse::newHttpResponse();\n    response-\u003esetBody(\"Welcome to Kalz' High Performance Web Server\");\n    callback(response);\n  }\n\n  void processImage(const HttpRequestPtr \u0026req, std::function\u003cvoid(const HttpResponsePtr \u0026)\u003e \u0026\u0026callback)\n  {\n    if (req-\u003emethod() == HttpMethod::Post)\n    {\n      const auto \u0026body = req-\u003egetBody();\n      std::string bodyString(body.data(), body.length()); // Convert boost::string_view to std::string\n      Json::CharReaderBuilder builder;\n      Json::Value json;\n      JSONCPP_STRING err;\n      std::istringstream bodyStream(bodyString);\n      if (Json::parseFromStream(builder, bodyStream, \u0026json, \u0026err))\n      {\n        const std::string imageLink = json[\"imageLink\"].asString();\n        const int imageSize = json[\"size\"].asInt();\n        Json::Value jsonResponse;\n        jsonResponse[\"imageLink\"] = imageLink;\n        auto response = HttpResponse::newHttpJsonResponse(jsonResponse);\n        callback(response);\n      }\n      else\n      {\n        auto errorResponse = HttpResponse::newHttpResponse();\n        errorResponse-\u003esetStatusCode(HttpStatusCode::k400BadRequest);\n        errorResponse-\u003esetBody(\"Invalid JSON Format\");\n        callback(errorResponse);\n      }\n    }\n    else\n    {\n      auto errorResponse = HttpResponse::newHttpResponse();\n      errorResponse-\u003esetStatusCode(HttpStatusCode::k405MethodNotAllowed);\n      errorResponse-\u003esetBody(\"Method Not Allowed\");\n      callback(errorResponse);\n    }\n  }\n};\n\nint main()\n{\n  app().addListener(\"0.0.0.0\", 80); // Listen on port 80\n  app().run();\n  return 0;\n}\n\n\n```\n\n- `Dockerfile` to build\n\n```dockerfile\n# Base image\nFROM ubuntu:20.04\n\n# Set environment variables to noninteractive and set timezone\nENV DEBIAN_FRONTEND=noninteractive\nENV TZ=America/Los_Angeles\n\n# Install necessary packages\nRUN apt-get update \u0026\u0026 apt-get install -y \\\n    g++ \\\n    make \\\n    cmake \\\n    libssl-dev \\\n    libjsoncpp-dev \\\n    uuid-dev \\\n    zlib1g-dev \\\n    git \\\n    libboost-all-dev \\\n    libpthread-stubs0-dev \\\n    libjsoncpp-dev \\\n    uuid-dev \\\n    zlib1g-dev \\\n    openssl \\\n    libssl-dev \\\n    libmysqlclient-dev \\\n    libstdc++-9-dev \\\n    libcurl4-openssl-dev \\\n    curl \\\n    libpq-dev \\\n    libopencv-dev \\\n    libspdlog-dev \\\n    sqlite3 \\\n    libsqlite3-dev\n\n\n# Clone and build Trantor library\nRUN git clone https://github.com/an-tao/trantor.git /trantor\nWORKDIR /trantor\nRUN mkdir build\nWORKDIR /trantor/build\nRUN cmake ..\nRUN make \u0026\u0026 make install\n\n# Clone and build Drogon framework\nWORKDIR /\nRUN git clone https://github.com/an-tao/drogon.git /drogon\nWORKDIR /drogon\nRUN git submodule update --init\nRUN mkdir build\nWORKDIR /drogon/build\nRUN cmake ..\nRUN make \u0026\u0026 make install\n\n# Set workdir\nWORKDIR /app\n\n# Copy the current folder which contains C++ source code to the Docker image under /app\nCOPY ./c++ /app/c++\n\n# Specify the build command\nRUN g++ -std=c++17 -o myapp c++/main.cpp c++/Controller.cpp c++/ImageCache.cpp -l drogon -l trantor -l jsoncpp -l uuid -l ssl -l crypto -l boost_system -l pthread -ldl -lz -l curl -l opencv_core -l opencv_imgproc -l opencv_imgcodecs -l spdlog -lsqlite3 -I /usr/include/jsoncpp -I /usr/include/opencv4 -I /usr/local/include -I /usr/local/include/spdlog -L /usr/local/lib\n\n# Expose port 80 to the outside\nEXPOSE 80\n\n# Command to run the executable\nCMD [\"./myapp\"]\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkuro337%2Fimghttp","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkuro337%2Fimghttp","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkuro337%2Fimghttp/lists"}