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;)