Как вы заметили, PNG-изображения могут иметь битовую глубину до 16 для полутоновых изображений . Тем не менее, вы можете быть хитрыми и конвертировать свои 32-битные или 64-битные данные в набор красного, зеленого, синего и альфа-каналов и сохранять их как RGB-изображение настоящего цвета с альфа-прозрачностью, что даст вам 4 канала из 16 каждый бит для работы с 64 битами.
Вот несколько примеров ...
Сохранение 64-битного значения в файле PNG:
64-разрядное число можно разбить на 4 16-разрядных числа и сохранить следующим образом:
value = intmax('uint64')-1; %# Sample 64-bit value
%# Writing the value to a file:
redChannel = uint16(bitshift(value,-48)); %# 16 bits for red
greenChannel = uint16(bitand(bitshift(value,-32),65535)); %# 16 bits for green
blueChannel = uint16(bitand(bitshift(value,-16),65535)); %# 16 bits for blue
alphaChannel = uint16(bitand(value,65535)); %# 16 bits for alpha
imageData = cat(3,redChannel,greenChannel,blueChannel); %# Concatenate color
%# channels to 3-D
imwrite(imageData,'test.png','Alpha',alphaChannel); %# Create the file
%# Reading the value from the file:
[imageData,~,alphaChannel] = imread('test.png'); %# Load the image data
result = bitshift(uint64(imageData(:,:,1)),48)+... %# Recover the 64-bit value
bitshift(uint64(imageData(:,:,2)),32)+...
bitshift(uint64(imageData(:,:,3)),16)+...
uint64(alphaChannel);
И вы должны увидеть, что исходное 64-разрядное число value
равно восстановленному 64-разрядному числу result
.
Хранение 32-битных данных в файле PNG:
32-битные данные можно разбить на 4 набора 8-битных данных и сохранить следующим образом:
data = [0 100 1000 2^32-1]; %# Sample vector of double values
data = uint32(data); %# Convert to unsigned 32-bit values
%# Writing the data to a file:
redChannel = uint8(bitshift(data,-24)); %# 8 bits for red
greenChannel = uint8(bitand(bitshift(data,-16),255)); %# 8 bits for green
blueChannel = uint8(bitand(bitshift(data,-8),255)); %# 8 bits for blue
alphaChannel = uint8(bitand(data,255)); %# 8 bits for alpha
imageData = cat(3,redChannel,greenChannel,blueChannel); %# Concatenate color
%# channels to 3-D
imwrite(imageData,'test.png','Alpha',alphaChannel); %# Create the file
%# Reading the data from the file:
[imageData,~,alphaChannel] = imread('test.png'); %# Load the image data
result = bitshift(uint32(imageData(:,:,1)),24)+... %# Recover the 32-bit values
bitshift(uint32(imageData(:,:,2)),16)+...
bitshift(uint32(imageData(:,:,3)),8)+...
uint32(alphaChannel);
И все значения в data
и result
должны быть равны.