Devilmarkus Geschrieben 23. Dezember 2009 Geschrieben 23. Dezember 2009 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: Gruss, Markus Zitieren
Devilmarkus Geschrieben 23. Dezember 2009 Autor Geschrieben 23. Dezember 2009 Achja, fast vergessen: Hier die 2 Ausgangsbilder in einem animierten PNG: (Firefox zur Animationsansicht verwenden, der IE kann das nicht darstellen) Zitieren
mustiwebp Geschrieben 24. Dezember 2009 Geschrieben 24. Dezember 2009 Hi, Das ist das falsche Forum! Schau mal unter "Fachliche Foren"! Mit freundlichen Grüßen mustiwebp Zitieren
Devilmarkus Geschrieben 24. Dezember 2009 Autor Geschrieben 24. Dezember 2009 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? Zitieren
mustiwebp Geschrieben 24. Dezember 2009 Geschrieben 24. Dezember 2009 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 Zitieren
Devilmarkus Geschrieben 24. Dezember 2009 Autor Geschrieben 24. Dezember 2009 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) Zitieren
Devilmarkus Geschrieben 24. Dezember 2009 Autor Geschrieben 24. Dezember 2009 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); //..... Zitieren
mustiwebp Geschrieben 24. Dezember 2009 Geschrieben 24. Dezember 2009 Hi, schön, aber wozu brauchtest du das? Das würde mich interessieren? Mit freundlichen Grüßen mustiwebp Zitieren
Devilmarkus Geschrieben 24. Dezember 2009 Autor Geschrieben 24. Dezember 2009 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. 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. Zitieren
Dragon8 Geschrieben 25. Dezember 2009 Geschrieben 25. Dezember 2009 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. Zitieren
Devilmarkus Geschrieben 25. Dezember 2009 Autor Geschrieben 25. Dezember 2009 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! Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.