アプリ版:「スタンプのみでお礼する」機能のリリースについて

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

A 回答 (1件)

perl の GD モジュールのソースをダウンロードされて GD.xs をご覧になれば


わかると思いますが copyFlipHorizontal 等は、ピクセル単位で反対方向
からコピーしているだけかと思われます。

GD-2.39.tar.gz
http://search.cpan.org/CPAN/authors/id/L/LD/LDS/ …

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;
}
    • good
    • 0
この回答へのお礼

ご回答ありがとうございました。
じつは昨晩に質問して今日の夕方まで回答いただけなかったので作ってってしまいました。

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]);
  }
 }
}

お礼日時:2008/04/26 23:39

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!