Отрицательный Умножить с imagemagick? - PullRequest
0 голосов
/ 12 октября 2011

Кто-нибудь знает, возможно ли сделать составной режим слоя Photoshop «отрицательным умножением»?

Умножение возможно, но мне нужен отрицательный путь.*

1 Ответ

1 голос
/ 12 октября 2011

Хорошо.Сам нашел.

Называется: ScreenCompositeOp

Пример кода (не очищен!):

    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);
...