Core Data und Bilder = seltsames Verhalten

    • Core Data und Bilder = seltsames Verhalten

      Hallo Ihr Lieben,

      schwer am arbeiten ist mir bei der Bildanzeige aus Core Data etwas merkwürdiges untergekommen.

      Ich speichere einen Datensatz mit einem Bild, welches sich in einem UIImageView befindet, problemlos ab.
      Ich hole mir den Datensatz und das Bild wird nur dann korrekt angezeigt, wenn ich es mit einem UIImagePicker aus dem Speicher geholt und in Core Data abgespeichert habe.
      Mache ich ein Bild mit der Kamera, wird es auf dem Screen korrekt im UIImageView angezeigt. Speichere ich es in Core Data ist auch noch alles gut.
      Hole ich mir den Datensatz mit dem gespeicherten Kamerabild, so wird das Bild quer statt hochkant gezeigt.

      ?(
      Öh, wo liegt mein Fehler?

      Muss ich jetzt noch ein Flag für die Bildart (Von Kamera, von Speicher) setzen und dann das Bild drehen, wenn das Flag entsprechend ist?

      Danke für einen Schubs
      Karin
    • Ich tippe mal darauf das du das Bild vor dem Speichern in CD mit UIImagePNGRepesentation "umwandelst" und vergisst die Bildorientation vorher anzupassen. Bilder von der Kamera werden mittlerweile nur noch mit einem EXIF Tag richtig rotiert, EXIF Metadaten gehen allerdings bei UIImagePNGRepesentation verloren, weswegen es später quer ist.

      Ergo müsstest du das Bild vor dem Speichern rotieren oder UIImageJPEGRepresentation nehmen (bei JPEG bleiben die EXIF Tags erhalten).

      Außerdem ist das Speichern von so großen BLOBs in CoreData nicht die schönste Idee ;)
    • Hi,

      Danke Dir. Das wusste ich nicht mit der Bildorientierung. Mal nachlesen.

      Es gibt keine Alternative zur Bildspeicherung in Core Data. Jedes Landschaftsgartenprojekt ist anders aufgebaut und da muss in die Datenaufnahme, während der Datenaufnahme, auch ein Bild rein.
      Ich werde einen Teufel tun, ein Bild außerhalb der App zu machen, und versuchen, irgendwelche Verweise zu setzen. Wüsste auch nicht, ob das überhaupt geht, dass man eine Pfadangabe auf ein Bild im Fotoalbum mitgeliefert bekommt.

      Besten Dank
      karin
    • Ich nehme doch mal an du speicherst die Bilder als Transformable Attribut und hast dann einen Transformer der die Daten speichert und wieder liest oder?
      Weil so habe ich das damals gemacht und hatte damit überhaupt keine Probleme,

      Gruß

      Claus
      2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

      Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)
    • nickkuh.com/iphone/core-data-m…torage-data-loss/2012/06/

      Mit 5.0 war die external storage verbugt, sprich die Daten gingen bei einer Migration verloren - nicht so schlimm bei einem Persistenzframework. Die haben es nicht nötig gehabt, das in 5.x mal zu fixen. Mit 6.0 hab ich das jetzt nicht mehr versucht (angetan).

      Ein weiteres Manko der external storage ist, das du keine URL zum File bekommst, jedenfalls nicht über irgend einen noch "normalen" Weg. Also ist dann mit Filmen, Sounds oder eben dem ganzen Kram wieder nix.

      Falls da jemand Erfahrungen mit der aktuellen Version hat, bitte posten.

      Gruß
      Manfred
      Seminare, Artikel, Code. ObjectiveCeeds - alles für die Apfelzucht.
    • Thallius schrieb:

      Ich nehme doch mal an du speicherst die Bilder als Transformable Attribut und hast dann einen Transformer der die Daten speichert und wieder liest oder?
      Weil so habe ich das damals gemacht und hatte damit überhaupt keine Probleme,

      Gruß

      Claus


      Hi Claus,
      Danke für den Hinweis. Verstehe zwar nur Bahnhof, aber wohl auch wichtig. Hätte mich auch gewundert, wenn bei Apple mal was normal laufen würde. Bis dato funktioniert die Speicherung und das Wiederherstellen einwandfrei, aber ich werde das Thema am Wochenende mal ansehen. Noch nie etwas davon gehört.

      Migration kapiere ich sowieso nicht und habe Null Plan, was ich bei einem Update der App machen werde. Auch das steht noch an.
      Auch hier wäre es ja zu einfach, eine Exportfunktionalität bereit zu stellen.

      Nun ja, das Wochenende ist mal wieder mit lernen belegt :(

      Juchhu
      Arin
    • Hi Karin,

      hier mal der Code wie ich das mache mit Bildern in CoreData. Keine Ahnung ob das so optimal ist aber es funktioniert zumindest einwandfrei.

      Zunächst ein Attribut für das Photo erstellen wie im Screenshot im Anhang.

      Dann einen Transfirmer erstellen der ganz einfach so aussieht:

      Quellcode

      1. //
      2. // ImageToDataTransformer.h
      3. // MacAirTime
      4. //
      5. // Created by Claus Bönnhoff on 19.09.12.
      6. // Copyright (c) 2012 Claus Bönnhoff. All rights reserved.
      7. //
      8. #import <Foundation/Foundation.h>
      9. @interface ImageToDataTransformer : NSValueTransformer
      10. +(NSImage*) resizeImage:(NSImage*)srcImage MaxWidth:(CGFloat)maxWidth MaxHeight:(CGFloat)maxHeight;
      11. @end
      12. //
      13. // ImageToDataTransformer.m
      14. // MacAirTime
      15. //
      16. // Created by Claus Bönnhoff on 19.09.12.
      17. // Copyright (c) 2012 Claus Bönnhoff. All rights reserved.
      18. //
      19. #import "ImageToDataTransformer.h"
      20. @implementation ImageToDataTransformer
      21. + (BOOL)allowsReverseTransformation
      22. {
      23. return YES;
      24. }
      25. + (Class)transformedValueClass
      26. {
      27. return [NSData class];
      28. }
      29. - (id)transformedValue:(id)value
      30. {
      31. NSBitmapImageRep *rep = [[value representations] objectAtIndex: 0];
      32. NSData *data = [rep representationUsingType:NSJPEGFileType properties: nil];
      33. return data;
      34. }
      35. - (id)reverseTransformedValue:(id)value
      36. {
      37. if(value)
      38. {
      39. NSImage *image = [[NSImage alloc] initWithData:value];
      40. return image;
      41. }
      42. return [NSImage imageNamed:@"noimage.png"];
      43. }
      44. +(NSImage*) resizeImage:(NSImage*)srcImage MaxWidth:(CGFloat)maxWidth MaxHeight:(CGFloat)maxHeight
      45. {
      46. CGFloat factorx=maxWidth/srcImage.size.width;
      47. CGFloat factory=maxHeight/srcImage.size.height;
      48. CGFloat factor=MAX(factorx,factory);
      49. CGFloat width = srcImage.size.width*factor;
      50. CGFloat height = srcImage.size.height*factor;
      51. NSImageView* imageView = [[NSImageView alloc] initWithFrame:NSMakeRect(0, 0, width, height)];
      52. [imageView setImageScaling:NSImageScaleProportionallyUpOrDown];
      53. [imageView setImage:srcImage];
      54. NSRect imageRect = imageView.frame;
      55. NSBitmapImageRep* imageRep = [imageView bitmapImageRepForCachingDisplayInRect:imageRect];
      56. [imageView cacheDisplayInRect:imageRect toBitmapImageRep:imageRep];
      57. NSData* imageData = [imageRep representationUsingType:NSJPEGFileType properties:nil];
      58. return [[NSImage alloc] initWithData:imageData];
      59. }
      60. @end
      Alles anzeigen


      Den resize brauchst Du natürlich nicht zwangsläufig. Ich finde es nur unnötig irgendwelche 10MPixel Bilder in CD zu speichern wenn man zur Anzeige eh nur 1024x768 oder so benutzt.

      Gruß

      Claus
      2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

      Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)
    • Lieber Claus,

      dass sieht richtig gut aus und werde ich auch heute noch testen. Danke, Danke, Danke!

      Habe noch diese interessante Webseite entdeckt:
      developer.apple.com/library/ma…icles/cdNSAttributes.html

      Natürlich macht es mehr Sinn, es so anzugehen. Ich würde auch nie ein 300dpi-Bild zur Anzeige bringen wollen.

      Lieben Dank und wenn wir nicht voneinander hören einen guten Rutsch und den wünsche ich auch allen anderen netten Menschen hier im Forum.

      Noch nüchterne Grüße Karin, die Olle geht doch tatsächlich auf eine Party
      Karin ;( :rolleyes: