Witam
Piszę, ponieważ mam problem ze scrollowaniem i zapisywaniem obrazu w SWT. Jak to przedstawia kod poniżej, na kanwe wczytuje obraz. Nastepnie maluje na nim punkty.
Pierwszy problem jest taki , że jak rusze scrollem to punkty odpowiednia rowniez zmieniają swoją pozycje. Tak jakby ich początek układu współrzednych (0,0) zmieniał sie odpowiednio wraz z poruszaniem scrollami lewo-prawo. Ale to dzieje sie pozniej, najpierw po poruszeniu scrolla, obraz mi sie rozmazuje, a jak delikatnie rusze oknem, dopeiro wszystko sie przestawia. Te rozmazywanie to pewnie wina tej zmiany miejsc punktow, program nie wie jak odmalowac czy cos...;|
Drugi problem to taki, ze jak zapisuje to, to zapisuje mi sie znowu ta surowa bitmapa która wczytalem bez punktów. Pytanie jest, czy da sie to zapisac jakby razem i czy da sie też zapisywac np tylko obraz, lub tylko punkty w formie obrazu?
Fragment metody:
private void wyswietl_obrazEnd (BufferedImage obraz,konwertowanie kon,final LinkedList<Point> lista)
{
//Display display2 = new Display();
final Shell shell2 = new Shell(display);
shell2.setLayout(new FillLayout());
shell2.setSize(1000,1100);
shell2.setText("Obraz po ekstrakcji cech");
final Point origin = new Point(0,0);
final ImageData dataEnd = kon.convertToSWT(obraz);
final Image obrazEnd = new Image(display,dataEnd);
//final org.eclipse.swt.graphics.Color red = display.getSystemColor(SWT.COLOR_RED);
Menu meni = new Menu(shell2,SWT.BAR);
shell2.setMenuBar(meni);
MenuItem item = new MenuItem(meni,SWT.CASCADE);
item.setText("Plik");
Menu wysun = new Menu(shell2,SWT.DROP_DOWN);
item.setMenu(wysun);
MenuItem zapisz_plik = new MenuItem(wysun,SWT.PUSH);
zapisz_plik.setText("Zapisz zdjęcie");
MenuItem tworz_wektor = new MenuItem(wysun,SWT.PUSH);
tworz_wektor.setText("Twórz Wektor Cech");
MenuItem normalizuj = new MenuItem(wysun,SWT.PUSH);
normalizuj.setText("Normalizuj");
final Canvas canvas2 = new Canvas (shell2, SWT.NO_BACKGROUND |
SWT.NO_REDRAW_RESIZE | SWT.V_SCROLL | SWT.H_SCROLL);
canvas2.setSize(dataEnd.width-20, dataEnd.height-20);
final Image image=obrazEnd;
final ScrollBar hBar2 = canvas2.getHorizontalBar ();
hBar2.addListener (SWT.Selection, new Listener () {
public void handleEvent (Event e) {
int hSelection = hBar2.getSelection ();
int destX = -hSelection - origin.x;
Rectangle rect = image.getBounds ();
canvas2.scroll (destX, 0, 0, 0, rect.width, rect.height, false);
origin.x = -hSelection;
}
});
final ScrollBar vBar2 = canvas2.getVerticalBar ();
vBar2.addListener (SWT.Selection, new Listener () {
public void handleEvent (Event e) {
int vSelection = vBar2.getSelection ();
int destY = -vSelection - origin.y;
Rectangle rect = image.getBounds ();
canvas2.scroll (0, destY, 0, 0, rect.width, rect.height, false);
origin.y = -vSelection;
}
});
canvas2.addListener (SWT.Resize, new Listener () {
public void handleEvent (Event e) {
Rectangle rect = image.getBounds ();
Rectangle client = canvas2.getClientArea ();
hBar2.setMaximum (rect.width);
vBar2.setMaximum (rect.height);
hBar2.setThumb (Math.min (rect.width, client.width));
vBar2.setThumb (Math.min (rect.height, client.height));
int hPage = rect.width - client.width;
int vPage = rect.height - client.height;
int hSelection = hBar2.getSelection ();
int vSelection = vBar2.getSelection ();
if (hSelection >= hPage) {
if (hPage <= 0) hSelection = 0;
origin.x = -hSelection;
}
if (vSelection >= vPage) {
if (vPage <= 0) vSelection = 0;
origin.y = -vSelection;
}
canvas2.redraw ();
}
});
canvas2.addListener (SWT.Paint, new Listener () {
public void handleEvent (Event e) {
GC gc = e.gc;
gc.drawImage (obrazEnd, origin.x, origin.y);
//Color nonen = display.getSystemColor(SWT.COLOR_WHITE);
//gc.setBackground(nonen);
if(lista!=null)
{
Color blue = display.getSystemColor(SWT.COLOR_BLUE);
Color none = display.getSystemColor(SWT.COLOR_WHITE);
Color green = display.getSystemColor(SWT.COLOR_GREEN);
for(int i=0;i<lista.size();i++)
{
gc.setBackground(blue);
gc.fillRectangle(lista.get(i).x , lista.get(i).y, 8, 8);
gc.setBackground(none);
gc.drawString((i+1)+"",lista.get(i).x+5,lista.get(i).y+5);
}
/* if(lista!=null)
try
{
gc.setForeground(green);
int maks=lista.size();
int a=0;
while(a<maks)
{
gc.drawLine(lista.get(a).x, lista.get(a).y,lista.get(a+1).x, lista.get(a+1).y);
a++;
}
}catch(Exception e5)
{
System.out.println(e5.getMessage());
}*/
}
Rectangle rect = obrazEnd.getBounds ();
Rectangle client = canvas2.getClientArea ();
int marginWidth = client.width - rect.width;
if (marginWidth > 0) {
gc.fillRectangle (rect.width, 0, marginWidth, client.height);
}
int marginHeight = client.height - rect.height;
if (marginHeight > 0) {
gc.fillRectangle (0, rect.height, client.width, marginHeight);
}
}
});
zapisz_plik.addListener(SWT.Selection, new Listener()
{
public void handleEvent(Event e)
{
String[] filtr = {"BMP (*.bmp)","*.jpg","*.png"};
FileDialog zapisz = new FileDialog(shell2,SWT.SAVE);
zapisz.setText("Zapisz");
zapisz.setFilterPath("D:/");
zapisz.setFilterExtensions(filtr);
String zapisany_plik = zapisz.open();
System.out.println("Plik zapisano "+zapisany_plik);
if(zapisany_plik==null)
return;
//int typ_pliku = determineFileType(zapisany_plik);
try{
ImageLoader loader = new ImageLoader();
ImageData dataEnd = obrazEnd.getImageData();
loader.data = new ImageData[]{dataEnd};
loader.save(zapisany_plik,SWT.IMAGE_BMP);
}
catch(Exception e1)
{
System.out.println(e1.getMessage());
}
}
});
shell2.open ();
while (!shell2.isDisposed ()) {
if (!display.readAndDispatch ()) display.sleep ();
}
//obrazEnd.dispose();
// display.dispose ();
}
Będę naprawdę wdzięczny za uwagi i pomoc;)
Pozdrawiam;)