はじめに
libpngについて参考にしたもの
スクショを編集する用途で作りましたが、上手にスクショすればいいだけだと気づいたので多分使いません。スクショをあとから切り取るのに使えるときがあるかも?
ソースコードおよび実行ファイル
処理の流れ
- 行・列を両端から調べていき、単色であるものをチェックする
- 単色の行・列を除いた画像を出力する
行・列を両端から調べていき、単色であるものをチェックする
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; }