NSView

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

  • Ich habe versucht, eine Lˆsung zu finden, bin aber nur auf mˆgliche Wege gestoflen.
    Problem 1: NSView geht nicht zum anzeigen von Bildern, sondern nur NSImageView.

    Problem 2: Wie erzeugt man aus einem BufferedImage eine f¸r NSImage verarbeitbare Repr‰semtation. Daf¸r kˆnntest Du das Java Advanced Imaging Paket installieren, eine BMP o.‰. erzeugen, aus dieser dann ein NSData-Objekt und aus diesem dann ein NSImage.

    Uneleganter, daf¸r aber ohne zus‰tzliche Installationen ist folgender Ansatz:
    aus dem BufferedImage ein tempor‰res JPG schreiben und dieses zum erzeugen des NSImage verwenden. Dazu kannst Du die undokumentierte SUN Klasse JPEGEncoder verwenden, die aber leider nur in einen OutputStream rendern kann.

    Das geht so:


    import com.sun.image.codec.jpeg.*;
    import java.io.*;

    public class Foo {
    public void saveComponentAsJPEG(Component myComponent, String filename) {
    Dimension size = myComponent.getSize();
    BufferedImage myImage = new BufferedImage(size.width, size.height,BufferedImage.TYPE_INT_RGB);
    Graphics2D g2 = myImage.createGraphics();
    myComponent.paint(g2);
    try {
    OutputStream out = new FileOutputStream(filename);
    JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
    encoder.encode(myImage);
    out.close();
    } catch (Exception e) {
    System.out.println(e);
    }
    }

    }
    Das ist die Variante, die um wenigsten schˆn ist, allerdings auch am wenigsten Programmieraufwand erfordert.

    Alternativ kˆnntest Du auch, um den unschˆnen Weg ¸ber die Platte zu sparen, wie folgt verfahren:
    BufferedImage-Grˆfle ermitteln.
    Gleichgrofles NSBitmapImageRep erzeugen.
    Zeilen/Spaltenweise die Farbwerte der Pixel als int ermittlen mit BufferedImage.getRGB(int, int) ,
    Aus diesen die RGB Werte(mit dem schˆnen << Operator) ermitteln und in in das byte-Array, das NSBitmapImageRep.data() liefert, eintragen.

    Falls Du dir nicht sicher bist, welches Byte f¸r welches Pixel zust‰ndig ist, hilft Dir dieser Artikel weiter:
    macdevcenter.com/lpt/a/2613
  • Nachtrag:
    mir ist es bei ausprobieren nicht gelungen, awt und Cocoa zusammen zu verwenden. Ich habe dazu allerdings auch nichts in den Release-Notes gefunden, aber sobald ich ein BufferedImage erzeuge, wird bei einer Konsolen-Anwendung eine Men¸-Leiste erzeugt, und aus einer Anwendung heraus startet diese nicht mehr.
    Kann das jmd best‰dtigen (10.2.2/JDk 1.4.1 PR5)?
  • Hi snowman,

    bitshift, ARGB und sonstige Image - Scheinereien sind kein Thema ;) Mein Java Programm ist voll davon. Zu sehen unter alphakanal.de/pixel. Ist ein online Photoedit test (beta) mit Javascript und meinem Programm als Tomcat Servlet.

    Project Builder gibt untenstehende Meldung aus wenn ich diesen Code compilieren lasse.


    import com.apple.cocoa.foundation.*;
    import com.apple.cocoa.application.*;

    public class mojoView extends NSImageView
    {
    protected NSImage _image;
    protected NSBitmapImageRep _imageRep;
    protected byte[] _imageArray;

    public mojoView(NSRect frame)
    {
    super(frame);

    _image = new NSImage("/Users/stiwi/Pictures/helm.bmp", false);
    _imageRep = new NSBitmapImageRep(frame);

    setEditable(true);

    setImageAlignment(NSImageCell.ImageAlignCenter);
    setImageFrameStyle(NSImageCell.ImageFrameGrayBezel);
    setImageScaling(NSImageCell.ScaleProportionally);

    setImage(_image);
    }
    }


    ObjCJava WARNING:
    jobjc_jvm_newObject(): constructor with signature (Lcom/apple/cocoa/foundation/NSRect;)V on class mojoView failed (should morph the java exception)
    2002-11-23 16:52:13.820 mojo[411] AppKitJava: uncaught exception OBJCJava_RUNTIME_EXCEPTION ((null))
    2002-11-23 16:52:13.820 mojo[411] AppKitJava: exception = (null description)
    2002-11-23 16:52:13.820 mojo[411] AppKitJava: terminating.

    mojo has exited with status 1.




    Und auch dieser Constructor funzt nicht


    private void createImageBuffer()
    {
    int width = (int)_image.size().width();
    int height = (int)_image.size().height();

    int bps = 8;
    int spp = 1;
    boolean alpha = false;
    boolean isPlanar = false;
    String colorNameSpace = NSGraphics.DeviceRGBColorSpace;
    int rowBytes = 0;
    int pixelBits = 0;

    _imageRep = new NSBitmapImageRep(width,height,bps,spp,alpha,isPlanar,colorNameSpace,rowBytes,pixelBits);

    }

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von stiwi ()