CGDataProviderCreateWithData, CGImageCreate

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

  • CGDataProviderCreateWithData, CGImageCreate

    Moin,

    ich raff es nicht. Ich bastele mir Rohdaten eines Bildes zusammen. Graustufen, 8 bit. Und will es -- nur erstmal für mich zum Debuggen -- anzeigen.

    Bei einigen Bildern klappt es, bei anderen sind die einzelnen Zeilen zueinander verschoben.

    Quellcode

    1. - (void)showImageFromData:(UInt8*)data size:(CGSize)size
    2. {
    3. CGDataProviderRef pro = CGDataProviderCreateWithData(NULL, data, (int)((size_t)size.width*(size_t)size.height), NULL);
    4. CGImageRef ir = CGImageCreate((size_t)size.width, (size_t)size.height, 8, 8, (size_t)size.width, CGColorSpaceCreateDeviceGray(), kCGBitmapByteOrderDefault, pro, NULL, NO, kCGRenderingIntentDefault);
    5. UIImage *im = [[UIImage alloc] initWithCGImage:ir];
    6. ...


    Jetzt die Preisfrage: muß bytesPerRow irgendwie aligned sein oder können das x-beliebig krumme Werte sein?
    if (!exit(-1)) fprintf(stderr, "exit call failed. Program will continue\n");
  • CGColorSpaceCreateDeviceGray
    Sicher

    So auf die Schnelle etwas Code

    Quellcode

    1. CGImageRef FLImageBlack (int width , int height)
    2. {
    3. // puffergröße
    4. int theSize = width * height * 4 * sizeof (uint8_t);
    5. /*
    6. / wird von dataprovider freed
    7. */
    8. uint8_t *buffer = malloc( theSize );
    9. CGDataProviderRef provider = CGDataProviderCreateWithData(NULL, buffer, theSize , FLProviderReleaseData);
    10. int i, j;
    11. /*
    12. / Jetzt reinpixeln (RGBA)
    13. */
    14. for (i = 0 ; i < height ; i++)
    15. {
    16. for (j = 0 ; j < width ; j++)
    17. {
    18. *(buffer) = 0 ; buffer++;
    19. *(buffer) = 0 ; buffer++;
    20. *(buffer) = 0 ; buffer++;
    21. *(buffer) = 255 ; buffer++;
    22. }
    23. }
    24. CGColorSpaceRef colorspace = CGColorSpaceCreateDeviceRGB();
    25. CGImageRef image = CGImageCreate(
    26. width, // width
    27. height, // height
    28. 8, // Bits per sample
    29. 32, // Bits per pixel
    30. width * 4, // bytes per row
    31. colorspace, // colorspace
    32. (0 << 12 | kCGImageAlphaLast), // BitmapInfo
    33. provider, // Dataprovider
    34. NULL, // decode???
    35. NO, // shouldInterpolate
    36. kCGRenderingIntentDefault // intent
    37. );
    38. //free (buffer);
    39. CGDataProviderRelease(provider);
    40. CGColorSpaceRelease(colorspace);
    41. return image;
    42. }
    Alles anzeigen

    und

    Quellcode

    1. void FLProviderReleaseData (
    2. void *info,
    3. const void *data,
    4. size_t size
    5. )
    6. {
    7. free((void *)data);
    8. }

    läuft auf iPhone (1.1.x)
    Seminare, Artikel, Code. ObjectiveCeeds - alles für die Apfelzucht.
  • Original von kressevadder
    CGColorSpaceCreateDeviceGray
    Sicher

    Nicht?
    So auf die Schnelle etwas Code

    Guck ich mir mal genauer an, danke.

    Wie gesagt, meins ist eh nur für mich zum Debuggen, da darf das husch-husch sein, das fliegt alles nachher raus.
    if (!exit(-1)) fprintf(stderr, "exit call failed. Program will continue\n");
  • Nach einiger Studie bin ich zum Ergebnis gekommen daß ich das im Prinzip genauso mache.

    Hat jemand noch ne Ahnung wegen des bytesPerRow, ob das irgendwie aligned sein muß?
    if (!exit(-1)) fprintf(stderr, "exit call failed. Program will continue\n");
  • OK, hat sich erledigt. Wenn man an anderer Stelle Breite und Höhe miteinander verwechselt kann dabei nichts Sinnvolles rauskommen.

    Sorry und danke.
    if (!exit(-1)) fprintf(stderr, "exit call failed. Program will continue\n");
  • Original von seb2
    Hat jemand noch ne Ahnung wegen des bytesPerRow, ob das irgendwie aligned sein muß?

    Eigentlich nicht. Andererseits weiß ich es beim UIKit nicht so genau - auf long zu alignen kann eigentlich nie schaden... ist denn das Rohmaterial richtig gepackt?

    Edit: Ääh, stimmt, Breite und Höhe zu unterscheiden kann auch nicht schaden.
    Multigrad - 360°-Produktfotografie für den Mac
  • Original von mattik
    ist denn das Rohmaterial richtig gepackt?

    Falls es noch interessiert: da gehe ich von aus, stammt vom iPhone und ein paar andere Bilder, die ich in Preview.app zurechtgefummelt habe.

    Die bytesPerRow bei den Dateien sind tatsächlich nicht immer identisch mit breite * bytesProPixel, aber das muß ich schon an anderer Stelle berücksichtigen.
    Edit: Ääh, stimmt, Breite und Höhe zu unterscheiden kann auch nicht schaden.

    Blöd nur, wenn man das einen geschlagenen Tag lang übersieht...
    if (!exit(-1)) fprintf(stderr, "exit call failed. Program will continue\n");