Я пытаюсь получить UIImage из моих данных dicom на ipad.
Код выглядит так:
reader->SetFileName(documentsFolderPath/test.dcm);
reader->Update();
ImageType * imageTest = reader->GetOutput(); // get 2d image data
PixelType * pixelData = imageTest->GetBufferPointer();
const void* buffer = pixelData;
// Set the dimensions of the current context
size_t width = 157; // set manually, but correct
size_t height = 143;
// 1 byte per component
size_t bitsPerComponent = 8;
unsigned int multiplier;
bitsPerComponent *= 2; // short = 2 byte
size_t bitsPerPixel, bytesPerRow;
CGColorSpaceRef colorSpace;
CGBitmapInfo bitmapInfo;
CGDataProviderRef theDataProvider;
CFDataRef theDataReference;
bool shouldInterpolate = NO;
CGColorRenderingIntent theIntent;
bitsPerPixel = bitsPerComponent * 1; // because of grayscale image
colorSpace = CGColorSpaceCreateDeviceGray();
bitmapInfo = kCGImageAlphaNone | kCGBitmapByteOrder32Big;
// cg data provider to build the cg image
const UInt8* rawData = static_cast<const UInt8*>(buffer);
// For some reason initiating a CGImage uses BITS per pixel, so we need to divide by 8 to get BYTES
// per pixel
bytesPerRow = (bitsPerPixel/8) * width;
theDataReference = CFDataCreate(NULL,
rawData,
(bytesPerRow*height));
theDataProvider = CGDataProviderCreateWithCFData(theDataReference);
// Finally create the image reference
CGImageRef theImageRef = CGImageCreate(width,
height,
bitsPerComponent,
bitsPerPixel,
bytesPerRow,
colorSpace,
bitmapInfo,
theDataProvider,
nil,
shouldInterpolate,
theIntent);
// Construct an output image
UIImage *myImage = [UIImage imageWithCGImage:(theImageRef)];
imageView.image = myImage;
Но тогда мое выходное изображение выглядит так:
http://www.ettisberger.ch/images/outputImage.png
(на изображении с масштабом для заполнения, поэтому размер не имеет значения)
Но фон должен быть черным, и большинство пикселей кости более или менее белые ...
Есть ли кто-то, кто может увидеть мою неудачу?
РЕДАКТИРОВАТЬ: Может быть, 16 бит на ipad может быть проблемой?
EDIT2:
Я знаю решение знаю. Я прохожу каждый пиксель и вычисляю значение типа unsigned int в диапазоне от 0 до 255. Max и min - это максимальные и минимальные значения всей картинки, потому что нам нужно изменить контраст.
Это работает, но моему методу требуется 0,1-0,2 секунды для создания одного uiimage - и со стеком из 400 изображений это так медленно, и пользователю пришлось ждать 1 минуту: / Не знаю, есть ли лучшее решение.
for(int i = 0; i < (bytesPerRow*height);i++){
short tmpPixelValue = *pixelData;
short tmpNewPixelValue;
if(tmpPixelValue == 0){
tmpNewPixelValue = 0;
}else{
tmpNewPixelValue = (tmpPixelValue - min) * (255.0 / (max - min));
}
pixelBuffer[i] = (UInt8)tmpNewPixelValue;
pixelData++;
}