2014年2月17日月曜日

Jmagick アニメーションGIF サイズ変更

Jmagick に coalesceImages と deconstructImages のメソッドを追加する。

  • magick_MagickImage.c
/*
 * Class:     magick_MagickImage
 * Method:    coalesceImages
 * Signature: ()Lmagick/MagickImage;
 */
JNIEXPORT jobjectArray JNICALL Java_magick_MagickImage_coalesceImages
    (JNIEnv *env, jobject self)
{
    int i, imageLength;
    jclass magickImageClass = 0;
    Image *image = NULL, *coalesceImages = NULL;
    jobject newObj;
    jobjectArray newObjArray;
    ExceptionInfo exception;
    image = (Image*) getHandle(env, self, "magickImageHandle", NULL);
    if (image == NULL) {
        throwMagickException(env, "Cannot retrieve image handle");
        return NULL;
    }
    GetExceptionInfo(&exception);
    coalesceImages = CoalesceImages(image, &exception);
    if (coalesceImages == NULL) {
        throwMagickApiException(env, "Cannot coalesce image", &exception);
        DestroyExceptionInfo(&exception);
        return NULL;
    }
    DestroyExceptionInfo(&exception);
    imageLength = GetImageListLength(coalesceImages);
    magickImageClass = (*env)->FindClass(env, "magick/MagickImage");
    if (magickImageClass == 0) {
        return NULL;
    }
    newObjArray = (*env)->NewObjectArray(env, imageLength, magickImageClass, NULL);
    if (newObjArray == NULL) {
        throwMagickException(env, "Unable to construct newObjArray[]");
        return NULL;
    }
    for (i = 0; i < imageLength; i++){
        newObj = newImageObject(env, GetImageFromList(coalesceImages, i));
        if (newObj == NULL) {
            DestroyImageList(coalesceImages);
            throwMagickException(env, "Unable to create coalesce image");
            return NULL;
        }
        (*env)->SetObjectArrayElement(env, newObjArray, i, newObj);
    }
    return newObjArray;
}
/*
 * Class:     magick_MagickImage
 * Method:    deconstructImages
 * Signature: ()Lmagick/MagickImage;
 */
JNIEXPORT jobject JNICALL Java_magick_MagickImage_deconstructImages
    (JNIEnv *env, jobject self)
{
    Image *image = NULL, *deconstructImage = NULL;
    jobject newObj;
    ExceptionInfo exception;
    image = (Image*) getHandle(env, self, "magickImageHandle", NULL);
    if (image == NULL) {
        throwMagickException(env, "Cannot retrieve image handle");
        return NULL;
    }
    GetExceptionInfo(&exception);
    deconstructImage = DeconstructImages(image, &exception);
    if (deconstructImage == NULL) {
        throwMagickApiException(env, "Cannot deconstruct image", &exception);
        DestroyExceptionInfo(&exception);
        return NULL;
    }
    DestroyExceptionInfo(&exception);
    newObj = newImageObject(env, deconstructImage);
    if (newObj == NULL) {
        DestroyImageList(deconstructImage);
        throwMagickException(env, "Unable to create deconstruct image");
        return NULL;
    }
    return newObj;
}
  • MagickImage.java
/**
 * Merge a sequence of images.
 * @exception MagickException on error
 */
public native MagickImage[] coalesceImages()
  throws MagickException;
/**
 * Break down an image sequence into constituent parts.
 * @exception MagickException on error
 */
public native MagickImage deconstructImages()
  throws MagickException;
修正後、コマンドプロンプト(管理者)で Make を実行
cd "\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin\x86_amd64"
vcvarsx86_amd64.bat
cd \pleiades\workspace\6.6.9\src
nmake -f Makefile.all

サンプルコード実行 
try{
    MagickImage mi = new MagickImage(new ImageInfo("c:\\Temp\\in.gif"));
    MagickImage[] moArray = mi.coalesceImages();
    for (int i = 0; i < moArray.length; i++) {
        moArray[i] = moArray[i].resizeImage(200, 200, 1);
    }
    MagickImage mo = new MagickImage(moArray).deconstructImages();
    mo.setFileName("c:\\Temp\\out.gif");
    mo.writeImage(new ImageInfo());
} catch (Exception ex) {
    ex.printStackTrace();
}


人気ブログランキングへ