Odpowiedz na ten temat
Pokaż wyniki od 1 do 4 z 4
  1. Avatar metal_man
    Dołączył
    Nov 2007
    Skąd
    Chorzów
    Postów
    406

    Cytuj | #1

    Witam,
    Pisze program, ktory ma przetworzyc obraz. Oryginalna grafike rysuje w polu obrazek. Natomiast chcialbym obrocic ten obrazek i umiescic go w drugim polu - obrazek_enhanced. Mam do tego taki kod:

    Kod:
    #import "Obrazek.h"
    
    @implementation Obrazek
    - (IBAction) Button: (id) sender {
        NSImage *mojObrazek = [NSImage imageNamed:@"finger2.jpg"];
    	
    	[obrazek setImage: mojObrazek];
    	[width setIntValue: mojObrazek.size.width];
    	[height setIntValue: mojObrazek.size.height];
    	
    	[mojObrazek Rotate: mojObrazek];
    	[obrazek_enhanced setImage: mojObrazek];
    }
    
    - (NSImage *) Rotate: (NSImage *) obraz clockwise: (BOOL) clockwise {
    	NSImage *existingImage = obraz;
    	NSSize existingSize;
    	
    	existingSize.width = [[existingImage bestRepresentationForDevice: nil] pixelsWide];
    	existingSize.height = [[existingImage bestRepresentationForDevice: nil] pixelsHigh];
    	
    	NSSize newSize = NSMakeSize(existingSize.height, existingSize.width);
    	NSImage *rotatedImage = [[NSImage alloc] initWithSize:newSize];
    	
    	NSAffineTransform *rotateTF = [NSAffineTransform transform];
        NSPoint centerPoint = NSMakePoint(newSize.width / 2, newSize.height / 2);
    	
    	[rotateTF translateXBy: centerPoint.x yBy: centerPoint.y];
        [rotateTF rotateByDegrees: (clockwise) ? - 90 : 90];
        [rotateTF translateXBy: -centerPoint.y yBy: -centerPoint.x];
        [rotateTF concat];
    	
    	NSRect r1 = NSMakeRect(0, 0, newSize.height, newSize.width);
        [[existingImage bestRepresentationForDevice: nil] drawInRect: r1];
    	
        [rotatedImage unlockFocus];
    	
        return rotatedImage;	
    }
    
    @end
    O ile zaladowanie obrazka to pikus o tyle wykonywanie czynnosci na tym obrazku jest juz troche trudniejsze. Wydaje mi sie, ze blad lezy gdzies w przekazywaniu obiektu ale nie dam sobie glowy uciac.


    EDIT:

    Znalazlem rozwiazanie, ktore dziala. ALE problem jesli idzie o przekazywanie obiektow z/do metod jeszcze nierozwiazany.

    Jesli ktos wie jak poprawic powyzszy kod bylbym wdzieczny bo rotacja obrazka miala byc tylko wstepem. Caly obrazek zostanie poddany powazniejszej obrobc ale dalej nie wiem jak go przekazywac...

    Rozwiazanie to wstawic w linijki buttona:
    Kod:
    NSSize imageSize = [sourceImage size];
     
    NSImage* rotatedImage = [[NSImage alloc] initWithSize:imageSize];
     
    NSPoint center = NSMakePoint(imageSize.width / 2.0, imageSize.height / 2.0);
     
    NSAffineTransform* transform = [NSAffineTransform transform];
    [rotatedImage lockFocus];
    [transform translateXBy:center.x yBy:center.y];
    [transform rotateByDegrees:180.0];
    [transform translateXBy:-center.x yBy:-center.y];
    [transform concat];
     
    [sourceImage drawAtPoint:NSZeroPoint fromRect:NSZeroRect operation:NSCompositeCopy fraction:1.0];
    [rotatedImage unlockFocus];
    Ostatnio edytowane przez metal_man ; 01.04.2010 o 16:20
    Komputer:  MacBook White 13,3" 2,26GHz (Lion 10.7)
    Telefon:  iPhone 3GS (16GB) ;  iPhone 3G (8GB)
    Odtwarzacz:  iPod@iPhone
    Tablet:  iPad2


  2. Avatar krzyspmac
    Dołączył
    Feb 2006
    Skąd
    Warszawa
    Postów
    152

    Cytuj | #2

    Widzę, że masz metodę -Rotate:clockwise, która zwraca NSImage.

    Problem w tym, że nie przyjmujesz zwracanego obiektu w metodzie -button:

    Masz:

    [mojObrazek Rotate: mojObrazek];
    [obrazek_enhanced setImage: mojObrazek];

    a powinno być:

    NSImage * nowyObrazek = [self Rotate: mojObrazek]; // napisałem self, bo wywołujemy metodę*w Obiekcie klasy Obrazek, a nie NSImage. Nie masz*tej metody w NSImage, tylko w obiekcie klasy Obrazek.

    [obrazek_enhanced setImage: nowyObrazek];

    Rozumiem, że cały ten obiekt jest typu NSImage? (klasa bazowa?) Poza tym widzę, problem z pamięcią.
    Ja bym dał autorelease do obiektu zwracanego w metodzie -Rotate:clockwise. Przypisanie obrazka do obrazek_enhanced zrobi temu obiektowi -retain.
    Komputer: PowerMac G5
    Odtwarzacz: F2 ;)
    Krzysiek
    schowekswiata.pl

  3. Avatar metal_man
    Dołączył
    Nov 2007
    Skąd
    Chorzów
    Postów
    406

    Cytuj | #3

    Zarzadzanie pamiecia jeszcze dorobie bo na razie dzialam na jednym obrazku i nie powinno sie nic nieoczekiwanego dziac.
    Klasa, po ktorej dzidzicze to NSObject ale obrazek oraz obrazek_enhanced sa NSImageView. Sekcja interface wyglada natomiast nastepujaco:
    Kod:
    @interface Obrazek : NSObject {
        IBOutlet NSImageView *obrazek;
    	IBOutlet NSImageView *obrazek_enhanced;
    	IBOutlet NSTextField *width;
    	IBOutlet NSTextField *height;
    }
    - (IBAction) Button: (id) sender;
    - (NSImage *) Rotate: (NSImage *) obraz clockwise: (BOOL) clockwise;
    @end
    koiec koncow program sie kompiluje ale dalej nie wyswietla grafiki. Dostaje jedynie 4 warningi. Jeden dotyczy linijki [self Rotate: nowyObrazek] - 'Obrazek' may not respond to 'Rotate:' oraz 3 warningi pojawiaja sie przy bestRepresentationForDevice jako przestarzale.
    Ostatnio edytowane przez metal_man ; 02.04.2010 o 15:32
    Komputer:  MacBook White 13,3" 2,26GHz (Lion 10.7)
    Telefon:  iPhone 3GS (16GB) ;  iPhone 3G (8GB)
    Odtwarzacz:  iPod@iPhone
    Tablet:  iPad2

  4. Avatar wojtkow SM? Tylko S...


    Dołączył
    May 2007
    Skąd
    Poznań
    Postów
    3,621

    Cytuj | #4

    Masz taki warning bo w pliku h. definiujesz:
    Kod:
    - (NSImage *) Rotate: (NSImage *) obraz clockwise: (BOOL) clockwise;
    a wywołujesz
    Kod:
    [self Rotate: nowyObrazek]
    co odpowiada definicji
    Kod:
    - (NSImage *) Rotate: (NSImage *) obraz;
    Musisz we wywołaniu ustawiać parametr clockwise.
    Komputer: MBA 11.6" i7 1.8GHz 4GB RAM 256GB SSD, iMac 27" i7 2.8GHz 8GB RAM 240 GB SSD + 1 TB HDD
    Telefon: iPhone 4
    Odtwarzacz: iPhone 4
    Tablet: iPad (2012) 4G, iPad WiFi
    Moje programy w AppStore:
    iOS => Project Planner | Project Planner HD
    OSX => Project Planner Viewer
    Zgodnie z regulaminem nie udzielam porad poprzez PW - masz pytanie, pytaj na forum.

Odpowiedz na ten temat