【问题标题】:What is best way to get highest bitmap representation from NSImage object从 NSImage 对象获得最高位图表示的最佳方法是什么
【发布时间】:2012-01-07 07:19:22
【问题描述】:

我想从 NSImage 对象中获取最高的 NSBitmapImageRep。
例如,如果 NSImage 对象包含:

NSIconRefBitmapImageRep 0x1272d0 Size={128, 128} ColorSpace=Generic RGB colorspace BPS=8 BPP=32 Pixels=128x128 Alpha=YES Planar=NO Format=0 CurrentBacking=nil (faulting),
NSIconRefBitmapImageRep 0x11b330 Size={256, 256} ColorSpace=Generic RGB colorspace BPS=8 BPP=32 Pixels=256x256 Alpha=YES Planar=NO Format=0 CurrentBacking=nil (faulting),
NSIconRefBitmapImageRep 0x19fe10 Size={512, 512} ColorSpace=Generic RGB colorspace BPS=8 BPP=32 Pixels=512x512 Alpha=YES Planar=NO Format=0 CurrentBacking=nil (faulting),
NSIconRefBitmapImageRep 0x124d10 Size={32, 32} ColorSpace=Generic RGB colorspace BPS=8 BPP=32 Pixels=32x32 Alpha=YES Planar=NO Format=0 CurrentBacking=nil (faulting),
NSIconRefBitmapImageRep 0x142180 Size={16, 16} ColorSpace=Generic RGB colorspace BPS=8 BPP=32 Pixels=16x16 Alpha=YES Planar=NO Format=0 CurrentBacking=nil (faulting)  

然后我想要 {512 , 512} 表示。我为此使用下面的代码。

NSBitmapImageRep* requiredBitmap = nil;
    BOOL setValue =NO;

    NSEnumerator* imageEnum = [[origImage representations] objectEnumerator];

    while( imagerep = [imageEnum nextObject])
    {
        if ([imagerep isKindOfClass:[NSBitmapImageRep class]]) 
        {
            if (!setValue) {
                requiredBitmap = imagerep;
                setValue =YES;
            }
            if ([requiredBitmap pixelsHigh]<[imagerep pixelsHigh]) {
                requiredBitmap = imagerep;

                NSLog(@"%d", [imagerep pixelsHigh]);

            }
        }
    }


    NSImage* original512Image;

    if( requiredBitmap )
    {
        original512Image = [[NSImage alloc] initWithData:[requiredBitmap TIFFRepresentation]];


}  

有什么有效的方法吗?

【问题讨论】:

  • 你试过bestRepresentationForRect:context:hints: 有一个非常大的矩形(可能是CGRectInfinite)吗?
  • 此方法在 Mac OS X v10.6 及更高版本中可用。我正在寻找 Leopard os 的解决方案。

标签: objective-c cocoa image-processing bitmap nsimage


【解决方案1】:

您应该使用快速枚举,但除此之外,您的方法与 Leopard 一样有效。

即便如此,循环通过五个图像表示并检查它们的尺寸的开销将非常小,只需几个访问器方法调用。

请记住,首先配置文件,然后进行优化。先发制人的优化是浪费时间。

NSBitmapImageRep* requiredBitmap = nil;
BOOL setValue =NO;

for(NSImageRep* imagerep in [origImage representations])
{
    if ([imagerep isKindOfClass:[NSBitmapImageRep class]]) 
    {
        if (!setValue) {
            requiredBitmap = imagerep;
            setValue =YES;
        }
        if ([requiredBitmap pixelsHigh]<[imagerep pixelsHigh]) {
            requiredBitmap = imagerep;

            NSLog(@"%d", [imagerep pixelsHigh]);

        }
    }
}


NSImage* original512Image = nil;
if( requiredBitmap )
{
    original512Image = [[NSImage alloc] initWithData:[requiredBitmap TIFFRepresentation]];
}  

【讨论】:

    【解决方案2】:

    我正在使用

    id imageRep = nil;
    
    NSSize largImageSize;
    
    BOOL setValue =NO;
    
    NSEnumerator* imageEnum = [[lOriginalImage representations] objectEnumerator];
    
    while((imageRep = [imageEnum nextObject])) {
    
        if (!setValue) {
            largImageSize = [imageRep size];
            setValue =YES;
        }
        else if ((largImageSize.height) < ([imageRep size].height)) {
            largImageSize = [imageRep size];
        }
    
    }
    
    
    [lOriginalImage setSize:largImageSize];
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-25
      • 2011-10-26
      • 1970-01-01
      • 2015-01-09
      • 1970-01-01
      • 2010-11-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多