Каков наилучший способ получить максимальное растровое представление от объекта NSImage - PullRequest
1 голос
/ 07 января 2012

Я хочу получить самый высокий 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 ]

0 голосов
/ 12 января 2012

Я использую

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];
0 голосов
/ 08 января 2012

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