Open11

wavesahre e-paper 7.5 inch で遊んでみた

kaitokaito
def convert_to_grayscale_bmp(input_image, output_path, threshold=128):
    # 画像を読み込む
    image = cv2.imread(input_image)

    if image is None:
        print("画像の読み込みに失敗しました")
        return

    # グレースケールに変換
    grayscale_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

    # 2値化処理
    _, binary_image = cv2.threshold(grayscale_image, threshold, 255, cv2.THRESH_BINARY)

    # 2値画像をPIL形式に変換
    pil_image = Image.fromarray(binary_image)
    image = pil_image.convert("1")

    # 出力パスに拡張子を追加
    output_path_with_extension = output_path + ".bmp"

    # 画像を保存
    image.save(output_path_with_extension)

    print(f"2値化したBMP画像を保存しました: {output_path_with_extension}")

    return output_path_with_extension

python3でe-paper 用の2値画像作成関数.
一度opencv でいい感じに2値化してからpilでグレースケールで出力してる.
opencvでうまくグレースケールにできなかった.

kaitokaito
from PIL import Image

def convert_to_grayscale_dots(input_image, output_path):
    # 画像を読み込む
    image = Image.open(input_image)

    # グレースケールに変換
    grayscale_image = image.convert("L")

    # ディザリングを適用
    dithered_image = grayscale_image.convert("1", dither=Image.FLOYDSTEINBERG)

    # 画像を保存
    dithered_image.save(output_path)

    print(f"ディザリングを適用した画像を保存しました: {output_path}")
    return output_path

ディザリングで白黒でもきれいに見える.
ドット感が強くなるけどこっちのほうが好き

kaitokaito

curl のライブラリを使用して C++ から web API へのアクセス
GETだけ実装.
Yahooの天気APIから天気情報が取りたかった

sudo apt update
sudo apt install curl libcurl4 libcurl3-dev
curl.hpp

class Curl
{
 public:
  Curl();
  ~Curl();

  std::string get(const std::string &url);

 private:

  void clean_up();

  CURL *curl_;
};
curl.cpp
#include "curl.hpp"

#include <cstdlib>
#include <exception>
#include <stdexcept>


size_t callbackWrite(char *ptr, size_t size, size_t nmemb, std::string *stream)
{
  int dataLength = size * nmemb;
  stream->append(ptr, dataLength);
  return dataLength;
}

Curl::Curl()
{
  curl_ = curl_easy_init();
  if (!curl_)
  {
    fprintf(stderr, "Failed to initialize curl\n");
    std::exit(1);
  }
}

Curl::~Curl()
{
  this->clean_up();
}

void Curl::clean_up()
{
  if (this->curl_)
  {
    curl_easy_cleanup(this->curl_);
  }
}

std::string Curl::get(const std::string &url)
{
  if (!this->curl_)
  {
    throw std::runtime_error("curl is not initialized");
  }

  std::string chunk;
  CURLcode res;
  curl_easy_setopt(this->curl_, CURLOPT_URL, url.c_str());
  curl_easy_setopt(this->curl_, CURLOPT_WRITEFUNCTION, callbackWrite);
  curl_easy_setopt(this->curl_, CURLOPT_WRITEDATA, &chunk);
  res = curl_easy_perform(this->curl_);
  if (res != CURLE_OK)
  {
    fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res));
  }

  return chunk;
}