Cocoa 有没有最好的方法将NSImage的大小设置为最大文件大小?
以下是到目前为止我得到的信息:Cocoa 有没有最好的方法将NSImage的大小设置为最大文件大小?,cocoa,image-manipulation,nsimage,nsimagerep,Cocoa,Image Manipulation,Nsimage,Nsimagerep,以下是到目前为止我得到的信息: NSBitmapImageRep *imageRep = [NSBitmapImageRep imageRepWithData: [file.image TIFFRepresentation]]; // Resize image to 200x200 CGFloat maxSize = 200.0; NSSize imageSize = imageRep.size; if (imageSize.height>maxSize ||
NSBitmapImageRep *imageRep = [NSBitmapImageRep imageRepWithData:
[file.image TIFFRepresentation]];
// Resize image to 200x200
CGFloat maxSize = 200.0;
NSSize imageSize = imageRep.size;
if (imageSize.height>maxSize || imageSize.width>maxSize) {
// Find the aspect ratio
CGFloat aspectRatio = imageSize.height/imageSize.width;
CGSize newImageSize;
if (aspectRatio > 1.0) {
newImageSize = CGSizeMake(maxSize / aspectRatio, maxSize);
} else if (aspectRatio < 1.0) {
newImageSize = CGSizeMake(maxSize, maxSize * aspectRatio);
} else {
newImageSize = CGSizeMake(maxSize, maxSize);
}
[imageRep setSize:NSSizeFromCGSize(newImageSize)];
}
NSData *imageData = [imageRep representationUsingType:NSPNGFileType properties:nil];
NSString *outputFilePath = [@"~/Desktop/output.png" stringByExpandingTildeInPath];
[imageData writeToFile:outputFilePath atomically:NO];
[imageData length]
应该为您提供NSData内容的长度,我认为这是写入磁盘时的最终文件大小。这将使您有机会在实际编写文件之前最大化文件的大小
关于图像没有缩小或增大的原因,根据:
图像表示的大小与图像数据的物理尺寸相结合,决定了图像的分辨率
因此,通过设置大小而不改变分辨率,您可能没有修改任何像素,只是修改了像素的解释方式。
[imageData length]
应该为您提供NSData内容的长度,我认为这是写入磁盘时的最终文件大小。这将使您有机会在实际编写文件之前最大化文件的大小
关于图像没有缩小或增大的原因,根据:
图像表示的大小与图像数据的物理尺寸相结合,决定了图像的分辨率
因此,通过设置大小而不改变分辨率,您可能没有修改任何像素,只是修改了像素的解释方式。1
正如另一张海报所提到的,setSize只改变图像的显示大小,而不是底层图像文件的实际像素数据
要调整大小,您可能需要将源图像重新绘制到另一个NSImageRep上,然后将其写入文件
这篇博文包含一些关于如何以这种方式调整大小的示例代码
两个人
我不认为你至少可以在内存中创建对象并检查图像的长度。实际使用的字节将取决于图像类型。带有ARGB的位图很容易预测其大小,但PNG和JPEG则更难预测
正如另一张海报所提到的,setSize只改变图像的显示大小,而不是底层图像文件的实际像素数据
要调整大小,您可能需要将源图像重新绘制到另一个NSImageRep上,然后将其写入文件
这篇博文包含一些关于如何以这种方式调整大小的示例代码
两个人
我不认为你至少可以在内存中创建对象并检查图像的长度。实际使用的字节将取决于图像类型。带有ARGB的位图很容易预测其大小,但PNG和JPEG则要困难得多。我不做Cocoa开发,但如果你已经做了这么多,那么从有根据的猜测开始的二进制搜索应该会很快得到答案。我不做Cocoa开发,但如果你已经做了这么多,然后,从一个有根据的猜测开始的二进制搜索应该会很快得到答案。weblog.scifihifi.com似乎在下降weblog.scifihifi.com似乎在下降
- (NSData *)resizeImageWithBitSize:(NSInteger)size
andImageType:(NSBitmapImageFileType)fileType {
CGFloat maxSize = 500.0;
NSSize originalImageSize = self.size;
NSSize newImageSize;
NSData *returnImageData;
NSInteger imageIsTooBig = 1000;
while (imageIsTooBig > 0) {
if (originalImageSize.height>maxSize || originalImageSize.width>maxSize) {
// Find the aspect ratio
CGFloat aspectRatio = originalImageSize.height/originalImageSize.width;
if (aspectRatio > 1.0) {
newImageSize = NSMakeSize(maxSize / aspectRatio, maxSize);
} else if (aspectRatio < 1.0) {
newImageSize = NSMakeSize(maxSize, maxSize * aspectRatio);
} else {
newImageSize = NSMakeSize(maxSize, maxSize);
}
} else {
newImageSize = originalImageSize;
}
NSImage *resizedImage = [[NSImage alloc] initWithSize:newImageSize];
[resizedImage lockFocus];
[self drawInRect:NSMakeRect(0, 0, newImageSize.width, newImageSize.height)
fromRect: NSMakeRect(0, 0, originalImageSize.width, originalImageSize.height)
operation: NSCompositeSourceOver
fraction: 1.0];
[resizedImage unlockFocus];
NSData *tiffData = [resizedImage TIFFRepresentation];
[resizedImage release];
NSBitmapImageRep *imageRep = [[NSBitmapImageRep alloc] initWithData:tiffData];
NSDictionary *imagePropDict = [NSDictionary
dictionaryWithObject:[NSNumber numberWithFloat:0.85]
forKey:NSImageCompressionFactor];
returnImageData = [imageRep representationUsingType:fileType properties:imagePropDict];
[imageRep release];
if ([returnImageData length] > size) {
maxSize = maxSize * 0.99;
imageIsTooBig--;
} else {
imageIsTooBig = 0;
}
}
return returnImageData;
}