Каков наилучший способ получить максимальное растровое представление от объекта NSImage

Я хочу получить самый высокий NSBitmapImageRep из объекта NSImage.
Например, если объект 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]];


}  

Есть ли эффективный способ сделать это?

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

Вы должны использовать быстрое перечисление, но кроме этого ваш метод настолько же эффективен, насколько вы можете получить для 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]];
}  
Другие вопросы по тегам