代码之家  ›  专栏  ›  技术社区  ›  Andreas

Java swt图像插值

  •  1
  • Andreas  · 技术社区  · 8 年前

    所以我的问题是:如何关闭图像插值?

    干杯,安德烈亚斯

    编辑以澄清:有一个滚动条,用于控制执行以下代码的显示图像的大小。

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

    编辑2:我认为这是实际的绘图例程:

    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);  
            }
    
        }
    
    }
    
    1 回复  |  直到 8 年前
        1
  •  1
  •   greg-449    8 年前

    呼叫

    event.gc.setInterpolation(SWT.NONE);
    

    event.gc.drawImage 关闭图像插值。

    推荐文章