gpt4 book ai didi

cocoa - 有没有最好的方法将 NSImage 调整为最大文件大小?

转载 作者:行者123 更新时间:2023-12-03 16:48:32 24 4
gpt4 key购买 nike

这是我到目前为止所得到的:

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];

代码假设 200x200 PNG 将小于 128K,这是我的大小限制。 200x200 已经足够大了,但如果可能的话,我希望将尺寸最大化。

这是我的两个问题:

  1. 该代码不起作用。我检查了导出文件的大小,它与原始文件的大小相同。
  2. 有没有办法在导出之前预测输出文件的大小,以便我可以最大化尺寸但仍然获得小于 128K 的图像?
<小时/>

这是工作代码。它相当草率,可能需要一些优化,但此时它运行得足够快,我不在乎。对于大多数图片来说,它会迭代超过 100 倍,并且在几毫秒内结束。此外,此方法是在 NSImage 的类别中声明的。

- (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;
}

最佳答案

对于 1。

正如另一位发帖者提到的,setSize 仅更改图像的显示大小,而不更改底层图像文件的实际像素数据。

要调整大小,您可能需要将源图像重新绘制到另一个 NSImageRep 上,然后将其写入文件。

这篇博文包含一些有关如何以这种方式调整大小的示例代码。

How to Resize an NSImage

2 个。

我认为你至少不需要在内存中创建对象并检查图像的长度就可以。实际使用的字节取决于图像类型。使用 ARGB 的位图很容易预测其大小,但 PNG 和 JPEG 会困难得多。

关于cocoa - 有没有最好的方法将 NSImage 调整为最大文件大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1563381/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com