Bug in setPixels
Posted by Ilan on Apr 09, 2014; 10:45am
URL: http://imagej.273.s1.nabble.com/Bug-in-setPixels-tp5007255.html
A few days ago I reported some strange results with setPixels with the first page of the stack not being updated. It seems that it is a bug in ImageJ. It isn't necessarily the first page, but rather the image which is currently being displayed.
To make a test case I generated a stack using Convert to Mask which gives an image with pixels either 0 or 255. I can supply such data if someone wants it. The data is the result of Convert to Mask which gives either 0 or 255, after which the stack is converted to 16 bits.
Then I can choose any image I wish from the stack as the currently displayed page. I run the program and the displayed page will remain with 0 and 255, with all other pages being 0 or 300. The only sense I can make out of this is that setPixels is failing for the currently displayed slice.
For simplicity, I take the case where only a single ImagePlus is displayed and the program operates on it. This is only for the case of making a reproducible bug. I pulled out only the essentials of the program so that it all fits in a single page. Here is the code which demonstrates the problem:
import ij.ImagePlus;
import ij.ImageStack;
import ij.WindowManager;
import ij.plugin.PlugIn;
import javax.swing.JOptionPane;
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
/**
*
* @author ilan
*/
public class Nuclear_Bad implements PlugIn {
ImagePlus imgMask;
@Override
public void run(String arg) {
doIt();
}
void doIt() {
int[] myList = WindowManager.getIDList();
imgMask = WindowManager.getImage(myList[0]);
doMasking();
}
void doMasking() {
int i, j, stkSz, sliceSz;
short curVal;
ImageStack maskStack;
Object pix2;
short[] maskIn, maskOut;
stkSz = imgMask.getImageStackSize();
maskStack = imgMask.getImageStack();
for( i=1; i<=stkSz; i++) {
pix2 = maskStack.getPixels(i);
if(!(pix2 instanceof short [])) {
JOptionPane.showMessageDialog(null,"Must have 16 bit data on both series");
return;
}
maskIn = (short[]) pix2;
sliceSz = maskIn.length;
maskOut = new short[sliceSz];
for( j=0; j<sliceSz; j++) {
curVal = maskIn[j];
if( curVal != 0) curVal = 300;
maskOut[j] = curVal;
}
maskStack.setPixels(maskOut, i);
}
imgMask.repaintWindow();
}
}
To demonstrate the problem one only needs to put the cursor on the image. On the image which was displayed when the program was run will remain 0 or 255. Scrolling to any other image will give 0 or 300. Scrolling back will return to 0 or 255.
This is so simple that it is hard to imagine anything else than a bug.
Thanks,
Ilan