NSImage to NSBitmapImageRep

后端 未结 3 1831
暗喜
暗喜 2021-02-04 06:00

How to convert NSImage to NSBitmapImageRep? I have code:

- (NSBitmapImageRep *)bitmapImageRepresentation
{
    NSBitmapImageRep *ret = (NSBitmapImageRep *)[self          


        
3条回答
  •  一生所求
    2021-02-04 06:52

    @Julius: Your code is way too complicated and contains several bugs. I will make a correction for only the first lines:

    - (NSBitmapImageRep *)bitmapImageRepresentation
    {
       for( NSImageRep *rep in [self representations] )
          if( [rep isKindOfClass:[NSBitmapImageRep class]] ) return rep;
       return nil;
    }
    

    This will extract the first NSBitmapImageRep if it is member in the representations or will return nil, if there is no NSBitmapImageRep. I'll give you another solution which will always work whatever NSImageReps are in the representations: NSBitmapImageRep, NSPDFImageRep or NSCGImageSnapshotRep or ...

    - (NSBitmapImageRep *)bitmapImageRepresentation
    {
       CGImageRef CGImage = [self CGImageForProposedRect:nil context:nil hints:nil];
       return [[[NSBitmapImageRep alloc] initWithCGImage:CGImage] autorelease];
    }
    

    Or to avoid subclassing of NSImage you may write:

    NSImage *img = [[[NSImage alloc] initWithContentsOfFile:filename] autorelease];
    CGImageRef CGImage = [img CGImageForProposedRect:nil context:nil hints:nil];
    NSBitmapImageRep *rep = [[[NSBitmapImageRep alloc] initWithCGImage:CGImage] autorelease];
    

    This will only return a single NSBitmapImageRep which maybe not good enough if the image contains more than one representation (e.g. a lot of NSBitmapImageReps from TIFF files). But adding some code is straightforward.

提交回复
热议问题