I am using a java program that I haven't written myself, but I do have all the source code. The program consists of SWT widgets controlling a camera and displaying the images (it's much more complicated, but that's the relevant part). So far, everything worked well, but from a couple of months ago when we upgraded to maven (and probably some other upgrades I'm unaware of) it started interpolating the image pixels when zooming in. This is very annoying as the whole application is depending on seeing the individual pixels. Before the upgrades, when increasing the size of the pixels over the native screen resolution, it displayed large monochromatic squares, which is what I want. Now it is just blurring everything out.
So my question is: how do I turn off the image interpolation?
Cheers, Andreas
Edit for clarification: There is a scroll bar that controls the size of the displayed image that executes the following code.
void zoomScaleEvent(Event event, boolean centreOnMouse){
setScale(selToScale(infoPanel.swtZoomScale.getSelection())); //force scale in range
int newScaleSel = infoPanel.swtZoomScale.getSelection();
Point dOrigin = swtImgScrollComp.getOrigin(); //display units
Rectangle clientArea = swtImgScrollComp.getClientArea();
// position in display coords of point to zoom in on
int dispZX, dispZY;
if(centreOnMouse){
dispZX = event.x;
dispZY = event.y;
}else{
dispZX = clientArea.width / 2;
dispZY = clientArea.height / 2;
}
//position in image of that point (caled using the old scale)
double lastScale = selToScale(lastScaleSel);
double imgZX = (dispZX + dOrigin.x) / lastScale;
double imgZY = (dispZY + dOrigin.y) / lastScale;
//origin of swtScrollComp of that point required to holding that point in the /same place/.
double newScale = selToScale(newScaleSel);
double newDispOX = imgZX * newScale - dispZX;
double newDispOY = imgZY * newScale - dispZY;
swtImgScrollComp.setOrigin((int)newDispOX, (int)newDispOY);
Img img = getSelectedImageFromConnectedSource();
if(img != null){
double scale[] = getScale();
swtImageCanvas.setSize(
(int)(img.getWidth()*scale[0]),
(int)(img.getHeight()*scale[1]));
}
lastScaleSel = newScaleSel;
swtImageCanvas.redraw();
}
Edit 2: I think here is the actual drawing routine:
private void canvasPaintEvent(PaintEvent event){
Rectangle clientArea = swtImageCanvas.getClientArea();
Img image = getSelectedImageFromConnectedSource();
if(image != null && swtCurImage != null){
double scale[] = getScale();
int imgX0 = (int)((double)event.x / scale[0]);
int imgY0 = (int)((double)event.y / scale[1]);
int imgW = (int)((double)event.width / scale[0]) + 2;
int imgH = (int)((double)event.height / scale[1]) + 2;
if((imgX0 + imgW) >= image.getWidth()){
imgW = image.getWidth() - imgX0;
}
if((imgY0 + imgH) >= image.getHeight()){
imgH = image.getHeight() - imgY0;
}
try{
event.gc.drawImage(swtCurImage, imgX0, imgY0, imgW, imgH,
(int)(imgX0*scale[0]),
(int)(imgY0*scale[1]),
(int)(imgW*scale[0]),
(int)(imgH*scale[1]));
}catch(IllegalArgumentException e){
System.out.println("DRAW FAILED: " + scale + "\t" + imgX0 +", "+ imgY0+", "+ imgW+", "+ imgH +"\t-->\t" +
event.x+", "+ event.y+", "+ event.width+", "+ event.height);
}
event.gc.setForeground(swtImageCanvas.getDisplay().getSystemColor(SWT.COLOR_BLACK));
if(selectStartTime >= 0){
event.gc.drawRectangle(
(int)(selX0 * scale[0]), (int)(selY0 * scale[1]),
(int)(selW * scale[0]), (int)(selH * scale[1]));
}else{
event.gc.drawLine(0, (int)(posY * scale[1]), clientArea.width, (int)(posY * scale[1]));
event.gc.drawLine((int)(posX * scale[0]), 0, (int)(posX * scale[0]), clientArea.height);
}
for(ImagePipeController sinkController : sinkControllers.values())
if(sinkController instanceof SWTControllerInfoDraw)
((SWTControllerInfoDraw)sinkController).drawOnImage(event.gc, scale, image.getWidth(), image.getHeight(), false);
if(sourceControl != null && sourceControl instanceof SWTControllerInfoDraw){
((SWTControllerInfoDraw)sourceControl).drawOnImage(event.gc, scale, image.getWidth(), image.getHeight(), true);
}
}else{
event.gc.fillRectangle(clientArea);
if(image == null){
event.gc.drawText("null image", 0, 0);
}else if(image.isDestroyed()){
event.gc.drawText("Image Destroyed", 0, 0);
}else{
event.gc.drawText("Image OK but no swtCurImage!?!", 0, 0);
}
}
}
Call
event.gc.setInterpolation(SWT.NONE);
before the event.gc.drawImage
to turn off image interpolation.