0

我可以在移动应用程序中使用不支持 jpg 的任何类型的图像格式吗?可以向该文件发送请求,下载并保存它,并使用移动应用程序内的解码器解码为位图并在屏幕上绘制图片。全部在移动应用客户端完成。有没有可能,如果是初学者的起点可以告诉我吗

4

1 回答 1

1

您可以在此处的表 1 中查看 UIImage 支持的图像格式

.tiff .tif .jpg .jpeg .gif .png .bmp .ico .cur .xbm 都可以使用 UIImage 的本机方法轻松合并。

如果有可能在您的应用程序摄取图像之前将您的图像转换为这种格式,您应该尝试这样做,因为与编写和使用自定义类来解析和转换另一个方法相比imageWithContentsOfFile:,这些imageWithData:方法的工作量将无限地减少格式。

您是否有必须使用的特定格式不能先转换为 .tif .jpg .bmp 或 .png ?

更新以响应 OP

可能有一些项目做了类似的事情,但我可以为您提供的唯一相关经验来自一个机器视觉项目,我将原始像素数据处理为原始数据,并将其加载回 CGImageRef 以供界面使用。

您可能会直接分配内存并使用直接 C 来处理其中的一些

这是我所做的一些尝试(同样,不能保证这将适用于您的情况):

size_t bitMatrixSize = (height-2*k_kernelPixelRadius) * (width-2*k_kernelPixelRadius);
unsigned char *bitMatrix = malloc(bitMatrixSize); //back to int, so only 1 byte per pixel needed
//other methods manipulated the data stored in this unsigned char, then passed it to the following method

+(CGImageRef)newImageFromBitMatrix:(unsigned char*)bitMatrix originalImagePixelHeight:(int)origHeight originalImagePixelWidth:(int)origWidth{

int pixelsInBitMatrix = (origHeight - (2 * k_kernelPixelRadius)) * (origWidth - (2 * k_kernelPixelRadius));
unsigned char *rawData = malloc(pixelsInBitMatrix * 4); //1 byte per char, 4 bytes per pixel (RGBA)
int outputColor = 0;
int byteIndex = 0;

for (int i = 0; i < pixelsInBitMatrix; i++) {
    //outputColor = (bitMatrix[i] == 1) ? 255 : 0;    //This is the shorter form, the undefined grey was included for debugging. Remove it later
    if (bitMatrix[i] == 1) {
        outputColor = 255;
    }
    else if (bitMatrix[i] == 0) {
        outputColor = 0;
    }
    else {
        outputColor = 150;
    }

    rawData[byteIndex] = outputColor;
    rawData[byteIndex + 1] = outputColor;
    rawData[byteIndex + 2] = outputColor;
    rawData[byteIndex + 3] = 255; //alpha channel

    byteIndex += 4;
}

CGContextRef ctx = NULL; 
CGColorSpaceRef deviceRGB = CGColorSpaceCreateDeviceRGB();
size_t contextWidth = origWidth - (2 * k_kernelPixelRadius);
size_t contextHeight = origHeight - (2 * k_kernelPixelRadius);
size_t bytesPerRow = 4 * contextWidth;

ctx = CGBitmapContextCreate(rawData,  
                            contextWidth,  
                            contextHeight,  
                            8,  
                            bytesPerRow,  
                            deviceRGB,  
                            kCGImageAlphaPremultipliedLast ); 

CGImageRef thresholdImage = CGBitmapContextCreateImage (ctx);  
CGColorSpaceRelease(deviceRGB);
CGContextRelease(ctx);  
free(rawData);

return thresholdImage;
free(bitMatrix);
}
于 2013-10-27T04:08:20.790 回答