NSData to UIImage

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • NSData to UIImage

    Hallo Forum-Mitglieder,

    ich habe ein Problem wo ich nicht weiter komme. Ich hoffe es kann mir einer helfen. Ich möchte mehrere Bilder in einen Array speichern und sie dann in einer Animation laufen lassen. Leider habe ich schon Probleme beim Laden der Bilder in ein Array als NSDATA. Ich finde den Fehler einfach nicht!

    Hiermit lade ich die Bilder in den ARRAY als NSDATA:

    C-Quellcode

    1. -(void)streetviewtest
    2. {
    3. float fov = 90;
    4. float heading = 235;
    5. float pitch = 10;
    6. int resolution = 300;
    7. Run *runObject = [self.runArray objectAtIndex:index.row];
    8. Standort *initialLoc = [runObject.standorte objectAtIndex:1];
    9. _latitude = initialLoc.latitude.floatValue;
    10. _longitude = initialLoc.longitude.floatValue;
    11. NSString *path = [NSString stringWithFormat:@"http://maps.googleapis.com/maps/api/streetview?size=%dx%d&location=%f,%f&fov=%f&heading=%f&pitch=%f&sensor=false", resolution, resolution, _latitude, _longitude, fov, heading, pitch];
    12. _slideshowarray[1] = [UIImage imageWithData:[self dateidownload:path]];
    13. pitch = 12;
    14. NSString *path2 = [NSString stringWithFormat:@"http://maps.googleapis.com/maps/api/streetview?size=%dx%d&location=%f,%f&fov=%f&heading=%f&pitch=%f&sensor=false", resolution, resolution, _latitude, _longitude, fov, heading, pitch];
    15. _slideshowarray[2] = [UIImage imageWithData:[self dateidownload:path2]];
    16. }
    Alles anzeigen

    Dieser Code wird dann abgerufen und soll das erste in Bild im slideshowarray 1 anzeigen.

    Quellcode

    1. -(void)daten_darstellen
    2. {
    3. Run *runObject = [self.runArray objectAtIndex:index.row];
    4. _distanzlabel.text = [Funktionsarchiv stringifyDistance:runObject.distanz.floatValue];
    5. _dauerlabel.text = [NSString stringWithFormat:@"%@", [Funktionsarchiv stringifySecondCount:runObject.dauer.intValue usingLongFormat:YES]];
    6. Standort *initialLoc = runObject.standorte.firstObject;
    7. _latitude = initialLoc.latitude.floatValue;
    8. _longitude = initialLoc.longitude.floatValue;
    9. //[self streetview_slideshow_laden];
    10. //[self streetview_slideshow_laden];
    11. //UIImage *image = [UIImage imageWithData:_slideshowarray[1]];
    12. //[_streetviewbilder setImage:image];
    13. //[self streetview_laden];
    14. [self streetviewtest];
    15. NSData *testdata = [[NSData alloc] initWithData:_slideshowarray[1]];
    16. UIImage *imgv = [UIImage imageWithData:testdata];
    17. //imgv.image = [UIImage imageWithData:testdata];
    18. [_streetviewbilder setImage:imgv];
    19. }
    Alles anzeigen
    Leider bleibt der Bildschirm immer schwarz.

    Vielleicht hat jemand eine Idee. Danke!!!
  • Das kann dir wohl kaum jemand sagen - irgendwo auf dem Weg geht's halt kaputt. Schmeiß' doch erstmal aus deinem Code alles Unnötige raus (Labels, das eigenartige Zwischengespeichere in irgendwelchen Arrays usw.). Und dann lauf' doch mal mit dem Debugger Zeile für Zeile durch und schaue nach, ob nach jedem Schritt das passiert, was du erwartest. Ist die URL ok? Liefert der Webservice etwas Brauchbares? Was kommt zurück? Ist im NSData etwas drin? Was passiert, wenn man die Dateien in eine Datei schreibt und mit Vorschau öffnet? Daten synchron-blockierend aus dem Netz zu ziehen ist übrigens gar keine gute Idee.
    Multigrad - 360°-Produktfotografie für den Mac
  • Fortrackz schrieb:

    Einfach mal gucken ob [self dateidownload:path] (Irgendwie komisch auf deutsch) auch nsdata zurück gibt und nicht null.

    Steht etwas im Log? Irgendein Cocoa Error?
    Jetzt geht auch self.ملف_حاسوبdownload(path).

    Coole Nummer …
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • Amin Negm-Awad schrieb:

    Fortrackz schrieb:

    Einfach mal gucken ob [self dateidownload:path] (Irgendwie komisch auf deutsch) auch nsdata zurück gibt und nicht null.

    Steht etwas im Log? Irgendein Cocoa Error?
    Jetzt geht auch self.ملف_حاسوبdownload(path).
    Coole Nummer …
    bin leider kein swift Experte. Bevorzuge aber die englische Variante. :)
    Every language has an optimization operator. In ObjC that operator is ‘//’.

    golbros.de
  • Auch auf die Gefahr, mich jetzt fürchterlich zu blamieren ... aber ich will ja was lernen :D

    Einmal angenommen, der Download des Images funktioniert problemlos (was ich testweise mal durch Zuweisung eines Dummy-Images simulieren würde): Würde diese Code-Zeile

    Quellcode

    1. _slideshowarray[1] = [UIImage imageWithData:[self dateidownload:path]];

    nicht zur Folge haben, dass der Retain-Count des erzeugten UIImages unverändert bliebe? Und würde dieses - da autoreleased aufgrund des "convenience constructors" - somit nicht nach Verlassen der Methode (irgendwann) abgeräumt? Bitte korrigiert mich, wenn mein Verständnis des Speichermanagements hier falsch ist!

    Ich würde eher mit einem NSMutableArray hantieren und das Image per addObject:-Methode hinzufügen.

    Mattes
    Diese Seite bleibt aus technischen Gründen unbedruckt.
  • MyMattes schrieb:

    Würde diese Code-Zeile

    Quellcode

    1. _slideshowarray[1] = [UIImage imageWithData:[self dateidownload:path]];

    nicht zur Folge haben, dass der Retain-Count des erzeugten UIImages unverändert bliebe? Und würde dieses - da autoreleased aufgrund des "convenience constructors" - somit nicht nach Verlassen der Methode (irgendwann) abgeräumt? Bitte korrigiert mich, wenn mein Verständnis des Speichermanagements hier falsch ist!
    Zum einen dürfte ARC eingeschaltet sein und das kümmert sich schon um die notwendigen retains und releases. Zum anderen wird die Zeile da vom Compiler zu

    Quellcode

    1. [_slideshowarray setObject:[self dateidonwload:path] atIndexedSubscript:1];
    übersetzt. Die Methode setObject:atIndexedSubscript: kümmert sich also entsprechend um die Eigentümerschaft.



    MyMattes schrieb:

    Ich würde eher mit einem NSMutableArray hantieren und das Image per addObject:-Methode hinzufügen.
    _slideshowarray muss bereits ein NSMutableArray sein, sonst würde der Compiler die Codezeile nicht akzeptieren.
  • Hallo,

    danke für die vielen Antworten. Ich habe jetzt versucht das ganze Testweise abzuspecken und einfacher zu bauen. Hier erstmal der Code.

    Quellcode

    1. float fov = 90;
    2. int heading = 0;
    3. float pitch = 10;
    4. int resolution = 300;
    5. Run *runObject = [self.runArray objectAtIndex:index.row];
    6. Standort *initialLoc = [runObject.standorte objectAtIndex:1];
    7. _latitude = initialLoc.latitude.floatValue;
    8. _longitude = initialLoc.longitude.floatValue;
    9. NSData *bild;
    10. NSMutableArray *imagearray2 = nil;
    11. for (int i = 0; i <= 10; i++)
    12. {
    13. heading = i;
    14. NSLog(@"Grad: %i",heading);
    15. NSString *path = [NSString stringWithFormat:@"http://maps.googleapis.com/maps/api/streetview?size=%dx%d&location=%f,%f&fov=%f&heading=%i&pitch=%f&sensor=false", resolution, resolution, _latitude, _longitude, fov, heading, pitch];
    16. bild = [self streetview_slideshow_laden:path];
    17. [imagearray2 addObject:[UIImage imageWithData:bild]];
    18. }
    19. NSArray *imagearray = [NSArray arrayWithArray:imagearray2];
    20. _streetviewbilder.animationImages = imagearray;
    21. _streetviewbilder.animationDuration = 3.0;
    22. _streetviewbilder.animationRepeatCount = 100000;
    23. [_streetviewbilder startAnimating];
    Alles anzeigen

    Es schein ein Problem zu geben, wenn ich die Bilder in den NSMuteablearray packe. Wenn ich mehrere Bilder manuell in einen Array lege, dann funktioniert es wunderbar. Beispiel:

    Quellcode

    1. NSArray * imageArray = [[NSArray alloc] initWithObjects:
    2. [UIImage imageWithData:bild1],
    3. [UIImage imageWithData:bild2],
    4. [UIImage imageWithData:bild3],
    5. [UIImage imageWithData:bild4],
    6. [UIImage imageWithData:bild5],
    7. [UIImage imageWithData:bild6],
    8. [UIImage imageWithData:bild7],
    9. [UIImage imageWithData:bild8],
    10. [UIImage imageWithData:bild9],
    11. [UIImage imageWithData:bild10],
    12. [UIImage imageWithData:bild11],
    13. [UIImage imageWithData:bild12],
    14. [UIImage imageWithData:bild13],
    15. [UIImage imageWithData:bild14],
    16. [UIImage imageWithData:bild15],
    17. [UIImage imageWithData:bild16],
    18. [UIImage imageWithData:bild17],
    19. [UIImage imageWithData:bild18],
    20. [UIImage imageWithData:bild19],
    21. [UIImage imageWithData:bild20],
    22. nil];
    Alles anzeigen
  • In Zeile 17, also zum Zeitpunkt von [imageArray2 addObject:...] ist imageArray2 nil, alleine deshalb kann das nicht funktionieren - die Bilder landen im Nirvana. Zum restlichen Code kann ich nicht viel sagen, ich finde ihn immer noch unverständlich und es fehlt die Hälfte von dem, was man zum Verständnis davon bräuchte.
    Multigrad - 360°-Produktfotografie für den Mac