Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

Hallo,

wie kann ich ein BufferedImage mit 50%iger Transparenz auf ein zweites zeichnen?

Im Photoshop geht das relativ simpel...

Problem:

Es gibt die Möglichkeit, in meinem emulierten Computer jeweils 2 Bilder mit 25hz anzeigen zu lassen (Interlace)

Diese 2 flimmern dann natürlich arg, so dass ich sie zu einem Bild zusammenfassen möchte und dann dieses eine Bild jedes 2te mal updaten lassen möchte.

Dafür möchte ich das gepufferte Image halt mit 50% Transparenz auf das aktuelle zeichnen.

Erwünschtes Resultat:

op.png

Gruss,

Markus

  • Autor
Hi,

Das ist das falsche Forum! Schau mal unter "Fachliche Foren"!

Mit freundlichen Grüßen

mustiwebp

Huch! Aber hier ist doch das Java-Forum...??!?

Wie dem auch sei,

Meine Methode sieht bislang so aus:

  public void setAlpha(int alpha) {

      for (int x=0;x<image2.getWidth();x++)

          for (int y=0;y<image2.getHeight();y++)

              image2.setRGB(x, y, (((

                      image2.getRGB(x, y)&0x00ffffff)

                      )|alpha<<24));

  }


// [snip]


           if (interlace){

              if (paint){

                  setAlpha(128);

                  image.getGraphics().drawImage(image2, 0,0,image.getWidth(), image.getHeight(), this);

                  output.getGraphics().drawImage(image, 0,0,image.getWidth(), image.getHeight(), this);

                  paint = false;

              } else {

                  image2.getGraphics().drawImage(image, 0,0,image.getWidth(), image.getHeight(), this);

                  paint = true;

              }

              image.getGraphics().drawImage(output, 0,0,image.getWidth(), image.getHeight(), this);

           }

Diese Methode ist allerdings relativ langsam.

Ich benötige 25 Frames pro Sekunde, was diese Routine nicht immer schafft.

Gibt es eine Möglichkeit, dieses zu optimieren?

Hi,

Sorry, du hättest aber sagen müssen, dass es ein Java-Problem ist! So wie du dein Problem beschrieben hast, hörte es sich ncht nach einer Programmiersprache an!

Mit freundlichen Grüßen

mustiwebp

  • Autor
Hi,

Sorry, du hättest aber sagen müssen, dass es ein Java-Problem ist! So wie du dein Problem beschrieben hast, hörte es sich ncht nach einer Programmiersprache an!

Mit freundlichen Grüßen

mustiwebp

Hehehehehe macht ja nichts.... Kann passieren... *ups*

Ich dachte, da ich BufferedImage schrieb, sei Java klar.. :upps

Hier mal die aktuelle Bildschirmausgabe auf meinem System (3ghz):

http://cpc-live.com/deinterlace3.png

Wie man sehen kann, ist das Display aber leider bei ca. 15-16 Frames pro Sekunde zu langsam... (Zum Screenshots schiessen reicht das zwar, könnte aber schneller sein)

  • Autor

Habe es hinbekommen!

Nun habe ich sogar trotzdem satte 50 frames pro Sekunde!!!

Wie?

Code:

  protected void paintImage(Graphics g) {

      Graphics2D g2 = (Graphics2D)g;


// [snip]


           if (interlace){

              if (paint){

                  LaceImageA.getGraphics().drawImage(image, 0,0,image.getWidth(), image.getHeight(), this);

                  paint = false;

              } else {

                  LaceImageB.getGraphics().drawImage(image, 0,0,image.getWidth(), image.getHeight(), this);

                  paint = true;

              }

           }


// [snip]


              if (interlace){

                  g2.drawImage(LaceImageA,imageRect.x,imageRect.y,imageRect.width,imageRect.height,null);

                  g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.50f));

                  g2.drawImage(LaceImageB,imageRect.x,imageRect.y,imageRect.width,imageRect.height,null);

                  g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 1.0f));

              }

              else

                  g2.drawImage(image,imageRect.x,imageRect.y,imageRect.width,imageRect.height,null);


//.....

  • Autor

Auf dem (von mir hier in Java emulierten) Homecomputer gibt es die Möglichkeit, per "Page-flipping" interlaced Grafiken darzustellen.

Diese "Flackern" bei 25hz allerdings arg, und da ein heutiger Monitor keine 50hz mehr darstellen kann, verschiebt sich dann sogar im Emulator noch dieses Flackern um einige Zeilen.

Durch meine Methode geht dieses Flackern auf nahezu 0 (+- ein paar seltene Male, wenn der Resync nicht 100% korrekt ist) aber man sieht dennoch beide Bilder indem das eine mit 50% Transparenz auf das zweite gezeichnet wird.

deinterlace.gif

Wie man hier sehen kann, flackert das GIF anfangs zwischen 2 Bildern (Was im Computer 50x pro Sekunde passiert)

Aktiviere ich nun meine De-Interlace Funktion, steht das Bild stabil.

Um mich da auch mal einzumischen,

das war schon das richtige Forum, und jeder der hier mehr als einmal im Jahr reinschaut der dürfte deine Threads ja auch mittlerweile kennen und weiß worum es geht.

War also meiner Meinung nach nichts falsch gemacht.

  • Autor
Um mich da auch mal einzumischen,

das war schon das richtige Forum, und jeder der hier mehr als einmal im Jahr reinschaut der dürfte deine Threads ja auch mittlerweile kennen und weiß worum es geht.

War also meiner Meinung nach nichts falsch gemacht.

Menno, ich will aber AUCH mal was falsch machen...

(Apropos falsch machen: JavaCPC Desktop available as BETA! Mal eine BETA meines Emulators zum testen, macht hauptsächlich nur Sinn für Leute, die den CPC kennen... aber eventuell auch mal so ganz interessant)

Frohe Weihnachten an Alle!

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.