さんだすメモ

さメモ

技術ブログでは、ない・・・

画像の枠を切り取る[C]

はじめに

libpngについて参考にしたもの
スクショを編集する用途で作りましたが、上手にスクショすればいいだけだと気づいたので多分使いません。スクショをあとから切り取るのに使えるときがあるかも?

ソースコードおよび実行ファイル

Github.com

処理の流れ

  • 行・列を両端から調べていき、単色であるものをチェックする
  • 単色の行・列を除いた画像を出力する

行・列を両端から調べていき、単色であるものをチェックする

int rowIsSolidColor(int j, RAWDATA_t raw); // 行が単色ならFALSE
int columnIsSolidColor(int i, RAWDATA_t raw); // 列が単色ならFALSE

int main(int argc, char *argv[]) {
  
  ...
  
  int *jList; // 上端・下端から続いている単色の行をFALSEにする
  jList = (int*)malloc(sizeof(int)*raw.height);
  for (j = 0; j < raw.height; j++) jList[j] = TRUE;
  for (j = 0; j < raw.height; j++) {
    if (rowIsSolidColor(j, raw)) jList[j] = FALSE;
    else break;
  }
  for (j = raw.height - 1; j >= 0; j--) {
    if (rowIsSolidColor(j, raw)) jList[j] = FALSE;
    else break;
  }
  
  int *iList; // 左端・右端から続いている単色の行をFALSEにする
  iList = (int*)malloc(sizeof(int)*raw.width);
  for (i = 0; i < raw.width; i++) iList[i] = TRUE;
  for (i = 0; i < raw.width; i++) {
    if (columnIsSolidColor(i, raw)) iList[i] = FALSE;
    else break;
  }
  for (i = raw.width - 1; i >= 0; i--) {
    if (columnIsSolidColor(i, raw)) iList[i] = FALSE;
    else break;
  }
  
  ...
  
}

単色の行・列を除いた画像を出力する

int deleteRowsColumns(int *jList, int *iList, RAWDATA_t *pRaw) {
  int i, j, c; // 元の画像の座標
  int ri, rj; // 新しい画像の座標
  
  // 新しい画像の各パラメータ
  unsigned char *data;
  unsigned int width;
  unsigned int height;
  unsigned int ch;
  
  height = 0;
  for (j = 0; j < pRaw->height; j++) if (jList[j]) height++;
  width = 0;
  for (i = 0; i < pRaw->width; i++) if (iList[i]) width++;
  ch = pRaw->ch;
  data = (unsigned char*)malloc(sizeof(unsigned char) * width * height * ch);
  
  rj = 0;  
  for (j = 0; j < pRaw->height; j++) {
    if (jList[j]) { // 単色が続いていた行をスキップ
      ri = 0;
      for (i = 0; i < pRaw->width; i++) {
        if (iList[i]) { // 単色が続いていた列をスキップ
          for (c = 0; c < pRaw->ch; c++) {
            data[ch * (ri + rj * width) + c] = pRaw->data[pRaw->ch * (i + j * pRaw->width) + c];
          }
          ri++;
        }
      }
      rj++;
    }
  }
  free(pRaw->data);
  
  // 新しい画像のパラメータに置き換える
  pRaw->data = data;
  pRaw->width = width;
  pRaw->height = height;
  return 0;
}