在Matlab中使用透明像素填充数组

2 matlab transparency

我在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
Run Code Online (Sandbox Code Playgroud)

有谁知道如何将填充从黑色更改为透明?

use*_*136 6

通过使用Alpha通道实现透明度; 您的图像由像素组成,每个像素由红色值,绿色值,蓝色值和透明度(= Alpha)值组成.

您可以在编写文件时指定Alpha通道,

imwrite(Image, 'filename.png', 'Alpha', AlphaMatrix)
Run Code Online (Sandbox Code Playgroud)

where 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]));
Run Code Online (Sandbox Code Playgroud)

在您的情况下,您只需要使用值1填充不透明部分,使用0填充透明值.请注意数组的数据类型 - 如果是uint8或者uint16,则所有值都必须在范围内[0..255].如果是double,它应该在范围内[0..1].

一种方法是

  1. 之后imresize,转换container为double:container = double(container);.
  2. padarray用NaN:padarray(container, [0 floor(...)], nan, 'pre');
  3. 用0填充的α信道只要container具有NaN,否则为1:

    alpha = uint8(ones(size(container)));
    alpha(isnan(container)) = 0;
    
    Run Code Online (Sandbox Code Playgroud)
  4. 修复container是否uint8包含NaNs:

     container(isnan(container(:,:,1))) = 0;
     container = uint8(container);
    
    Run Code Online (Sandbox Code Playgroud)

(希望有人能提出更漂亮的解决方案......)