No.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;
}
ご回答ありがとうございました。
じつは昨晩に質問して今日の夕方まで回答いただけなかったので作ってってしまいました。
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が見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 写真・ビデオ LINEの動画送信でインカメラの場合、左右逆転になるのは避けられないですか? 1 2022/08/29 12:58
- デスクトップパソコン デスクトップPCでゲーム中、スピーカーだけ音が左右反転します 3 2023/02/24 15:44
- YouTube 最近、左利きのYouTuberが多いなと思っていたら「反転しているだけで本当は右利き」って言う事を知 3 2023/01/04 21:41
- YouTube 最近、左利きYouTuber多いなぁと思っていたら反転しているだけで本当は右利きと言う事を知りました 1 2023/01/07 13:42
- Illustrator(イラストレーター) ワード。グラデーションがうまく行かない。 2 2022/09/28 19:56
- デザイン 普段右利きで絵を描くのは左の方が上手です。 ずっと右利きで物事をしていたのですが、右手を怪我して左で 1 2023/03/08 20:37
- 音楽・動画 TikTok の動画が左右反対で見にくい。 反転して見る方法を教えてください。 3 2022/03/24 20:30
- 美術・アート 左右対称定規で描いたイラストが左右非対称に見える 4 2022/05/23 22:07
- 仕事術・業務効率化 職場での質問です。 会社でデュアルディスプレイなのですが左右にベテランの方に囲まれており、仕事をして 4 2023/05/12 18:55
- YouTube 最近、左利きYouTuberさん多いなぁと思っていたら「それは反転していて実際は右利きだよ」って言わ 1 2023/01/02 17:22
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
教えて下さい。ランダムにバナ...
-
【初心者】UWSCでjavascriptで...
-
画像をクリックすると音が鳴り...
-
JSPでの画像ファイル表示
-
クリックした自身の画像を別画...
-
ランダム表示の画像位置
-
MAX関数を使ってからLEFT JOIN...
-
MFCで画像を表示させているので...
-
JavaScriptで変更した属性の元...
-
Gifアニメ、最後のコマに行った...
-
クリックで色変更後に既に変更...
-
createElementが一瞬で消えてし...
-
複数のバナーをリロードする度...
-
デフォルト非表示にしたい。【t...
-
javascriptテキストBOX色を元に...
-
iframe内のリンクが飛ばないの...
-
Slick.jsのオプションrtlについて
-
onmouseoverの表示切り替えが上...
-
window.openで値の渡し方を教え...
-
html スクロール要素を下から表...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
c++std::string型をTCHARに変換...
-
画面が真っ白になるのはどうして?
-
JSPでの画像ファイル表示
-
C言語のポインタ表現
-
javascriptの sx, sy, sw, sh, ...
-
VBScriptで画像を切り替え。
-
画像をクリックすると音が鳴り...
-
フォームに入力された値により...
-
OpenCVを用いたヒストグラムの...
-
クリックした自身の画像を別画...
-
日替わりで画像を変更したい
-
時間で背景の画像を変更したい...
-
javascriptで複数の画像をラン...
-
2箇所の画像をランダムに複数表示
-
ロールオーバー効果にならない。
-
eclipse+Tomcatでのファイルパ...
-
Excel VBA マクロ 画像(...
-
サムネイルをクリックして背景...
-
ランダム表示の画像位置
-
JavaScriptのhistory.back(戻...
おすすめ情報