最近在做图像传输接口方面的工作,所以想了解一下图片的数据格式,浅浅的用matlab跑了一下。不多说直接贴代码
close all
clear all
% /读取jpg图像显示//
A=imread('1.jpg');
subplot(1,3,1);imshow(A);
title('jpg图像');
% 另存为bmp格式图片//
imwrite(A,'1.bmp','bmp');
% 读取bmp图像显示/
B=imread('1.bmp');
subplot(1,3,2);imshow(B);
title('bmp图像');
% 另存为raw格式图片///
[img_n,map] = imread('1.bmp');
fid=fopen('1.raw','wb');%存为raw\\
img_n=permute(img_n,[3,2,1]);%转置n*c*r[nums,clos,rows]
fwrite(fid, img_n, 'uint8');%注意将img转置
fclose(fid);
% 读取raw图像显示
[rows,clos,nums] = size(A);%根据图像大小设定
id = fopen('1.raw');
img=fread(id,'uint8=>uint8');%以'uint8'数据类型打开,因为本人存储的raw数据是以uint8保存的
imgsize = size(img);%读出的图像的size为n*1大小
img = reshape(img,[nums,clos,rows]);
img=permute(img,[3,2,1]);%转置
fclose(id);
subplot(1,3,3);
imshow(img)
title('raw图像');
matlab运行后的图像结果如图,需要说明的是,如果对于一幅RAW格式的图像,应该需要提前知道它的像素大小,才能通过matlab正确解析它的像素数据。
需要说明一下的是,本代码能够将其他格式的图片转换为RAW,但是对于在RAW像素层数据需要转置的问题并不是很深入了解,所以有点迷惑:
比如我在转换前对数据转置(permute函数)然后写成RAW格式的图片,matlab的fopen函数并没有报错 ,读RAW格式文件的时候就相应的需要转置。(本代码是这类写法)
如果我在转换前没有对数据转置(permute函数)然后写成RAW格式的图片,matlab的fopen函数也没有报错 ,当读RAW格式文件显示的时候就不需要转置。
我参看了大量的CSDN的博客,都涉及到了要让像素的图层(多维像素,这里理解为图层(3层))转置的问题,所以我也就用到了permute函数。疑惑就是其实用不用permute函数我都可以转成RAW格式。希望有懂的图像大佬解答一下!
所有的代码都有相应的解释,代码比较简单就不做过多的描述,这是本人参加工作以来第一篇博客,以后将常驻分享,学识浅薄,希望能够帮助大家,同时在学习的道路上一起进步!