我在matlab中编写了一段代码,可以将图像大小调整到一定的大小(不会扭曲它们),并在必要时应用填充。
然而,填充是黑色的,我希望它是透明的。我不知道该怎么做。这是我的代码:
% global variables
inputFolder = 'input/images/';
outputFolder = 'input/resized/';
extension = 'jpg';
x = 1000;
y = 1000;
% list all the files in the input folder
fileList = dir([inputFolder '*.' extension]);
% loop through all the files in the input folder, resize, pad and save
for i=1:length(fileList)
% get filename and load image
fname = fileList(i).name;
container = imread([inputFolder fname]);
% calculate local variables
containerY = size(container,1);
containerX = size(container,2);
containerProp = containerX / containerY;
canvasProp = x / y;
% determine proportions, apply padding and resize
if containerProp < canvasProp
container = imresize(container, [y NaN]);
containerX = size(container,2);
container = padarray(container, [0 floor((x - containerX)/2)], 0, 'pre');
containerX = size(container,2);
container = padarray(container, [0 (x - containerX)], 0, 'post');
elseif containerProp == canvasProp
container = imresize(container, [y x]);
else
container = imresize(container, [NaN x]);
containerY = size(container,1);
container = padarray(container, [floor((y - containerY)/2) 0], 0, 'pre');
containerY = size(container,1);
container = padarray(container, [(y - containerY) 0], 0, 'post');
end
% save resized image
imwrite(container, [outputFolder fname]);
end
有谁知道如何将填充从黑色更改为透明?
答案 0 :(得分:6)
通过使用Alpha通道实现透明度;您的图像由像素组成,每个像素由红色值,绿色值,蓝色值和透明度(= Alpha)值组成。
您可以在编写文件时指定Alpha通道,
imwrite(Image, 'filename.png', 'Alpha', AlphaMatrix)
其中Image
是R x C x 3
数组,AlphaMatrix
是R x C
矩阵。
(R
和C
是图片尺寸)
Image
包含RGB值,而AlphaMatrix
包含Alpha值。
足够的解释 - 这是一个例子。你需要一个jpg
文件;这会写
具有渐变透明度的png
文件。也就是说,它将是完全透明的
在左边,在右边完全不透明。
I = imread('a.jpg');
imwrite(I, 'a.png', 'Alpha', ...
repmat((1:size(I,2))/size(I,2), [size(I, 1) 1]));
在您的情况下,您只需要使用值1填充不透明部分,使用0填充透明值。请注意数组的数据类型 - 如果是uint8
或uint16
,所有值必须在[0..255]
范围内。如果是double
,则应该在[0..1]
范围内。
这样做的一种方法是
imresize
之后,将container
转换为double
:container = double(container);
。padarray
与NaN
:padarray(container, [0 floor(...)], nan, 'pre');
在container
NaN
的任何地方填充Alpha通道,否则为1:
alpha = uint8(ones(size(container)));
alpha(isnan(container)) = 0;
将container
修改为uint8
且不包含NaN
s:
container(isnan(container(:,:,1))) = 0;
container = uint8(container);
(希望有人能提出更漂亮的解决方案......)