为什么?
-(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无法扩展所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)