NSBitmapImageRep > skalieren

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

  • NSBitmapImageRep > skalieren

    Hallo,

    ich möchte ein NSBitmapImageRep skalieren, Quelltext siehe unten…

    Ein Bild ist z.B. 600 x 600px groß und hat 300dpi.
    Das ergibt folgende Ausgabe:

    Quellcode

    1. <NSImage 0x60800086d7c0 Size={144, 144} Reps=(
    2. "NSBitmapImageRep 0x6080002a90c0 Size={144, 144} ColorSpace=sRGB IEC61966-2.1 colorspace BPS=8 BPP=32 Pixels=600x600 Alpha=NO Planar=NO Format=0 CurrentBacking=<CGImageRef: 0x6080001ca6e0> CGImageSource=0x608000234fa0"
    3. )>


    Dann möchte ich das Bild auf 500 x 500px runter skalieren.
    D.h. ich berechne den Faktor und weiße das und erhalte:

    Quellcode

    1. <NSImage 0x608000874b00 Size={120, 120} Reps=(
    2. "NSBitmapImageRep 0x6080002a9060 Size={120, 120} ColorSpace=sRGB IEC61966-2.1 colorspace BPS=8 BPP=32 Pixels=500x500 Alpha=NO Planar=NO Format=0 CurrentBacking=<CGImageRef: 0x6080001ca6e0> CGImageSource=0x608000234fa0"
    3. )>


    Wenn ich das Bild dann in die Zwischenablage kopiere und dann via Vorschau ansehe, dann hat es immer noch 600 x 600px mit 300dpi.

    -setPixelsWide: und -setPixelsHigh: werden gar nicht angenommen.
    Verändere ich aber -setSize: nach Belieben, dann ändert sich korrekterweise auch die DPI.

    Hat jemand eine Idee dazu?

    Viele Grüße

    C-Quellcode

    1. // …
    2. NSLog(@"%@", image);
    3. // …
    4. CGSize size = [imageRep size];
    5. size.width = size.width / scale;
    6. size.height = size.height / scale;
    7. // …
    8. [imageRep setSize:size];
    9. [imageRep setPixelsWide:pixelsWide];
    10. [imageRep setPixelsHigh:pixelsHigh];
    11. // …
    12. image = [[[NSImage alloc] init] autorelease];
    13. if(image == nil)
    14. {
    15. return;
    16. }
    17. // …
    18. [image setCacheMode:NSImageCacheNever];
    19. [image addRepresentation:imageRep];
    20. // …
    21. NSLog(@"%@", image);
    22. // …
    Alles anzeigen
  • ja - aber das ist imho auch logisch da das Skalieren ja eh mit einer Änderung der Pixeldaten einher geht

    Farbraum, alpha channel etc kannst du ja entsprechend in der Zielbitmap setzen aber Metadaten wie zb EXIF gehen definitiv futsch, bzw müste man dann selbst Handhaben.
    snafu
    :() { :|: &};:
    sometimes i dream in hex
    Obey gravity! Because its a law!
  • Zum Verständnis des Effekts:
    eine Bitmap hat eine feste Größe die beim Erstellen definiert wird und z.B. in der PNG- oder TIFF-Datei steht.
    Diese wird in eine NSBitmapImageRep geladen.

    Ein NSImage ist ein Container das eine eigene Size und eine oder mehrere ImageReps enthält.
    Dessen size ist eine Angabe wie groß das Image gezeichnet werden soll. Dazu wird eine passende ImageRep herausgesucht.
    Wenn man die size des NSImage ändert, beeinflußt das die ImageReps überhaupt nicht sondern nur das Ergebnis, sofern es gemalt wird.

    Wenn man also ein PNG oder TIFF skalieren will, muß man das NSImage in eine neue NSBitmapImageRep reinmalen lassen.
    Dann wird das Bild auch umgerechnet. Und man kann es neu abspeichern.
  • Guten Morgen,

    vielen Dank für die Informationen…

    Aber ich bin nicht am NSImage, sondern am NSBitmapImageRep.
    Das setzen via -setSize: funktioniert ja auch einwandfrei. Ich hole vom NSImage der/die/das NSBitmapImageRep ab und verändere die Größe.
    Das ist kein Problem.

    Der Setter -setPixelsWide: und -setPixelsHigh: funktionieren gemäß Log auch.
    Aber wenn das Bild dann abgesichert wird, dann wurde nur -setSize: angewandt.

    Ich habe derweil eine Lösung mit -draw: gebaut.
    Aber wie gesagt, so muss immer zwischen gespeichert werden, ob das Bild ein bmp, jpg, gif, tif etc. war.
    Das ist das Unschöne daran.

    Viele Grüße