Negative Multiply with imagemagick?

633 views Asked by At

Does anyone know if it's possible to do the Photoshop layer composite mode "negative multiply"?

Multiply is possible, but i need the negative way.

MagickBooleanType aStat = MagickCompositeImage(magick_wand_local, magick_wand_local_comp, MultiplyCompositeOp, 0, 0);   

Thanks

1

There are 1 answers

3
Jonas Schnelli On BEST ANSWER

Okay. Found it myself.

It's called: ScreenCompositeOp

Some sample code (not cleaned!):

    CGImageRef standardized = srcCGImage; //createStandardImage(srcCGImage);

    // could use the image directly if it has 8/16 bits per component,
    // otherwise the image must be converted into something more common (such as images with 5-bits per component)
    // here we’ll be simple and always convert
    const char *map = "ARGB"; // hard coded
    const StorageType inputStorage = CharPixel;

    NSData *srcData = (NSData *) CGDataProviderCopyData(CGImageGetDataProvider(standardized));

    const void *bytes = [srcData bytes];
    MagickWandGenesis();
    MagickWand * magick_wand_local= NewMagickWand();
    MagickBooleanType status = MagickConstituteImage(magick_wand_local, width, width, map, inputStorage, bytes);
    if (status == MagickFalse) {
        ThrowWandException(magick_wand_local);
    }    
    /*
     status = MagickOrderedPosterizeImage(magick_wand_local, "h8x8o");
     if (status == MagickFalse) {
     ThrowWandException(magick_wand_local);
     }
     */

    //status = MagickThresholdImage(magick_wand_local, 100.0);

    MagickWand * magick_wand_local_comp = NewMagickWand();
    NSString *file = @"winter_over.jpg";
    if(export == YES) {
        file = @"winter_over_large.jpg";
    }

    if(MagickReadImage(magick_wand_local_comp,[[[NSBundle mainBundle] pathForResource:file ofType:@""] UTF8String]) == MagickFalse) {
        ExceptionType severity;
        char *err = MagickGetException(magick_wand_local_comp, &severity);
        printf("%s\n",err);
        NSLog(@"error");
    }

    MagickBooleanType aStat = MagickCompositeImage(magick_wand_local, magick_wand_local_comp, ScreenCompositeOp, 0, 0);    
    if(aStat == MagickFalse) {
        NSLog(@"error");
    }

    status = MagickModulateImage(magick_wand_local, 100, 29, 100);



    if (status == MagickFalse) {
        ThrowWandException(magick_wand_local);
    }

    const int bitmapBytesPerRow = (width * strlen(map));
    const int bitmapByteCount = (bitmapBytesPerRow * height);
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    char *trgt_image = malloc(bitmapByteCount);
    status = MagickExportImagePixels(magick_wand_local, 0, 0, width, height, map, CharPixel, trgt_image);
    if (status == MagickFalse) {
        ThrowWandException(magick_wand_local);
    }
    magick_wand_local = DestroyMagickWand(magick_wand_local);
    magick_wand_local_comp = DestroyMagickWand(magick_wand_local_comp);
    MagickWandTerminus();
    CGContextRef context = CGBitmapContextCreate (trgt_image,
                                                  width,
                                                  height,
                                                  8, // bits per component
                                                  bitmapBytesPerRow,
                                                  colorSpace,
                                                  kCGImageAlphaPremultipliedFirst);
    CGColorSpaceRelease(colorSpace);