objective-c – NSImage无法扩展

objective-c – NSImage无法扩展,第1张

概述我正在开发一个快速应用程序,其中我有一个方法应该将@ 2x图像重新缩放为常规图像.问题是它没有:( 为什么? -(BOOL)createNormalImage:(NSString*)inputRetinaImagePath { NSImage *inputRetinaImage = [[NSImage alloc] initWithContentsOfFile:inputRetinaIm 我正在开发一个快速应用程序,其中我有一个方法应该将@ 2x图像重新缩放为常规图像.问题是它没有:(

为什么?

-(BOol)createnormalimage:(Nsstring*)inputRetinaimagePath {    NSImage *inputRetinaimage = [[NSImage alloc] initWithContentsOffile:inputRetinaimagePath];    NSSize size = NSZeroSize;    size.wIDth = inputRetinaimage.size.wIDth*0.5;    size.height = inputRetinaimage.size.height*0.5;    [inputRetinaimage setSize:size];    NSLog(@"%f",inputRetinaimage.size.height);    NSBitmAPImageRep *imgRep = [[inputRetinaimage representations] objectAtIndex: 0];    NSData *data = [imgRep representationUsingType: NSPNGfileType propertIEs: nil];    Nsstring *outputfilePath = [[inputRetinaimagePath substringToIndex:inputRetinaimagePath.length - 7] stringByAppendingString:@".png"];    NSLog([@"normal version file path: " stringByAppendingString:outputfilePath]);    [data writetofile:outputfilePath atomically: NO];    return true;}
解决方法 你必须非常警惕NSImage的size属性.它不一定是指bitmapRepresentation的像素尺寸,它可以参考显示的尺寸. NSImage可以具有多个位图表示,以用于不同的输出大小.

同样,更改NSImage的size属性不会改变bitmapRepresentations

因此,您需要做的是计算出您想要输出图像的大小,然后使用源NSImage中的bitmapRepresentation以该大小绘制新图像.

获得该大小取决于您获得输入图像的方式以及您对其的了解.例如,如果您确信输入图像只有一个bitmAPImageRep,则可以使用此类事物(作为NSImage上的类别)

- (NSSize) pixelSize{    NSBitmAPImageReP* bitmap = [[self representations] objectAtIndex:0];    return NSMakeSize(bitmap.pixelsWIDe,bitmap.pixelsHigh);}

即使你有一些bitmAPImageReps,第一个应该是最大的一个,如果这是你的Retina图像创建的大小,它应该是你所追求的Retina大小.

当您计算出最终尺寸后,您可以制作图像:

- (NSImage*) resizeImage:(NSImage*)sourceImage size:(NSSize)size{    NSRect targetFrame = NSMakeRect(0,size.wIDth,size.height);         NSImage* targetimage = nil;    NSImageRep *sourceImageRep =    [sourceImage bestRepresentationForRect:targetFrame                                   context:nil                                     hints:nil];    targetimage = [[NSImage alloc] initWithSize:size];    [targetimage lockFocus];    [sourceImageRep drawInRect: targetFrame];    [targetimage unlockFocus];return targetimage;

}

更新

这是NSImage上像素大小获取类别的更精细版本…让我们假设图像,它有多少imageReps,是否有任何bitmAPImageReps …这将返回它可以找到的最大像素尺寸.如果它找不到bitMAPImageRep像素尺寸,它将使用它可以获得的任何其他东西,这很可能是边界框尺寸(由eps和pdfs使用).

NSImage PixelSize.h

#import <Cocoa/Cocoa.h>#import <QuartzCore/QuartzCore.h>@interface NSImage (PixelSize)- (NSInteger) pixelsWIDe;- (NSInteger) pixelsHigh;- (NSSize) pixelSize;@end

NSImage PixelSize.m

#import "NSImage+PixelSize.h"@implementation NSImage (Extensions)- (NSInteger) pixelsWIDe{    /*     returns the pixel wIDth of NSImage.     Selects the largest bitmapRep by preference     If there is no bitmapRep returns largest size reported by any imageRep.     */    NSInteger result = 0;    NSInteger bitmapResult = 0;    for (NSImageReP* imageRep in [self representations]) {        if ([imageRep isKindOfClass:[NSBitmAPImageRep class]]) {            if (imageRep.pixelsWIDe > bitmapResult)                bitmapResult = imageRep.pixelsWIDe;        } else {            if (imageRep.pixelsWIDe > result)                result = imageRep.pixelsWIDe;        }    }    if (bitmapResult) result = bitmapResult;    return result;}- (NSInteger) pixelsHigh{    /*     returns the pixel height of NSImage.     Selects the largest bitmapRep by preference     If there is no bitmapRep returns largest size reported by any imageRep.     */    NSInteger result = 0;    NSInteger bitmapResult = 0;    for (NSImageReP* imageRep in [self representations]) {        if ([imageRep isKindOfClass:[NSBitmAPImageRep class]]) {            if (imageRep.pixelsHigh > bitmapResult)                bitmapResult = imageRep.pixelsHigh;        } else {            if (imageRep.pixelsHigh > result)                result = imageRep.pixelsHigh;        }    }    if (bitmapResult) result = bitmapResult;    return result;}- (NSSize) pixelSize{    return NSMakeSize(self.pixelsWIDe,self.pixelsHigh);}@end

您可以在当前文件中#import“NSImage PixelSize.h”以使其可访问.

使用此图像类别和resize:方法,您可以修改您的方法:

//size.wIDth = inputRetinaimage.size.wIDth*0.5;//size.height = inputRetinaimage.size.height*0.5;size.wIDth  = inputRetinaimage.pixelsWIDe*0.5;size.height = inputRetinaimage.pixelsHigh*0.5;//[inputRetinaimage setSize:size];NSImage* outputimage = [self resizeImage:inputRetinaimage size:size];//NSBitmAPImageRep *imgRep = [[inputRetinaimage representations] objectAtIndex: 0];NSBitmAPImageRep *imgRep = [[outputimage representations] objectAtIndex: 0];

这应该为你解决问题(附带条件:我没有在你的代码上测试它)

总结

以上是内存溢出为你收集整理的objective-c – NSImage无法扩展全部内容,希望文章能够帮你解决objective-c – NSImage无法扩展所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1024360.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-23
下一篇 2022-05-23

发表评论

登录后才能评论

评论列表(0条)

保存