Wie kopiere ich ein Teil von einem Bild zum anderen?
Ich kopieren möchten Teil von einem Bild in ein anderes kleineres: in anderen Worten, eine Kopie subrectangle.
Ich habe eine Graphics2D Objekt für die Quelle, ich kann jemanden für das Ziel, und ich weiß über targetGraphics2D.drawImage(Image img,....) aber wie Schaffe ich es, dass img aus der sourceGraphics2D?
Antwort (pro aioobe): Die Quelle muss eine Bild eher als eine Graphics2D.
Bild.subImage() wird die Methode für das erhalten die für Sie relevanten Teil der Quelle.
Werden Sie sich bewusst, dass subImage() kopiert nicht die zugrunde liegenden Bilddaten, die zumindest mit BufferedImage. Also, wenn Sie ziehen auf dem Bild, die durch subImage (), die Sie auch ändern, das original, während mit Ziel.createGraphics().drawImage(Image img, ...) man eigentlich wirklich eine Kopie machen.
InformationsquelleAutor Joshua Fox | 2010-12-06
Du musst angemeldet sein, um einen Kommentar abzugeben.
Zunächst einige Hinweise in Bezug auf Andreas_D Antwort unten:
Sein code basiert auf
sun.java2d.SunGraphics2D
was ist ein interner und nicht dokumentierte OpenJDK-Klasse. Dies bedeutet, dass, während es möglicherweise kompilieren und ausführen auf Ihrem computer, esvielleichtwird wahrscheinlich brechen, wenn Sie verteilen den code für andere Leute. Für eine ausführliche Diskussion, siehe den offizielles statement in Bezug auf diese.Der code stützt sich auf die Reflexion zu hebeln die interne Klasse geöffnet, das ist ein code smell es sich von selbst.
Alles in allem, sein Ansatz ist ein Beispiel von außerordentlich schlechte Praxis (sowohl wenn es um Programmierstil und hilft, fellow Programmierer die Nutzung der API korrekt)
Ich vermute, dass Sie falsch verstanden, die Verantwortung der
Graphics2D
Klasse.Verwenden Sie die
Graphics2D
Klasse zu ziehen, die auf etwas. Es ist in der Lage Zeichnung auf einemBufferedImage
(wenn man das graphics-Objekt aus einer gepufferten Bild), der Bildschirm (wenn man es als argument, um IhrepaintComponent
- Methode) oder auch ein Drucker. Also in anderen Worten, gegeben einGraphics2D
Objekte, die es möglicherweise gar nicht für ein Bild!So, wie Sie wahrscheinlich verstehen, die
Graphics2D
- API keine Methoden bereitstellen, die für immer halten der zugrunde liegenden Bild. (Eine solche Methode würde keinen Sinn machen, das graphics-Objekt kann übergeben werden, die auf Linien und text gezeichnet wird, auf einem Drucker!)Ist, ein Einzelbild, die Sie benötigen, um die zugrunde liegenden Bild, das die angegebene graphics-Objekt zeichnet auf.
Ja. So ähnlich 🙂
Ah c ' Mon, es gibt immer einen Weg! (Und in diesem Fall: der "Bleistift", erinnert sich, was er gezeichnet hat 😉 )
InformationsquelleAutor aioobe
Als Aioobe sagte, du bist nicht gehen, um das Bild aus dem Graphics2D allein. Aber wenn Ihr sourceGraphics2D kommt eine Swing-Komponente, die Sie könnten versuchen, Aufruf der paint-Methoden mit Ihrem eigenen Graphics2D-Instanz. Von dort können Sie kopieren Sie die interessanten sub-region.
Dies ist ein hack, aber es sollte funktionieren, vorausgesetzt, Sie sind mit Swing-Objekte.
InformationsquelleAutor Tansir1
Kurze Antwort: ja, Sie können
Einem Graphics2D-Objekt, das erstellt wurde, auf einem buffered Image weiß das Bild aber nicht bereit ist, hand an Sie zurück. Wenn es Ihnen nichts ausmacht mit Reflexion, Sie können stehlen Sie zurück (Reflexion). Der folgende code veranschaulicht die Vorgehensweise:
Hinweis: dies ist abhängig von Sun - /Oracle-Klassen und funktionieren möglicherweise nicht mit allen Java VMs. Zumindest zeigt es ein Ansatz, und Sie können überprüfen, die tatsächlichen Klassen, um die Felder.
sun.*
Paket und Reflexion in der gleichen Antwort.. hehe 😉 Man sollte wohl mindestens die Liste der Umstände, unter denen dieGraphics2D
Objekt tatsächlich ist einSunGraphics2D
? Lesen Sie Warum Sollten Entwickler Nicht Schreiben Programme, Rufen Sie 'sun' - Pakete.Hey, es ist ein hack und ich bereits Hinzugefügt, ein allgemeiner Hinweis für diese Einschränkungen. Sie sagte tritt nicht funktioniert und ich nur antwortete: Es ist möglich. Nicht tragbar, aber nicht unmöglich.
InformationsquelleAutor Andreas_D
Wenn ich verstehe es Recht, W3Schools hat code, um einen Teil des Bildes auf eine Leinwand. Wenn Sie es brauchen, wie ein anderes Bild, du könntest es aus, canvas.
Habe ich ein PNG-Bild 20 hoch und 200 breit, verfügt über 10 "Zellen" oder "frames" - die ich für animation und verwenden Sie die Methode unten:
InformationsquelleAutor kumado