O Facebook Spectrum é uma nova biblioteca de processamento de imagens open source para iOS e Android que tem como objetivo tornar o processo de upload de imagens mais eficiente e confiável, buscando o melhor equilíbrio entre a qualidade da imagem e o tamanho do arquivo.
Como o hardware da câmera móvel melhora rapidamente, nossos telefones capturam e armazenam arquivos maiores e maiores. O upload desses arquivos grandes pode consumir dados móveis; pode levar uma eternidade para eles carregarem; e, às vezes, os arquivos não são carregados.
Além disso, o upload de imagens grandes geralmente é um desperdício, pois a imagem geralmente é redimensionada para o destinatário. Por essas razões, a abordagem que o Spectrum segue é transcodificar a imagem no dispositivo antes de carregá-lo. Isso consiste em aplicar uma lista de transformações, chamadas "receitas", de acordo com o formato da imagem e os requisitos de qualidade do desenvolvedor. Portanto, para cada imagem, a biblioteca digitalizará a receita e selecionará a receita mais eficiente, possivelmente sem perdas, para a operação solicitada, como o upload, corte ou rotação.
O redimensionamento de uma imagem, que é o fator mais importante para afetar o tamanho final da imagem, pode ser obtido usando técnicas de amostragem ou interpolação, e o Spectrum é capaz de determinar qual técnica aplicar com base no tipo de transformação necessária. Por exemplo, a amostragem é sempre mais eficiente que a interpolação, mas pode ser aplicada somente para proporções de tamanhos de imagens de entrada e saída. Para permitir a seleção das técnicas mais eficientes em um número maior de casos, o Spectrum suporta a especificação do tamanho aproximado da imagem de saída, como "exato ou menor" e "exato ou maior". Isso possibilita ajustar o tamanho da imagem de saída de forma que, por exemplo, a amostragem possa ser usada.
Este é um exemplo de como você pode transcodificar uma imagem para upload usando o Spectre:
FSPEncodeRequirement *encodeRequirement =
[FSPEncodeRequirement encodeRequirementWithFormat:FSPEncodedImageFormat.jpeg
mode:FSPEncodeRequirementModeLossy
quality:80];
FSPTransformations *transformations = [FSPTransformations new];
transformations.resizeRequirement =
[[FSPResizeRequirement alloc] initWithMode:FSPResizeRequirementModeExactOrSmaller
targetSize:CGSizeMake(2048, 2048)];
FSPEncodeOptions *options =
[FSPEncodeOptions encodeOptionsWithEncodeRequirement:encodeRequirement
transformations:transformations
metadata:nil
configuration:nil
outputPixelSpecificationRequirement:nil];
NSError *error;
FSPResultData *result = [FSPSpectrum.sharedInstance encodeImage:image options:options error:&error];
Como você pode ver no código acima, é possível codificar uma imagem JPEG especificando o formato e o nível de qualidade requerido, com ou sem perdas e qualquer atributo relativo ao formato da imagem e um conjunto de transformações desejadas, como redução. Você não precisa fornecer detalhes de baixo nível sobre como a transcodificação deve ser realizada.
O Spectrum é escrito em torno de um núcleo C++ e fornece APIs Java e Objective-C. Suporta imagens nos formatos JPEG, PNG e WebP e usa bibliotecas nativas, como MozJpeg e libpng, para um controle mais refinado da codificação de imagens, além do que é suportado pelas APIs de plataforma de propósito geral. Você pode baixá-lo do GitHub do projeto.