2016-05-15 5 views
1

Ich versuche, ein 32bit, 4-Kanal-Bild in meinem Fenster anzuzeigen. Der vierte Kanal im Bild ist ein Alpha-Kanal. Als Experiment erstelle ich ein komplett rotes Bild, bei dem jedes Pixel den RGB-Wert hat: 255,0,0. Für jeden Pixel füge ich auch einen Alpha-Wert von 204 hinzu.Anzeigen eines Bildes mit Alpha-Kanal auf OSX

Was ich erwartet habe, war ein komplett rotes Bild mit etwas Transparenz, aber was ich stattdessen sehe, ist ein völlig undurchsichtiges Bild mit den geänderten Werten.

Erwarteter Ausgang: enter image description here

Stromausgang: enter image description here

Der Code Ich verwende:

NSRect windowRect = {0,0,200,200}; 

m_NSWindow = [[NSWindow alloc] initWithContentRect:windowRect styleMask:NSBorderlessWindowMask backing:NSBackingStoreBuffered defer:NO]; 

[m_NSWindow setTitle:@"overlayWindow"]; 

[m_NSWindow makeKeyAndOrderFront:nil]; 

g_imageView = [[NSImageView alloc] initWithFrame:NSMakeRect(0,0,200,200)]; 

[m_NSWindow.contentView addSubview:g_imageView]; 



[m_NSWindow setOpaque:NO]; 

[m_NSWindow setAlphaValue:1.0]; 



NSBitmapImageRep* imageRep = [[NSBitmapImageRep alloc] initWithBitmapDataPlanes:nil 

                    pixelsWide:200 

                    pixelsHigh:200 

                    bitsPerSample:8 

                   samplesPerPixel:4 

                     hasAlpha:YES 

                     isPlanar:NO 

                   colorSpaceName:NSDeviceRGBColorSpace 

                   bitmapFormat:NSAlphaNonpremultipliedBitmapFormat 

                    bytesPerRow:(200*4) 

                    bitsPerPixel:32]; 



memcpy(imageRep.bitmapData,m_paintBuffer.data,160000); 

NSSize imageSize = NSMakeSize(200,200); 

NSImage* myImage = [[NSImage alloc] initWithSize: imageSize]; 

[myImage addRepresentation:imageRep]; 

[g_imageView setImage:myImage]; 

wo m_paintBuffer.data Punkte auf die rohen Pixeldaten für das Bild. Nicht sicher, ob es für die Frage relevant ist, aber m_paintBuffer ist vom Typ Mat von OpenCV

+0

Der Alpha-Wert Ihres Fensters ist 100% (1.0), also versuchen Sie es auf 80% '[m_NSWindow setAlphaValue: 0.8];' ... –

+0

Oh nein, aber das wird diesen konstanten Alpha-Wert für alle setzen Pixel. Obwohl ich gerade einen konstanten Alpha-Wert verwende, möchte ich irgendwann einen pro-Pixel-Alpha-Wert verwenden. – TheBlueNotebook

+0

Ihr Beispiel zeigt es für das gesamte Fenster, also wenn Sie es auf dem Bild selbst wollen, dann legen Sie dort alpha. –

Antwort

1

Die Inhaltsansicht des Fensters ist nicht der gesamte Inhalt des Fensters, wie es war. Sogar ein grenzenloses Fenster hat (private) Themenansichten, die die Inhaltsansicht umgeben und enthalten.

Insbesondere hat das Fenster eine hellgraue Hintergrundfarbe. Dies wird "hinter" Ihrer Inhaltsansicht gezeichnet und ist undurchsichtig. Sie können dies jedoch ändern, indem Sie die Eigenschaft backgroundColor des Fensters beispielsweise auf [NSColor clearColor] setzen. Und das sollten Sie tun, um Ihren gewünschten Effekt zu erzielen.

+0

Von einem Windows-Hintergrund kommend, dachte ich nicht an die Existenz von Themenansichten. Die Einstellung ClearColor war tatsächlich der fehlende Teil. – TheBlueNotebook

Verwandte Themen