• 締切済み

libgd で左右反転コピーをするには?

perl だと copyFlipHorizontal を使って左右反転したイメージの描画ができるのですが、C で libgd を使って同じ事をするにはどうしたらいいのでしょうか?

みんなの回答

  • x415f484f
  • ベストアンサー率71% (57/80)
回答No.1

perl の GD モジュールのソースをダウンロードされて GD.xs をご覧になれば わかると思いますが copyFlipHorizontal 等は、ピクセル単位で反対方向 からコピーしているだけかと思われます。 GD-2.39.tar.gz http://search.cpan.org/CPAN/authors/id/L/LD/LDS/GD-2.39.tar.gz GD.xs を見て書き換えるとこんな感じです。 ※ 全角文字でインデントしてあります。 #include <stdio.h> #include <stdlib.h> #include <error.h> #include <gd.h> static gdImagePtr CopyFilp(gdImagePtr, int); /* for check */ int main(int argc, char *argv[]) {  int iVHflag = 0;  gdImagePtr src, dst;  FILE *in, *out;  if(argc < 3)  {   fprintf(stderr, "%s <src.png> <dst.png> [H:0|V:1]\n", argv[0]);   return -1;  }  if(argc > 3)  {   if(atoi(argv[3]))    iVHflag = 1;  }  in = fopen(argv[1], "rb");  if(!in){   perror(argv[1]);   return -1;  }  src = gdImageCreateFromPng(in);  fclose(in);  dst = CopyFilp(src, iVHflag);  out = fopen(argv[2], "wb");  if(!out){   perror(argv[2]);   return -1;  }  gdImagePng(dst, out);  fclose(out);  gdImageDestroy(src);  gdImageDestroy(dst);  return 0; } /* iHVflag: horizon == 0, vertical != 0 */ static gdImagePtr CopyFilp(gdImagePtr src, int iVHflag) {  int ix, iy, k;  gdImagePtr dst; /* clone image */  if (src->trueColor != 0) {   dst = gdImageCreateTrueColor(src->sx, src->sy);  } else {   dst = gdImageCreate(src->sx, src->sy);   for (k = 0; k < 256; k++) {    dst->red[k] = src->red[k];    dst->green[k] = src->green[k];    dst->blue[k] = src->blue[k];    dst->alpha[k] = src->alpha[k];    dst->open[k] = src->open[k];   }   dst->colorsTotal = src->colorsTotal;   dst->transparent = src->transparent;   dst->interlace = src->interlace;   dst->thick = src->thick;  } /* copy flip */  k = iVHflag ? (src->sy - 1) : (src->sx - 1);  for (iy = 0; iy < src->sy; iy++) {   for (ix = 0; ix < src->sx; ix++) {    if(src->trueColor)     iVHflag ? (dst->tpixels[k - iy][ix] = src->tpixels[iy][ix])      : (dst->tpixels[iy][k - ix] = src->tpixels[iy][ix]);    else     iVHflag ? (dst->pixels[k - iy][ix] = src->pixels[iy][ix])      : (dst->pixels[iy][k - ix] = src->pixels[iy][ix]);   }  }  return dst; }

moritan2
質問者

お礼

ご回答ありがとうございました。 じつは昨晩に質問して今日の夕方まで回答いただけなかったので作ってってしまいました。 void gdImageFlipHorizontal(gdImagePtr im) {  int x, y;  int w, h;  int * data;  w = gdImageSX(im);  h = gdImageSY(im);  data = alloca(w * sizeof(int));  for(y = 0; y < h; y++) {   for(x = 0; x < w; x++) {    data[x] = gdImageGetPixel(im, x, y);   }   for(x = 0; x < w; x++) {    gdImageSetPixel(im, w - 1 - x, y, data[x]);   }  } }

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 左右反転

    My image garden での画像の左右反転の方法を教えてください。 ※OKWaveより補足:「キヤノン製品」についての質問です。

  • パラパラの左右反転について

    先日、DVDのパラパラミレニアム・スタジアムという avexから出てるものを買いました。 しかし、メニュー画面を探しても どうやっても、左右反転モードが見つからないのです。 DVDでは左右反転モードがついていると聞いていたのに メニュー画面では曲選びしか出来ませんでした。 どなたか、お分かりの方、どうぞ教えてください。 そもそも、左右反転モードはこのDVDには無いのか、とも気になります。

  • ワードアートで図形描画を左右反転印刷するには?

    Tシャツ転写紙に左右反転印刷しようとしています。 ワードアートで図形描画を左右反転させて印刷プレビューで確認して印刷したのですが左右反転が反映されず通常の向きになってしまいます。 ワード2002、プリンターはキャノンBJS500です。

  • 左右反転

    アイロンプリントペーパーで写真を印刷したいのですが、印刷時に「左右反転」すると指示がありましたが、反転のやり方が分かりません。初心者なもので・・・・ ご指導願います。

  • 画像を左右反転できない.

    画像を左右反転できない. Photo Boothを使って撮影した画像は左右が反転しています。そこで、プレビューを用いて左右を反転するのですが、教えてgooや「はてな」などのサイトに画像添付した段階で、左右逆の元の状態になって画像添付がされてしまいます。 プレビューで見る限りでは、左右反転されてますが、サイトに載せた段階でもとの左右が逆となる状態は、何が問題でどうすれば回避できるのでしょうか? よろしくお願いいたします。

    • ベストアンサー
    • Mac
  • 写真の左右反転て出来ますか?

    これからマックを買おうかと考えているのですが、仕事で写真を左右反転して使わなければいけません。 トリミングや傾き補正はiphotoでできるかと思いますが、左右反転するには、どういうソフトを買えばいいですか?

    • ベストアンサー
    • Mac
  • 動画の左右反転について。

    同じような質問で反転のサイトがいくつかあったのですが 操作の仕方やら全て英語でやり方も全く分からなく 動画を左右反転ができませんでした・・・。   http://www.nicovideo.jp/watch/sm4860093 因みに上記のニコ動の画像を反転しようと 試行錯誤している最中です(´;ω;`)   日本語で、ちゃんと左右反転できる サイトはありますでしょうか?   よろしくお願いします・・・。

  • 角度を左右・上下反転させる

    趣味でゲームを制作している者です。 ゲームの要素として「角度」を左右・もしくは上下に反転させる処理が必要になりました。 以下、すべて度数法で角度を表現し、上方向を「0度」と定義します。 90度回転しているときに左右反転すると270度になり、上下反転しても90度のままです。 180度回転しているときに左右反転しても180度のまま、上下反転すると0度になります。 45度回転しているときに左右反転すると315度になり、上下反転すると135度になります。 60度回転しているときに左右反転すると300度になり、上下反転すると120度になります。 これをすべての角度で左右・上下に反転させたいのですが、法則を見出すことができません。 「角度」の「左右反転」と「上下反転」はどのような計算式になるでしょうか。 なお、弧度法も理解しておりますので、計算に弧度法を使っても問題ありません。

  • 左右反転

    EB-436WTには左右反転機能はありますか?半透明スクリーンに裏から投影したいのです。 ※OKWAVEより補足:「EPSON社製品」についての質問です。

  • 左右反転した「AMBULANCIA」

    テレビを見ていると、外国の救急車の前面に、左右反転した文字で「AMBULANCIA」と書かれていました。 試しにGoogleで「AMBULANCIA」を画像検索すると、「AMBULANCIA」の表記が反転した救急車と反転していない救急車が出てきます。また、一台の救急車の前面に、反転した「AMBULANCIA」と反転していない「AMBULANCIA」が併記されたものまであります。 反転している意味は何なのか、教えてください。よろしくお願いします。

このQ&Aのポイント
  • 止めネジのとがり先とくぼみ先の使い分けについて教えてください。
  • 止めネジの使い分けにはどのような基準があるのでしょうか?
  • 止めネジのとがり先とくぼみ先の違いとそれぞれの使用方法について詳しく教えてください。
回答を見る