私はこれで3日間立ち往生しています。ドキュメントのヘッダーと画像の生データからいくつかの情報を返すバッファリングされたリーダーで解析する必要がある Dicom ファイルを取得しました。その後、RAW に LUT を適用してバイトをグレースケールに変換し、Bitmap.create
. 小さな画像には最適でしたが、今は 13Mo の画像をロードする必要があり、それを開くのに時間がかかるだけでなく (約 20 秒)、ビットマップ メソッドで LUT を適用しているときに、Android がエラー About Bitmap をスローします29052480-byte external allocation too large for this process.
java.lang.OutOfMemoryError: bitmap size exceeds VM budget
。このエラーについて多くのスレッドがあることは知っていますが、私の場合は、1 つの画像しか開きたくないので、少し独創的です (したがって、多くのビットマップをスタックすることではありません)。私はあなたにいくつかのコードを示すことができます:
RefreshBmp :
private void refreshBmp(int windowWidth, int windowCentre) {
int[] colorArray = process.transformBuffer(myDicomObject.getRawData(),
myDicomObject.isInverted(), windowWidth, windowCentre,
myDicomObject.getnBits());
Bitmap bmp = Bitmap.createBitmap(colorArray,
myDicomObject.getColumns(), myDicomObject.getRows(),
Bitmap.Config.ARGB_8888);
dicomImageView.setImageBitmap(bmp);
}
私のLUTを呼び出す:
public int[] transformBuffer(int[] rawData, boolean inverted,
int windowWidth, int windowCenter, int nBits) {
System.gc();
int min = windowCenter - (windowWidth/2);
int max = windowCenter + (windowWidth/2);
int intGrayscale = (int) Math.pow(2, nBits);
int intDivisionFactor = nBits-8;
double dmin = (double) min;
double dmax = (double) max;
double doubleGrayScale = (double) intGrayscale;
int rawDataLength = rawData.length;
int[] resultBuffer = new int[rawDataLength];
lutBuffer = new int[intGrayscale];
if(inverted){
for(int i = 0 ; i < min ; i++){
lutBuffer[i] = 255;
}
for(int i = min ; i < max ; i++){
double value = doubleGrayScale * ((i - dmin + 1) / (dmax - dmin + 1));
lutBuffer[i] = (int) (doubleGrayScale - value) >> intDivisionFactor;
}
for(int i = max ; i < intGrayscale ; i++){
lutBuffer[i] = 0;
}
}else{
for(int i = 0 ; i < min ; i++){
lutBuffer[i] = 0;
}
for(int i = min ; i < max ; i++){
double value = ((i - dmin + 1) / (dmax - dmin + 1));
lutBuffer[i] = (int) (value) << intDivisionFactor;
}
for(int i = max ; i < intGrayscale ; i++){
lutBuffer[i] = 255;
}
}
for(int i = 0 ; i < rawDataLength ; i++){
int colorValue = lutBuffer[rawData[i]];
resultBuffer[i] = Color.argb(255, colorValue, colorValue, colorValue);
}
System.out.println(resultBuffer.length);
return resultBuffer;
}
うまくいけば、誰かがメモリ割り当てを節約する方法、特に LUT メソッドを知っているでしょう。