如何保存 IKImageView 中的图像?

发布于 2025-01-05 19:19:13 字数 3978 浏览 0 评论 0原文

好吧...我只想保存 IKImageView 图像的可见矩形。 我的问题是,不知何故,如果我有纵向模式的图像,它将不会以正确的方向保存。我用此代码绘制图像:

[sourceImg drawInRect:targetRect fromRect:sourceRect operation:NSCompositeSourceOver fraction:1.0f];

另一方面,如果我用此代码绘制图像:

[sourceImg drawAtPoint:NSZeroPoint fromRect:sourceRect operation:NSCompositeSourceOver fraction:1.0f];

它将处于正确的方向,但缩放等编辑会丢失。我的意思是它会保存正确的剪裁,但不幸的是尺寸不正确。

这是我如何加载图像的代码:

    - (IBAction)imageSelectionButtonAction:(id)sender {
    NSLog(@"%s", __FUNCTION__);
    NSOpenPanel *panel = [NSOpenPanel openPanel];
    id model = [self getModel];

    if (imageView) {
        [panel setAllowedFileTypes:[NSImage imageFileTypes]];
        [panel beginSheetModalForWindow:[[NSApplication sharedApplication] mainWindow] completionHandler:^(NSInteger returnCode) {
            if (returnCode == 1) {
                NSURL *imageUrl = [panel URL];
                CGImageRef          image = NULL;
                CGImageSourceRef    isr = CGImageSourceCreateWithURL( (__bridge CFURLRef)imageUrl, NULL);

                if (isr) {
                    NSDictionary *options = [NSDictionary dictionaryWithObject: (id)kCFBooleanTrue  forKey: (id) kCGImageSourceShouldCache];
                    image = CGImageSourceCreateImageAtIndex(isr, 0, (__bridge CFDictionaryRef)options);

                    if (image) {
                        _imageProperties = (__bridge_transfer NSDictionary*)CGImageSourceCopyPropertiesAtIndex(isr, 0, (__bridge CFDictionaryRef)_imageProperties);
                        _imageUTType = (__bridge NSString*)CGImageSourceGetType(isr);
                    }
                    CFRelease(isr);
                }

                if (image) {
                    [imageView setImage:image imageProperties:_imageProperties];
                    CGImageRelease(image);
                }
                [[model saveTempMutabDict] setValue:[imageUrl absoluteString] forKey:@"tempImage"];
            }   
        }];
        return;
    }
}

这是我如何保存图像的代码:

    - (void)saveImage:(NSString *)path  {
    // get the current image from the image view

    CGImageRef sourceImgRef = [imageView image];
    NSRect targetRect = [imageView visibleRect];
    NSImage *sourceImg = [[NSImage alloc] initWithCGImage:sourceImgRef size:NSZeroSize];

    NSMutableDictionary *thisTiffDict = [_imageProperties valueForKey:@"{TIFF}"];
    NSInteger theOrientation = [[thisTiffDict valueForKey:@"Orientation"] integerValue];
    NSImage *targetImg = nil;
    if (theOrientation == 6) {
        targetImg = [[NSImage alloc] initWithSize:NSMakeSize([imageView frame].size.height, [imageView frame].size.width)];
    } else {
        targetImg = [[NSImage alloc] initWithSize:NSMakeSize([imageView frame].size.width, [imageView frame].size.height)];
    }

    NSRect sourceRect = [imageView convertViewRectToImageRect:targetRect];

    [targetImg lockFocus];
    [[NSGraphicsContext currentContext] setImageInterpolation:NSImageInterpolationHigh];
    [sourceImg drawAtPoint:NSZeroPoint fromRect:sourceRect operation:NSCompositeSourceOver fraction:1.0f];
    [targetImg unlockFocus];

    _saveOptions = [[IKSaveOptions alloc] initWithImageProperties:_imageProperties imageUTType: _imageUTType];
    NSString * newUTType = [_saveOptions imageUTType];

    CGImageRef targetImgRef = [targetImg CGImageForProposedRect:NULL context:[NSGraphicsContext currentContext] hints:nil];

    if (targetImgRef) {
        NSURL *url = [NSURL fileURLWithPath: path];
        CGImageDestinationRef dest = CGImageDestinationCreateWithURL((__bridge CFURLRef)url, (__bridge CFStringRef)newUTType, 1, NULL);

        if (dest) {
            CGImageDestinationAddImage(dest, targetImgRef, (__bridge CFDictionaryRef)[_saveOptions imageProperties]);
            CGImageDestinationFinalize(dest);
            CFRelease(dest);
        }
    }
}

我不知道我做错了什么?

谢谢 延斯

Okay... I want to save the visible rectangle of the IKImageView image only.
My problem is that, somehow, if I had an image in portrait mode it will be not saved in the right orientation. I drawing the image with this code:

[sourceImg drawInRect:targetRect fromRect:sourceRect operation:NSCompositeSourceOver fraction:1.0f];

On the other side if I draw the image with this code:

[sourceImg drawAtPoint:NSZeroPoint fromRect:sourceRect operation:NSCompositeSourceOver fraction:1.0f];

It will be in the right orientation, but edits like zooming are lost. I mean it will save the right cut out, but unfortunately not in the right size.

Here is the code how I load the image:

    - (IBAction)imageSelectionButtonAction:(id)sender {
    NSLog(@"%s", __FUNCTION__);
    NSOpenPanel *panel = [NSOpenPanel openPanel];
    id model = [self getModel];

    if (imageView) {
        [panel setAllowedFileTypes:[NSImage imageFileTypes]];
        [panel beginSheetModalForWindow:[[NSApplication sharedApplication] mainWindow] completionHandler:^(NSInteger returnCode) {
            if (returnCode == 1) {
                NSURL *imageUrl = [panel URL];
                CGImageRef          image = NULL;
                CGImageSourceRef    isr = CGImageSourceCreateWithURL( (__bridge CFURLRef)imageUrl, NULL);

                if (isr) {
                    NSDictionary *options = [NSDictionary dictionaryWithObject: (id)kCFBooleanTrue  forKey: (id) kCGImageSourceShouldCache];
                    image = CGImageSourceCreateImageAtIndex(isr, 0, (__bridge CFDictionaryRef)options);

                    if (image) {
                        _imageProperties = (__bridge_transfer NSDictionary*)CGImageSourceCopyPropertiesAtIndex(isr, 0, (__bridge CFDictionaryRef)_imageProperties);
                        _imageUTType = (__bridge NSString*)CGImageSourceGetType(isr);
                    }
                    CFRelease(isr);
                }

                if (image) {
                    [imageView setImage:image imageProperties:_imageProperties];
                    CGImageRelease(image);
                }
                [[model saveTempMutabDict] setValue:[imageUrl absoluteString] forKey:@"tempImage"];
            }   
        }];
        return;
    }
}

And here is the code how I save it:

    - (void)saveImage:(NSString *)path  {
    // get the current image from the image view

    CGImageRef sourceImgRef = [imageView image];
    NSRect targetRect = [imageView visibleRect];
    NSImage *sourceImg = [[NSImage alloc] initWithCGImage:sourceImgRef size:NSZeroSize];

    NSMutableDictionary *thisTiffDict = [_imageProperties valueForKey:@"{TIFF}"];
    NSInteger theOrientation = [[thisTiffDict valueForKey:@"Orientation"] integerValue];
    NSImage *targetImg = nil;
    if (theOrientation == 6) {
        targetImg = [[NSImage alloc] initWithSize:NSMakeSize([imageView frame].size.height, [imageView frame].size.width)];
    } else {
        targetImg = [[NSImage alloc] initWithSize:NSMakeSize([imageView frame].size.width, [imageView frame].size.height)];
    }

    NSRect sourceRect = [imageView convertViewRectToImageRect:targetRect];

    [targetImg lockFocus];
    [[NSGraphicsContext currentContext] setImageInterpolation:NSImageInterpolationHigh];
    [sourceImg drawAtPoint:NSZeroPoint fromRect:sourceRect operation:NSCompositeSourceOver fraction:1.0f];
    [targetImg unlockFocus];

    _saveOptions = [[IKSaveOptions alloc] initWithImageProperties:_imageProperties imageUTType: _imageUTType];
    NSString * newUTType = [_saveOptions imageUTType];

    CGImageRef targetImgRef = [targetImg CGImageForProposedRect:NULL context:[NSGraphicsContext currentContext] hints:nil];

    if (targetImgRef) {
        NSURL *url = [NSURL fileURLWithPath: path];
        CGImageDestinationRef dest = CGImageDestinationCreateWithURL((__bridge CFURLRef)url, (__bridge CFStringRef)newUTType, 1, NULL);

        if (dest) {
            CGImageDestinationAddImage(dest, targetImgRef, (__bridge CFDictionaryRef)[_saveOptions imageProperties]);
            CGImageDestinationFinalize(dest);
            CFRelease(dest);
        }
    }
}

I have no idea what I'm doing wrong?

Thank you
Jens

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文