Portal > Foren > Java > Desktop-Applikationen und Grafik > Bild Komponent - Bild zurecht schneiden
Antwort
 
Themen-Optionen Thema durchsuchen
Alt 29.12.2005, 16:17 Nach oben    #1
Benutzer
 
Registriert seit: 13.08.2005
Beiträge: 67
Standard Bild Komponent - Bild zurecht schneiden

Hi,

gibt es eine einfache Komponente mit der ich ein jpg Bild anzeigen kann und dann auf einfache Weise (Rahmen wie Bildverarbeitung) einen Ausschnitt wählen kann?

Möchte ein Bild laden und den Ausschnitt speichern.
Das Ändern der Größe dürfte weniger schwer werden. Aber wie realisiere ich den Rahmen über dem Bild den ich auch noch mit der Maus zurechtschieben kann?
Robinson ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 29.12.2005, 20:41 Nach oben    #2
Projektleiter
 
Registriert seit: 30.11.2005
Ort: Bottrop
Beiträge: 1.110
Standard

Ich glaub ich nenn jetzt nur ein paar Stichpunkte:
- JLabel + ImageIcon
- MouseListener + MouseMotionListener (mousePressed, mouseDragged, mouseReleased)
- JPanel + JLayeredPane

Das ausschneiden machst du dann mit der entsprechenden Graphik-API.
__________________
Patrick Gotthardts Weblog.
pago ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 30.12.2005, 10:47 Nach oben    #3
Benutzer
 
Registriert seit: 13.08.2005
Beiträge: 67
Standard

Soweit alles klar,
nur wo ich etwas kämpfe ist den Rahmen zeichnen und verschieben,.....

Will das Rad nicht neu erfinden und vermute dass es eine Kopmonente geben dürfte die ähnliches kann.

Einfach um mal einen ANsatz zu sehen der funktioniert.
Robinson ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 30.12.2005, 11:35 Nach oben    #4
Projektleiter
 
Registriert seit: 30.11.2005
Ort: Bottrop
Beiträge: 1.110
Standard

Es gibt keine Klasse, die das macht. Jedenfalls kenne ich keine. Hier hast du'n Beispiel (ungetestet
Code:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class DragPanel extends JPanel {
	private Rectangle rect;
	public DragPanel() {
		super(null);
		MouseHandler handler = new MouseHandler();
		addMouseListener(handler);
		addMouseMotionListener(handler);
		setOpaque(false);
	}
	
	public void paintComponent(Graphics g) {
		super.paintComponent(g);
		
		g.setColor(new Color(0xA09999DD));
		g.fillRect(rect);
		g.setColor(new Color(0xA0000052));
		g.drawRect(rect);
	}
	
	private class MouseHandler implements MouseListener, MouseMotionListener {
		private boolean dragRectangle = false;
		private Point lastPoint;
		
		public void mousePressed(MouseEvent e) {
			// there is already a rectangle
			if(rect != null) {
				// we want to drag this one
				if(rect.contains(e.getPoint())) {
					dragRectangle = true;
					return;
				// we're not going to drag it
				} else {
					dragRectangle = false;
					rect = null;
				}
			}
			// by now there won't be a rectangle
			lastPoint = e.getPoint();
			rect = new Rectangle(lastPoint.x, lastPoint.y, 1, 1);
			repaint();
		}
		
		public void mouseDragged(MouseEvent e) {
			Point currentPoint = e.getPoint();
			// dragging?
			if(dragRectangle) {
				rect.x += lastPoint.x - currentPoint.x;
				rect.y += lastPoint.y - currentPoint.y;
			} else {
				// Ok, we're changing its size
				rect.width = rect.x - currentPoint.x;
				rect.height = rect.y - currentPoint.y;
				
				// the above code might introduce troubles
				if(rect.width < 0) {
					rect.x = rect.x + rect.width;
					rect.width = -rect.width;
				}
				if(rect.height < 0) {
					rect.y = rect.y + rect.height;
					rect.height = -rect.height;
				}
			}
			
			// store point
			lastPoint = currentPoint;
			repaint();
		}
		
		// other methods
	}
}
__________________
Patrick Gotthardts Weblog.
pago ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 30.12.2005, 11:38 Nach oben    #5
Benutzer
 
Registriert seit: 13.08.2005
Beiträge: 67
Standard

Du entwickelst Dich zu meinem Helden!

Danke, werde es mal testen.

Wünsche an der Stelle allen einen guten Rutsch ins neue Jahr!
Robinson ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 31.12.2005, 13:53 Nach oben    #6
Benutzer
 
Registriert seit: 13.08.2005
Beiträge: 67
Standard

Morsche.

Ich habe deinen Code mal geteste und abgesehen von ein paar vertauschten Subtraktionen hat es geklappt.
War ja ungetestet.

SUPER SACHE!!!!!

Habe dann die Bildfunktionalität integriert und eine Funktion geschrieben mit der man einen Bildausschnitt erreichen kann.

Was mir nicht gefallen hat war dass dieses 1x1 Pixel Rechteck angezeigt wurde. Das habe ich deshalb ausgeklammert. (NULL darf es ja nicht sein).

Jetzt habe ich nur noch zwei Punkte an denen ich hänge:

1. (Da hatte ich einfach noch keine Zeit) Es ist unschön dass wenn ich die Auswahl verschieben will das er den aktuellen Punkt zur linken unteren Ecke macht. Das bekomme ich aber hin wenn ich die Zeit finde.

2. Wenn ich den Bildausschnitt mache und repaint aufrufe ist mein "image" nicht sichtbar. Wenn ich die Dimensionen width und height ausgebe so sind beide -1. Wird die Komponente dann erneut gezeichnet weil ich z.B. mit der Maus in das Panel klicke dann erscheint das Bild wie vorgesehen (richtig zugeschnitten). die Referenz "image" ist nicht null, das habe ich getestet.

Ich poste gleich noch einen Testframe, dann wird es wohl leichter nachzubauen.

Die DragPanel Klasse
PHP-Code:

import java
.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.image.CropImageFilter;
import java.awt.image.FilteredImageSource;
import java.awt.image.ImageFilter;

import javax.swing.ImageIcon;
import javax.swing.JPanel;

public class 
DragPanel extends JPanel {
    private static final 
long serialVersionUID 1L;
    private 
Rectangle rect;
    private 
Image image;
    private 
int image_left=0;
    private 
int image_top=0;
    
    public 
DragPanel() {
        
super(null);
        
MouseHandler handler = new MouseHandler();
        
addMouseListener(handler);
        
addMouseMotionListener(handler);
        
setOpaque(false);
    }
    
    public 
void setImageString path ) {
        
image = new ImageIcon(path).getImage();
        
repaint();
    }

    public 
void setImageImage image ) {
        
this.image=image;
        
repaint();
    }

    public 
void paintComponent(Graphics g) {
        
super.paintComponent(g);
        
g.setColorColor.white );
        
Dimension d getSize();
        
g.fillRect00d.widthd.height );
        if ( 
image != null ) {
            
image_left = (d.width-image.getWidth(null))/2;
            
image_top = (d.height-image.getHeight(null))/2;
            
g.drawImage(image,image_left,image_top,null);
        }
        if ((
rect!=null) && (rect.width>1) && (rect.height>1)) {
            
g.setColor(new Color(0xA0000052));
            
g.drawRect(rect.x,rect.y,rect.width,rect.height);
        }
    }
    
    private class 
MouseHandler implements MouseListenerMouseMotionListener {
        private 
boolean dragRectangle false;
        private 
Point lastPoint;
        
        public 
void mousePressed(MouseEvent e) {
            
// there is already a rectangle
            
if(rect != null) {
                
// we want to drag this one
                
if(rect.contains(e.getPoint())) {
                    
dragRectangle true;
                    return;
                
// we're not going to drag it
                
} else {
                    
dragRectangle false;
                    
rect null;
                }
            }
            
// by now there won't be a rectangle
            
lastPoint e.getPoint();
            
rect = new Rectangle(lastPoint.xlastPoint.y11);
            
repaint();
        }
        
        public 
void mouseDragged(MouseEvent e) {
            
Point currentPoint e.getPoint();
            
// dragging?
            
if(dragRectangle) {
                
rect.+= currentPoint.lastPoint.x;
                
rect.+= currentPoint.lastPoint.y;
            } else {
                
// Ok, we're changing its size
                
rect.width currentPoint.rect.x;
                
rect.height currentPoint.rect.y;
                
                
// the above code might introduce troubles
                
if(rect.width 0) {
                    
rect.rect.rect.width;
                    
rect.width = -rect.width;
                }
                if(
rect.height 0) {
                    
rect.rect.rect.height;
                    
rect.height = -rect.height;
                }
            }
            
// store point
            
lastPoint currentPoint;
            
repaint();
        }

        public 
void mouseClicked(MouseEvent arg0) {}
        public 
void mouseReleased(MouseEvent arg0) {}
        public 
void mouseEntered(MouseEvent arg0) {}
        public 
void mouseExited(MouseEvent arg0) {}
        public 
void mouseMoved(MouseEvent arg0) {}
    }

    public 
void chop() {
        
// Wenn der Rahmen auserhalb des Bildes beginnt abschneiden
        
if (rect.x<image_left) { rect.width-=image_left-rect.xrect.x=image_left; }
        if (
rect.y<image_top) { rect.height-=image_top-rect.yrect.y=image_top; }
        if (
rect.width+rect.x>image_left+image.getWidth(null)) rect.width-=rect.width+rect.x-(image_left+image.getWidth(null));
        if (
rect.height+rect.y>image_top+image.getHeight(null)) rect.height-=rect.height+rect.y-(image_top+image.getHeight(null));
        
        
// Kopie des ausgewählten Bereis erzeugen und als Image festlegen
        
ImageFilter cropFilter = new CropImageFilterrect.x-image_leftrect.y-image_toprect.widthrect.height );
        
setImage(createImage( new FilteredImageSource(image.getSource(),cropFilter)));

        
// Auswahl löschen
        
rect=null;
    }

Der Testframe

(verwendet JGoodsies Forms)

PHP-Code:


import java
.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;

import com.jgoodies.forms.layout.CellConstraints;
import com.jgoodies.forms.layout.FormLayout;

public class 
Test extends JFrame {

    private static final 
long serialVersionUID 1L;
    
    private static 
Test mainFrame null;
    
    private final 
DragPanel dp = new DragPanel(); 
    
    private 
Test() {
        
setTitle("Test");
        
setDefaultCloseOperation(EXIT_ON_CLOSE);
        
getContentPane().setLayout(new FormLayout("7px,f:m:g,7px","7px,f:m:g,7px,f:p,7px"));
        
setSize(1024,768);
        
CellConstraints cc = new CellConstraints();
        
        
dp.setImage("image.jpg");
        
add(dp,cc.xy(2,2));
        
JButton button = new JButton("chop");
        
button.addActionListener(new ActionListener() {
            public 
void actionPerformed(ActionEvent arg0) {
                
dp.chop();
            }
        });
        
add(button,cc.xy(2,4,"r,b"));
        
setVisible(true);
    }
    
    public static 
Test get() {
        if (
mainFrame==nullmainFrame=new Test();
        return 
mainFrame;
    }
    
    public static 
void main (String[] args) {
        
get();
    }
    
    

Robinson ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus


Alle Zeitangaben in WEZ +2. Es ist jetzt 00:33 Uhr.


Powered by vBulletin® Version 3.7.3 (Deutsch)
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44