2013-07-19 20 views
1

儘管我想將一些圖像和白色畫布與GD混合,但下面的程序會使混合的圖像灰度。gdImageCopy的圖像是灰度的

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <gd.h> 

int main(int argc, char *argv[]) 
{ 
    gdImagePtr src, dst, canvas; 
    FILE *fp, *out; 

    fp = fopen("./image.jpg", "r"); 
    out = fopen("./image_.jpg", "w"); 

    src = gdImageCreateFromJpeg(fp); 

    dst = gdImageCreate(150, 94); 

    gdImageCopyResampled(dst, src, 0, 0, 0, 0, 150, 94, 150, 94); 

    canvas = gdImageCreate(150, 94); 
    int ccolor = gdImageColorAllocateAlpha(canvas, 255, 255, 255, 255); 
    gdImageFilledRectangle(canvas, 0, 0, 150, 94, ccolor); 
    gdImageCopy(canvas, dst, 0, 0, 0, 0, 150, 94); 
    dst = canvas; 
    gdImageJpeg(dst, out, 95); 

    return 0; 
} 

image.jpg的

enter image description here

image_.jpg

enter image description here

與此相對,ImageMagick的以下程序使非灰度圖像。

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <wand/MagickWand.h> 

int main(int argc, char *argv[]) 
{ 
    MagickWand *wand; 
    MagickWand *canvas_wand; 
    PixelWand *canvas_color; 

    MagickWandGenesis(); 

    wand   = NewMagickWand(); 
    canvas_wand = NewMagickWand(); 
    canvas_color = NewPixelWand(); 

    MagickReadImage(wand, "./image.jpg"); 

    PixelSetRed(canvas_color, 255); 
    PixelSetGreen(canvas_color, 255); 
    PixelSetBlue(canvas_color, 255); 
    PixelSetAlpha(canvas_color, 255); 
    MagickNewImage(canvas_wand, 150, 94, canvas_color); 
    MagickCompositeImage(canvas_wand, wand, AtopCompositeOp, 0, 0); 
    DestroyMagickWand(wand); 
    wand = canvas_wand; 

    MagickWriteImage(wand, "./image_.jpg"); 

    DestroyPixelWand(canvas_color); 
    DestroyMagickWand(wand); 
    MagickWandTerminus(); 

    return 0; 
} 

有沒有一種很好的方法使非灰度圖像與GD混淆?

FYI

$ gdlib-config --version 
2.0.36 
$ 

回答

1

你需要初始化/調用gdImageCreateTrueColor方法分配「非灰度」的形象。 gdImageCreate根本不足以滿足您的需求。

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <gd.h> 

int main(int argc, char *argv[]) 
{ 
    gdImagePtr src, dst, canvas; 
    FILE *fp, *out; 

    fp = fopen("./image.jpg", "r"); 
    out = fopen("./image_.jpg", "w"); 

    src = gdImageCreateFromJpeg(fp); 

    // dst = gdImageCreate(150, 94); 
    dst = gdImageCreateTrueColor(150, 94); 

    gdImageCopyResampled(dst, src, 0, 0, 0, 0, 150, 94, 150, 94); 

    // canvas = gdImageCreate(150, 94); 
    canvas = gdImageCreateTrueColor(150, 94); 
    int ccolor = gdImageColorAllocateAlpha(canvas, 255, 255, 255, 255); 
    gdImageFilledRectangle(canvas, 0, 0, 150, 94, ccolor); 
    gdImageCopy(canvas, dst, 0, 0, 0, 0, 150, 94); 
    dst = canvas; 
    gdImageJpeg(dst, out, 95); 

    return 0; 
}