Transparenz zu nicht multipliziertem RGB + Alpha

16

Ich habe eine transparente Ebene in Photoshop CS5 (also wird sie höchstwahrscheinlich intern als nicht multiplizierte RGB-Komponente plus Alpha-Komponente pro Pixel gespeichert).

Jetzt möchte ich dies in eine undurchsichtige Ebene (nur nicht vervielfachtes RGB) + eine Alphamaske umwandeln. Das Ergebnis sollte dem Original entsprechen.

Ich kann nicht einfach die transparente Ebene mit Schwarz unterlegen, die Auswahl daraus als Maske nehmen und die Ebenen zusammenführen, da dies dazu führen würde, dass das Alpha in den RGB-Werten vormultipliziert wird.

Ich hoffe, Sie verstehen das Problem und können mir eine Lösung dafür geben.

Als alternative Erklärung: Ich möchte den REVERSE-Prozess wie folgt durchführen:

  1. erstelle eine neue Ebene und füge sie in ein beliebiges Bild ein
  2. Erstellen Sie eine Maske mit einem Weiß-Schwarz-Verlauf
  3. wende die Ebenenmaske an

Erklärung Bilder:

Zustand A: Bildbeschreibung hier eingeben

Zustand B: Bildbeschreibung hier eingeben


WICHTIG: Die Ebene ist nur für dieses Beispiel vollständig konstant rot - aber Sie können sich jedes beliebige Bild anstelle des konstanten Rotes vorstellen. Also - um von Zustand A nach Zustand B zu gelangen, muss man einfach die Ebenenmaske anwenden.

Ich möchte wissen, wie ich von Staat B nach Staat A komme.

Matte
quelle
Ich frage mich, ob eine Art Maskierungs-Plug-In hier Abhilfe schaffen könnte. Die Opazitätsinformationen existieren, es ist nur eine Frage, wie man sie erhält. Das Abrufen von Informationen auf Pixelebene ist in den Skript-APIs nicht vorhanden (zumindest in Applescript, aber alle unterstützten Sprachen scheinen mit dem übereinzustimmen, was ich gesehen habe).
Philip Regan

Antworten:

6

Ich verstehe deinen Schmerz vollkommen. Hier ist meine Lösung :)
Alpha als Maskenaktion extrahieren
Hier ist, was es tut:

Bildbeschreibung hier eingeben Edit:
Bildbeschreibung hier eingeben
Ich hoffe das hilft :)

Miro
quelle
Whoa, cool .. Sicher erfordert die Verwendung von Aktionen, um einen erträglichen Prozess zu machen.
Ars Magika
5

Falsch! Alles falsch!

Ich habe mich und Sie selbst getäuscht: Was ich geschaffen habe, ist in der Tat ein vorvervielfachtes Bild - nicht mit Schwarz, sondern mit Weiß vorvervielfacht. Ich überlasse es anderen, darauf aufzubauen.


Ich habe es so geschafft:

  1. Extrahieren Sie echte RGBA-Kanäle aus dem Bild
  2. Verwenden Sie sie, um ein neues Image zu erstellen

Und so habe ich es gemacht:

Testbild

Dies ist das Testbild, das ich verwendet habe. Die Kanalansicht in PS sieht folgendermaßen aus:

Kanäle

Durch Auswahl der einzelnen Kanäle habe ich sie in einzelne Ebenen kopiert und sie dann mit einem weißen Hintergrund abgeflacht, um eine Schwarzweißkarte zu erhalten, wie hier gezeigt:

BW-Karte

Ich habe auch die Transparenz des Originalbildes in eine Ebene extrahiert, indem ich auf das Ebenen-Miniaturbild geklickt und eine neue Ebene mit der Auswahl gefüllt habe.

Dann habe ich ein neues Bild mit den gleichen Abmessungen und ohne Transparenz erstellt. Anschließend habe ich die erstellten RGB-Ebenen in die entsprechenden Kanäle des neuen Bildes eingefügt:

Kanäle des neuen Bildes

Im letzten Schritt habe ich die Ebene durch Doppelklicken "abgeflacht" und aus der Alpha-Ebene des Originalbildes eine Ebenenmaske erstellt.

Ebenenmaske


Wie oben erwähnt, ergibt dies kein nicht vormultipliziertes Bild, da mein Beispiel so aussehen müsste, um nicht vormultipliziert zu werden:

korrekte Version

Ist jemand schlauer als ich und kann das schaffen? Ich gehe davon aus, dass dies ohne erweitertes pixelbasiertes Scripting in Photoshop nicht möglich ist.

Florian Dobler
quelle
5

Ok - Ich habe einen einfachen PixelBender-Filter erstellt, der mit dem Photoshop-PixelBender-Plugin (http://labs.adobe.com/downloads/pixelbenderplugin.html) verwendet werden kann, um die Transparenz für eine Ebene zu entfernen. Hier ist es: http://neo.cycovery.com/removeTransparency.pbk

Matte
quelle
2

Basierend auf den gegebenen Antworten und Ihren Kommentaren lautet die kurze Antwort: Sie können nicht tun, was Sie wollen. Sobald Sie die Maske angewendet haben, wird die Ebene gerendert und die unsichtbaren Bilddaten werden verworfen.

BEARBEITEN:

Ich habe einige Beispiel-PNG-Dateien erstellt und sie dann mit PHP bearbeitet (Quellcode unten).

Wenn ich eine PNG-Datei mit zufälliger Transparenz erstelle und speichere, während die Ebene eine Maske hat, werden in den zu 100% durchsichtigen Bereichen (z. B. von einem Box-Tool) weiß angezeigt, ob die Alpha-Unterstützung aktiviert ist oder nicht. Farbverläufe, die zu 100% klar sind, werden bei deaktiviertem Alpha nicht angezeigt.

Wenn ich die Ebenenmaske (permanent) anwende und dann das PNG erstelle, liefert PHP das Originalbild, wenn Alpha deaktiviert ist.

Eine mögliche Lösung hierfür ist es, ein Softwarepaket zu finden, das Alpha-PNG nicht unterstützt, und es von dort aus erneut zu speichern. Was die Wiederherstellung der Originalmaske angeht, habe ich mir das noch nicht angesehen.

Beide Codebeispiele sind Proof-of-Concept und SLOW.

<?php

$im = imagecreatefrompng('./images/alphatest_nolayer.png');
$enable_alpha = 0;  //set to 0 to disable aplha

if ($enable_alpha) {
    imagealphablending($im, false);
    imagesavealpha($im, true);
}

header('Content-Type: image/png');
imagepng($im);

imagedestroy($im);

?>

Um das Alpha zu extrahieren (Anmerkung: PHP hat eine GD-Beschränkung von 128 Level Alpha anstatt 256), so dass etwas Präzision verloren geht. Das Alpha kann mit dem Ebenen-Werkzeug auf 256 gedehnt werden.)

<?php

$im = imagecreatefrompng('./images/alphatest_nolayer.png');
$w = imagesx($im);
$h = imagesy($im);

$om = imagecreatetruecolor($w,$h);

for ($x = 0; $x < $w; $x++) {
    for ($y = 0; $y < $h; $y++) {
        $rgb = imagecolorat($im, $x, $y);
        $colors = imagecolorsforindex($im,  $rgb);

        $orgb = imagecolorallocate($om,$colors['alpha'],$colors['alpha'],$colors['alpha']);
        imagesetpixel($om,$x,$y,$orgb);
    }
}

header('Content-Type: image/png');
imagepng($om);

imagedestroy($om);
imagedestroy($im);

?>
Horatio
quelle
aber die daten sind noch da. Dies ist der RGB-Teil der RGBA-Pixeldaten. Es muss eine Möglichkeit geben, es zu extrahieren
Mat
1
Warum stellen Sie keine reale Beispieldatei zur Verfügung? In Ihrer Frage zeigen Sie deutlich eine einzelne Ebene mit einer transparenten Fläche ohne Maske und ohne Angabe eines Alphakanals.
Horatio
.png hat eine vordefinierte Farbpalette für 100% transparentes Schwarz, die wahrscheinlich (von Photoshop) immer dann verwendet wird, wenn 100% Transparenz vorhanden ist, um Speicherplatz zu sparen.
Ars Magika
Ich bin nicht sicher, ob dies tatsächlich die Frage beantwortet - scheint spezifisch für die PNG-Verarbeitung zu sein.
e100
2

Ich habe herausgefunden, wie man es in GIMP macht. Es kann sein, dass es nicht PhotoShop ist, aber es wird zumindest das tun, was Sie verlangen. (Wie ich es trotzdem interpretiere;))

  • Öffnen Sie das Bild in GIMP.
  • Klicken Sie mit der rechten Maustaste auf die Ebene in der Schichten - Box
  • Wählen Sie im Kontextmenü "Ebenenmaske hinzufügen "
  • Wählen Sie im folgenden Menü " Transfer Layer Alpha Channel " und klicken Sie auf " Hinzufügen "

An dieser Stelle verbleibt ein Bild mit einer Alphakanalmaske.

Sie können noch einen Schritt weiter gehen:

  • Rechtsklicke auf die Ebenenmaske und wähle " Ebenenmaske löschen "
  • Sie haben jetzt das Bild ohne Alphamaske.

Es gibt auch einen YouTube-Clip dazu.

Roberto De Vivo
quelle
Roberto: Ja, du hast die Antwort gefunden. Genau das wollen wir und es ist kostenlos !! Ich werde das von Ihnen gepostete Video als Antwort für jede andere Person verwenden, die das Gleiche fragt (bisher nur durch unbegrenztes Duplizieren der Ebene in PS möglich)
1

Dies scheint irrsinnig komplex. Wenn ich die ursprüngliche Frage und ihre verschiedenen Erläuterungen richtig verstehe, besteht das Problem darin, ein beliebiges Bild, das Transparenz enthält, vollständig undurchsichtig zu machen und dann die ursprünglichen Alphawerte als Maske anzuwenden, um das ursprüngliche Erscheinungsbild wiederherzustellen.

Wenn dies die Frage ist, ist dies eine sehr einfache, wenn auch etwas mühsame Antwort.

  1. Kopiere die Ebene 10 mal. Die Transparenz wird im zusammengesetzten Bild "ausgefüllt".

  2. Füge alle Kopien zusammen (aber NICHT die Originalebene , die du für die letzten Schritte benötigst).

  3. Wiederholen Sie die Schritte 1 und 2 mit der zusammengeführten Ebene und wiederholen Sie sie dann. Zu diesem Zeitpunkt sind alle Pixel, die zu weniger als 100% transparent waren, jetzt zu 100% undurchsichtig (wenn es einige Streuungen gibt, wiederholen Sie den Vorgang, bis keine mehr vorhanden sind). Das sind so viele Bildinformationen, wie es möglich ist, wiederherzustellen.

  4. Strg / Befehlstaste-Klicken Sie auf die ursprüngliche Ebenenminiatur , um die Transparenz zu laden.

  5. Klicken Sie mit der neuen, undurchsichtigen Ebene auf das Ebenenmasken-Symbol im Ebenenbedienfeld.

Alan Gilbertson
quelle
0

Ok, das ist eigentlich ziemlich einfach (man muss die marschierenden Ameisen ignorieren)

Erstelle eine neue Ebene und fülle sie vollständig mit der Farbe, die du verwendest (wenn du sie abtast, nimm sie vom Totpunkt des ersten Bildes)

Bildbeschreibung hier eingeben

Bildbeschreibung hier eingeben

Dann nimm dein erstes Bild und drücke STRG + Klick auf die Ebenenminiatur. Du solltest eine Version davon sehen: Bildbeschreibung hier eingeben

Wie ich bereits sagte: Ignorieren Sie die marschierenden Ameisen, das Auslaufen wird in CS5 automatisch wirksam.

Stellen Sie dann sicher, dass Sie die gefüllte Ebene ausgewählt haben, und klicken Sie auf die Maskenschaltfläche:

Bildbeschreibung hier eingeben

Dann verstecke einfach die unterste Ebene und du solltest fertig sein, mit dem genauen Effekt, den du suchst :)

Bildbeschreibung hier eingeben

Auf diese Weise können Sie eine angewendete Maske in CS5 zurückentwickeln. Die Auswahlfunktion für CS5-Ebenen ist ziemlich fortgeschritten, daher ignorieren Sie die marschierenden Ameisen die meiste Zeit nur, da sie keine Federn korrekt anzeigen, die bei der Auswahl auftreten werden :)

Hoffe es klappt für dich.

Kyle
quelle
danke für deine antwort, aber das ist nicht das, wonach ich suche - wie erklärt ist das konstante rot nur für dieses beispiel! Es kann JEDES Bild sein (nicht nur eine konstante Füllfarbe) - und natürlich habe ich nicht das ursprüngliche undurchsichtige Bild zur Verfügung
Mat
Nun, Sie sollten Ihr Bild in Ihrer Frage posten. Wenn Sie eine konstante Füllung veröffentlichen, antworten wir auf der Grundlage einer konstanten Füllung. Versuchen Sie jedoch, die hier beschriebenen Techniken zu verwenden. Die Auswahl von CS5 ist sehr fortgeschritten. Dies kann Sie überraschen. Es hat mir getan.
Kyle
natürlich kenne ich diese auswahltechniken! Das fragliche Problem ist, wie auf den RGB-Teil einer transparenten Ebene zugegriffen werden kann
Mat
Über den Ebenen befinden sich drei Registerkarten. Klicken Sie auf Kanäle. Dort hast du Rot, Grün, Blau und Ebenenmaske. Vielleicht ist es das, wonach Sie suchen?
Kyle
Eine Ebene wie in neo.cycovery.com/alpha_prob2.jpg zeigt jedoch keinen Alpha-Kanal an - stattdessen werden nur die RG- und B-Kanäle mit bereits angewendeter Transparenz angezeigt
Mat
0

Was Sie tun möchten, erledigen Sie ganz einfach mit einem Plugin wie dem Photofreebies-Plugin "Remove Transparency". Zuerst klicken Sie mit gedrückter Befehlstaste auf die Ebene, um die transparenten Pixel auszuwählen, und speichern dann diese Transparenzinformationen in einem neuen Kanal, um sie zu behalten. Dann wenden Sie den Filter "Transparenz entfernen" an und Sie sehen, dass die "versteckten" Pixel in Ihrer Ebene undurchsichtig werden (ziemlich interessant, um zu sehen, wie Photoshop Ihre 100% transparenten Pixel BTW gestaltet). Ich wünsche mir wirklich seit Jahren, dass dies nativ in Photoshop eingebaut wurde, aber leider, denke ich, zu fortgeschritten.

Leider kann ich keine Photoshop CS6-kompatible Version eines solchen Plugins für den Mac finden. GraphicConverter kann das auch (Remove Alpha channel).

zmippie
quelle
0

Hier ist die Antwort:

  1. Erstelle eine Ebene mit dem Material, das du im Bild haben willst.

  2. Treffen Sie eine Auswahl für den gewünschten Alpha-Kanal.

  3. Machen Sie die Auswahl zu einer "Ebenenmaske" für die Bildebene.

  4. Klicken Sie mit der rechten Maustaste auf die Ebenenmaske und wählen Sie "Ebenenmaske anwenden".

Nun beginnt die Magie:

  1. Gehen Sie zu "Ebene" und unten zu "Mattierung" und wählen Sie "Schwarze Matte entfernen".

Bitte schön!

Stromrechnung
quelle