有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java ArrayOutOfBoundsException与org。日食swt。图样图像数据。布利特

我已经从AndroidProjector反向设计了jar文件。我试图修改AndroidProjector以适应不同的屏幕大小,但我遇到了org的问题。日食swt。图样图像数据。blit()-ArrayOutOfBoundsException

该项目还使用this file (RawData)作为解决方案的一部分

我的Android投影仪呼叫:

private void getFramebufferHeader(SocketChannel paramSocketChannel)
throws IOException
 {
ByteBuffer localByteBuffer = ByteBuffer.wrap(new byte[4]);
readAdbChannel(paramSocketChannel, localByteBuffer);
localByteBuffer.rewind();
localByteBuffer.order(ByteOrder.LITTLE_ENDIAN);
int i = localByteBuffer.getInt();
int j = RawImage.getHeaderSize(i);
localByteBuffer = ByteBuffer.wrap(new byte[j * 4]);
readAdbChannel(paramSocketChannel, localByteBuffer);
localByteBuffer.rewind();
localByteBuffer.order(ByteOrder.LITTLE_ENDIAN);
this.mRawImage = new RawImage();
this.mRawImage.readHeader(i, localByteBuffer,percentSize);
}

ArrayOutOfBounds例外情况如下:

  private void updateDeviceImage(Shell paramShell, RawImage paramRawImage)
 {
   PaletteData localPaletteData = new PaletteData(paramRawImage.getRedMask(), paramRawImage.getGreenMask(), paramRawImage.getBlueMask());
//paramRawImage.getRedMask() = -16777216
//paramRawImage.getRedMask() = 16711680
//paramRawImage.getBlueMask() =  65289
ImageData localImageData = null;
//ArrayOutOfBounds Exception Here////////////////
//paramRawImage.width = 800
//paramRawImage.height = 1280
//paramRawImage.bpp = 32
//
localImageData = new ImageData(paramRawImage.width, paramRawImage.height, paramRawImage.bpp, localPaletteData, 1, paramRawImage.data); 
Image localImage = new Image(paramShell.getDisplay(), localImageData);
//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/////////////////////////////////////////
this.mImageLabel.setImage(localImage);
this.mImageLabel.pack();
paramShell.pack();
}

我修改的RawData方法调用(当percentSize小于100时发生outofbounds异常):

public boolean readHeader(int version, ByteBuffer buf, int percentSize) {
    this.version = version;

    if (version == 16) {
        // compatibility mode with original protocol
        this.bpp = 16;

        // read actual values.
        this.size = buf.getInt() * percentSize/100;
        this.width = buf.getInt() * percentSize/100;
        this.height = buf.getInt() * percentSize/100;


        // create default values for the rest. Format is 565
        this.red_offset = 11 * percentSize/100;
        this.red_length = 5 * percentSize/100;
        this.green_offset = 5 * percentSize/100;
        this.green_length = 6 * percentSize/100;
        this.blue_offset = 0 ;
        this.blue_length = 5 * percentSize/100;
        this.alpha_offset = 0;
        this.alpha_length = 0;
    } else if (version == 1) {
        this.bpp = buf.getInt();
        this.size = buf.getInt() * percentSize/100;
        this.width = buf.getInt() * percentSize/100;
        this.height = buf.getInt() * percentSize/100;
        if (percentSize < 100) { 
            this.red_offset = 11;
            this.red_length = 5;
            this.green_offset = 5;
            this.green_length = 6;
            this.blue_offset = buf.getInt() ;
            this.blue_length = 5;
            this.alpha_offset = buf.getInt();
            this.alpha_length = buf.getInt();
        } else { 
            this.red_offset = buf.getInt() ;
            this.red_length = buf.getInt();
            this.blue_offset = buf.getInt();
            this.blue_length = buf.getInt();
            this.green_offset = buf.getInt();
            this.green_length = buf.getInt();
            this.alpha_offset = buf.getInt();
            this.alpha_length = buf.getInt();
        }
        /*

        */
    } else {
        // unsupported protocol!
        return false;
    }

    return true;
}

以下是我的例外:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 16390
at org.eclipse.swt.graphics.ImageData.blit(Unknown Source)
at org.eclipse.swt.graphics.Image.init(Unknown Source)
at org.eclipse.swt.graphics.Image.init(Unknown Source)
at org.eclipse.swt.graphics.Image.<init>(Unknown Source)
at com.google.安卓.AndroidProjector.updateDeviceImage(AndroidProjector.java:262)
at com.google.安卓.AndroidProjector.open(AndroidProjector.java:56)
at com.google.安卓.AndroidProjector.main(AndroidProjector.java:273)

共 (1) 个答案

  1. # 1 楼答案

    我真的是走错路了。在谷歌搜索了很久之后,我没有再处理原始图像,而是重新创建了外壳大小,并调整了图像的大小

    我的代码现在在这里:

    https://github.com/techartist/AndroidProjector

      private void open()
    throws IOException
    {
    Display.setAppName("Android Projector");
    Display localDisplay = new Display();
    final Shell localShell = new Shell(localDisplay);
    localShell.setText("Device Screen");
    localShell.setSize(width,height);
    //localShell.setLocation(300, 300);
    createContents(localShell);
    localShell.addShellListener(new ShellListener() {
    
        public void shellIconified(ShellEvent e) {
        }
        public void shellDeiconified(ShellEvent e) {
        }
        public void shellDeactivated(ShellEvent e) {
        }
        public void shellClosed(ShellEvent e) {
            System.out.println("Client Area: " + localShell.getClientArea());
        }
        public void shellActivated(ShellEvent e) {
            int frameX = localShell.getSize().x - localShell.getClientArea().width;
            int frameY = localShell.getSize().y - localShell.getClientArea().height;
            if (AndroidProjector.this.mRotateImage) { 
                localShell.setSize(height * percentSize/100 + frameX, width * percentSize/100 + frameY);
            }
            else { 
                localShell.setSize(width * percentSize/100 + frameY,height * percentSize/100); 
            }
        }
    });     
    localShell.open();
    SocketChannel localSocketChannel = null;
    try
    {
      while (!localShell.isDisposed()) {
        if (!localDisplay.readAndDispatch())
        {
          localSocketChannel = connectAdbDevice();
          if (localSocketChannel == null) {
            break;
          }
          if (startFramebufferRequest(localSocketChannel))
          {
            int frameX = localShell.getSize().x - localShell.getClientArea().width;
            int frameY = localShell.getSize().y - localShell.getClientArea().height;
            getFramebufferData(localSocketChannel);
            updateDeviceImage(localShell, this.mRotateImage ? this.mRawImage.getRotated() : this.mRawImage);
            if (this.mRotateImage) { 
                localShell.setSize(height * percentSize/100 + frameX, width * percentSize/100 + frameY);
            }
            else { 
                localShell.setSize(width * percentSize/100 + frameX, height * percentSize/100 + frameY);
            }
          }
          localSocketChannel.close();
        }
      }
    }
    finally
    {
      if (localSocketChannel != null) {
        localSocketChannel.close();
      }
      localDisplay.dispose();
    }
    }
    

    然后我动态调整了图像的大小:

     private void updateDeviceImage(Shell paramShell, RawImage paramRawImage)
    {
    PaletteData localPaletteData = new PaletteData(paramRawImage.getRedMask(), paramRawImage.getGreenMask(), paramRawImage.getBlueMask());
    
    ImageData localImageData = null;
    localImageData = new ImageData(paramRawImage.width, paramRawImage.height, paramRawImage.bpp, localPaletteData, 1, paramRawImage.data);
    
    try { 
    Image localImage = new Image(paramShell.getDisplay(), localImageData);
    
    if (this.mRotateImage) { 
    
        localImage = resize(localImage,heightImage * percentSize/100 ,widthImage * percentSize/100);
    } else { 
        localImage = resize(localImage,widthImage * percentSize/100,heightImage * percentSize/100);
    }
    this.mImageLabel.setImage(localImage);
    this.mImageLabel.pack();
    paramShell.pack();
    } catch (Exception e) {
        String fullStackTrace = org.apache.commons.lang.exception.ExceptionUtils.getFullStackTrace(e);
        //System.out.print(e.toString());
        System.out.print(fullStackTrace);
        //
    } 
    }
    

      private Image resize(Image image, int width, int height) {
      Image scaled = new Image(Display.getDefault(), width, height);
      GC gc = new GC(scaled);
      gc.setAntialias(SWT.ON);
      gc.setInterpolation(SWT.HIGH);
      gc.drawImage(image, 0, 0,  image.getBounds().width, image.getBounds().height, 
      0, 0, width, height);
      gc.dispose();
      image.dispose(); // don't forget about me!
      return scaled;
      }
    

    }