+ Odpowiedz na ten temat
Pokaż wyniki od 1 do 2 z 2

Temat: [XCode/Cocoa] NSImage, CIImage - operacje na grafice

  1. #1
    Avatar metal_man
    Dołączył
    Nov 2007
    Skąd
    Chorzów
    Postów
    398

    [XCode/Cocoa] NSImage, CIImage - operacje na grafice

    Witam, tym razem szukam wszedzie szczescia ale nigdzie nie moge sie doszukac odpowiedzi. Otoz tworze prosta aplikacje, ktora operuje na czarno bialym obrazie. Konkretnie potrzebne mi jest dobrac sie do kazdego pixela aby pobrac wartosc czy pixel jest bialy czy czarny. Cala metoda wyglada tak:

    Kod:
    - (NSImage *)skeletonization: (NSImage *)image
    {
    	int x = 0, y = 0;
    	
    	NSBitmapImageRep *bitmapImageRep = [[NSBitmapImageRep alloc] initWithData:[image TIFFRepresentation]];
    	
    	NSColor *myColor = [NSColor blackColor];
    	NSColor *myColor2 = [NSColor whiteColor];
    	[myColor set];
    	[myColor2 set];
    	
    	for (x=0; x<=[bitmapImageRep pixelsWide]; x++) {
    		for (y=0; y<=[bitmapImageRep pixelsHigh]; y++) {
    			[bitmapImageRep setColor:myColor atX:x y:y];
    		}
    	}
    	
    	[myColor release];
    	[myColor2 release];
    	
    	NSImage *producedImage = [[NSImage alloc] init];
    	[producedImage addRepresentation:bitmapImageRep];
    	[bitmapImageRep release];
    	
    	return [producedImage autorelease];
    }
    Do metody skeletonization: odwoluje sie poprzez nacisniecie przycisku:
    Kod:
    NSImage *myImage = [NSImage imageNamed:@"finger1.jpg"];
    NSImage *newImage = [self skeletonization:myImage];
    	
    [oryginalImage setImage:myImage];
    [skeletonizedImages setImage:newImage];
    Problem w tym, ze dziala to strasznie wolno. Potrzeba okolo 2, 3 sekund aby caly obrazek przerobic na czarny. To jest tylko przyklad, ktorym chcialem sprawdzic czy bedzie to dzialac. Dziala ale jak pisalem wolno. Ostatecznie bedzie tam z 6 iteracji i kilka warunkow do sprawdzenia wiec domyslam sie juz, ze przerobienie obrazka o wymiarach, dajmy na to 300x500 potrwa tydzien.

    Poczytalem dokumentacje i postanowilem uzyc CIImage, ktore uzywa karty grafiki do operacji na obrazkach, ale nie moge sie tam dobrac do pixela. Wyczytalem, ze tak od tak sobie nie mozna sie dobrac do pixela bo jest to bardziej "przepis" na obrazek a nie konkretna informacja o nim. Ale jak sie dobrac do treci obrazka to dalej nie wiem. Tworzenie reprezentacji obrazka sprowadza mnie do problemu: dziala ale wolno. Wiec jesli ktos ma pomysl na to jak sie choc odrobine za to zabrac to bede wdzieczny.

    Acha poczytalem jeszcze o jednym - bitmapData ale z dokumentacji nie wychodzi mi uzycie tej metody...

    Kolejna rzecz to getPixel. Tutaj mam problem z (NSUInteger [])p. Reszte rozumie ale do czego jest zmienna p?
    Ostatnio edytowane przez metal_man ; 19.07.2010 o 19:54
    Komputer:  MacBook White 13,3" 2,26GHz (Lion 10.7)
    Telefon:  iPhone 3GS (16GB) ;  iPhone 3G (8GB)
    Odtwarzacz:  iPod@iPhone
    Tablet:  iPad2
    Cytuj Cytuj  


  2. #2
    Avatar metal_man
    Dołączył
    Nov 2007
    Skąd
    Chorzów
    Postów
    398
    No dobra. Wydaje mi sie, ze mam juz funkcje ktora robi to co chce, a dokladnie taka jej definicje:

    Kod:
    unsigned char *ObrazDoTablicy(NSImageRep *bitmapImage, int width, int height)
    {
        unsigned char *myPixels;
        NSBitmapImageRep *bitmap2;
        NSGraphicsContext *myContext;
        
        pixels = malloc(4 * width * height);
        
        bitmap2 = [[NSBitmapImageRep alloc] initWithBitmapDataPlanes: &myPixels
                                                          pixelsWide: width
                                                          pixelsHigh: height
                                                       bitsPerSample: 8
                                                     samplesPerPixel: 4
                                                            hasAlpha: YES
                                                            isPlanar: NO
                                                      colorSpaceName: NSDeviceRGBColorSpace
                                                        bitmapFormat: 0
                                                         bytesPerRow: (width * 4)
                                                        bitsPerPixel: 32];
        
        myContext = [NSGraphicsContext graphicsContextWithBitmapImageRep: bitmap2];
        [NSGraphicsContext saveGraphicsState];
        [NSGraphicsContext setCurrentContext: myContext];
        [bitmapImage drawInRect: NSMakeRect(0, 0, width, height)];
        [NSGraphicsContext restoreGraphicsState];
    	
        [bitmap2 release];
        
        return pixels;
    }
    Problem mam z dostaniem sie do utworzonej tablicy. Nie ma co tworzyc w kodzie drugiej tablicy (choc tu probowalem rowniez dla cwiczen ale wskazniki do wskaznikow to koszmar). Ktos ma jakis pomysl?
    Komputer:  MacBook White 13,3" 2,26GHz (Lion 10.7)
    Telefon:  iPhone 3GS (16GB) ;  iPhone 3G (8GB)
    Odtwarzacz:  iPod@iPhone
    Tablet:  iPad2
    Cytuj Cytuj  

+ Odpowiedz na ten temat

Tagi dla tego tematu