Napisałem fragment kodu, który pozwala mi pobrać kolor cieniowania określonej komórki wewnątrz arkusza skoroszytu programu Excel. Pomyślnie pobrałem wartość całkowitą RGB, uruchamiając serwer COM, używając MATLAB-a actxserver
, a następnie uzyskując dostęp do obiektu Color Property obiektu wewnętrznego tego konkretnego obiektu komórki. Następnie otrzymuję równoważny triplet RGB tej liczby całkowitej, więc mogę go później użyć do kreślenia w MATLAB.Interior.Color Property odwraca kolory?
W celu sprawdzenia, że mój kod działa poprawnie Zaprojektowałem następujący test: Założyłem skoroszytu programu Excel o nazwie colorTest.xlsx
z 8 różnych kolorach:
Potem biegnę mój kod Matlab, który wydobywa informacje o kolorze w każdej komórce kolumny B. Powinienem uzyskać wykres z kolorami w tej samej kolejności pionowej i tabelą z wartością int i trójką RGB dla każdego koloru.
Coś jednak nieoczekiwanego! Spojrzeć na wyniki:
Zauważ, że wartość całkowita, która jest uzyskiwana z własności kolor nie zawsze pasuje do koloru oryginalnego ogniwa, na czarnym, białym, zielonym i purpurowym wartości całkowite są poprawne, ale nie dotyczy to wszystkich pozostałych kolorów. Możesz zobaczyć, na przykład, że dla koloru czerwonego w Excelu, wyjście tri i tryplet RGB odpowiadają kolorowi niebieskim.
I dodaje się w poniższej tabeli do odpowiednich wyników należy uzyskać, dla odniesienia:
Color Int R G B
-------- -------- -----
Black 0 0 0 0
White 16777215 1 1 1
Red 16711680 1 0 0
Green 65280 0 1 0
Blue 255 0 0 1
Cyan 65535 0 1 1
Magenta 16711935 1 0 1
Yellow 16776960 1 1 0
że uzyskuje się odpowiednie wartości całkowite dla każdej barwy z wykorzystaniem this RGB Int Calculator.
Jeśli porównamy dwie tabele, możemy wywnioskować, że kanały Red i Blue są odwrócone.
Kod:
Funkcja że wykonać, aby uruchomić test nazywa getCellColor
. Spójrz na kod:
function getCellColor()
clear all;
clc;
% Excel
filename = 'colorTest.xlsx';
% Start Excel as ActiveX server process on local host
Excel = actxserver('Excel.Application');
% Handle requested Excel workbook filename
path = validpath(filename);
% Cleanup tasks upon function completion
cleanUp = onCleanup(@()xlsCleanup(Excel, path));
% Open Excel workbook.
readOnly = true;
[~, workbookHandle] = openExcelWorkbook (Excel, path, readOnly);
% Initialise worksheets object
workSheets = workbookHandle.Worksheets;
% Get the sheet object (sheet #1)
sheet = get(workSheets,'item',1);
% Print table headers
fprintf('Color \t Int \t R G B\n');
fprintf('--------\t --------\t -----\n');
% Create figure
figure;
hold on;
% Loop through every color on the Excel file
for row = 1:8
% Get the cell object with name of color
cell = get(sheet, 'Cells', row, 1);
cName = cell.value;
% Get the cell object with colored background
cell = get(sheet, 'Cells', row, 2);
% Get the interior object
interior = cell.Interior;
% Get the color integer property
cInt = get(interior, 'Color'); % <-- Pay special attention here(*)
% Get the RGB triplet from its integer value
cRGB = int2rgb(cInt);
% Plot the color
patch([0 0 1 1], [8-row 9-row 9-row 8-row], cRGB);
% Print row with color data
fprintf('%-8s\t %8d\t %d %d %d\n', cName, cInt, cRGB);
end
% Turn off axes
set(findobj(gcf, 'type','axes'), 'Visible','off')
end
(*) Ta instrukcja jest odpowiedzialna za odzyskanie liczby całkowitej.
Uwaga: Funkcje opisane dalej, nie powodują problemu od nie biorą udziału w uzyskaniem całkowitej koloru (są one stosowane tylko dla zadań wtórna). Zawarłem te informacje tylko dla kompletności.
Podczas tego procesu używam trzy prywatne funkcji z iofun folderze MATLAB za, którymi są: validpath
, xlsCleanup
i openExcelWorkbook
. Po prostu skopiowałem je do folderu o nazwie private w folderze projektu.
Wreszcie, aby uzyskać triplet RGB z kolorowej liczby całkowitej, używam funkcji, którą dostosowałem z this other function, którą znalazłem w Internecie.
Oto kod dla mojego int2rgb
funkcji:
function[RGB] = int2rgb(colorInt)
% Returns RGB triplet of an RGB integer.
if colorInt > 16777215 || colorInt < 0
error ('Invalid int value. Valid range: 0 <= value <= 16777215')
end
R = floor(colorInt/(256*256));
G = floor((colorInt - R*256*256)/256);
B = colorInt - R*256*256 - G*256;
RGB = [R, G, B]/255;
end
Staram się zrobić coś sensownego z tego, ale naprawdę nie mam pojęcia, co się dzieje. Zrobiłem kilka badań, bez powodzenia, ale moją uwagę zwróciły this post i this other post. Może ma to coś wspólnego z moim problemem.
A więc właściwość Interior.Color naprawdę odwraca kolory?
Jeśli tak, czy powinienem uważać to za normalne zachowanie lub czy jest to błąd?
Link do pobrania:
mam zapakowane cały projekt na plik .zipi wysłał go, aby można było uruchomić ten test na komputerze od razu. Pobierz plik i rozpakuj.
Czy teraz możesz zmieniać paletę programu Excel? Znalazłem to, co może być przydatne. Niestety, nie mam Matlaba, aby rozwiązać to samodzielnie: [link] (http://www.cpearson.com/excel/colors.aspx) --- Zmieniasz wartości w domyślnej palecie modyfikując tablicę kolorów Obiekt skoroszytu. Na przykład, aby zmienić kolor, do którego odwołuje się wartość ColorIndex 3 na niebieski, użyj ==> 'Skoroszyty (" SomeBook.xls ") Kolory (3) = RGB (0,0,255)' –
Nigdy nie widziałem tego problemu z Interior.Color. Domyślam się, że konwersja RGB-int jest cofana. W ten sposób konwertuję RGB na int, gdy ustawiam Interior.Color: 'longColor = rgbColor * [1 256 256 * 256] ';'. Działa dla dowolnego koloru, który lubisz. – buzjwa
Sprawdziłem teraz twoją metodę 'int2rgb'. Rzeczywiście odwraca R i B. – buzjwa