代码之家  ›  专栏  ›  技术社区  ›  kubi

有没有最好的方法将NSImage的大小设置为最大文件大小?

  •  2
  • kubi  · 技术社区  · 15 年前

    以下是到目前为止我得到的信息:

    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的图像?

    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;
    }
    
    2 回复  |  直到 15 年前
        1
  •  0
  •   Brandon Bodnar    15 年前

    1。

    正如另一张海报所提到的,setSize只改变图像的显示大小,而不是底层图像文件的实际像素数据。

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

    How to Resize an NSImage

    两个人。

        2
  •  0
  •   fbrereto    15 年前

    [imageData length] 应该给出NSData内容的长度,我理解为写入磁盘时的最终文件大小。这将使您有机会在实际编写文件之前最大化文件的大小。

    至于为什么图像没有缩小或增长,根据 the docs for setSize :

    图像表示的大小与图像数据的物理尺寸相结合,决定了图像的分辨率。

    因此,通过设置大小和不改变分辨率,您可能不会修改任何像素,而只是修改像素的解释方式。

    推荐文章