मैंने कोड का एक टुकड़ा लिखा है जो मुझे एक्सेल कार्यपुस्तिका की एक शीट के अंदर एक विशिष्ट सेल के छायांकन रंग को पुनर्प्राप्त करने की अनुमति देता है। मैंने MATLAB के actxserver
का उपयोग कर COM सर्वर शुरू करके आरजीबी पूर्णांक मान सफलतापूर्वक पुनर्प्राप्त कर लिया है, और उसके बाद उस विशेष सेल ऑब्जेक्ट के आंतरिक ऑब्जेक्ट के Color Property तक पहुंच प्राप्त कर लिया है। फिर मैं उस पूर्णांक के बराबर आरजीबी ट्रिपलेट प्राप्त करता हूं, इसलिए मैं बाद में MATLAB में साजिश के लिए इसका उपयोग कर सकता हूं।आंतरिक। रंग संपत्ति inverts रंग?
आदेश है कि मेरे कोड ठीक से काम करता परीक्षण करने के लिए मैं निम्नलिखित परीक्षण के लिए बनाया गया:
तब मैं अपने MATLAB कोड चलाते हैं, जो अर्क: मैं एक Excel कार्यपुस्तिका 8 अलग अलग रंग के साथ colorTest.xlsx
बुलाया बनाया बी कॉलम के प्रत्येक सेल पर रंग की जानकारी। मुझे एक ही लंबवत क्रम पर रंगों के साथ एक साजिश और int मान के साथ एक तालिका और प्रत्येक रंग के आरजीबी ट्रिपलेट प्राप्त करना चाहिए।
हालांकि कुछ अप्रत्याशित होता है! परिणाम को देखो:
सूचना है कि पूर्णांक मान रंग संपत्ति से प्राप्त होता है हमेशा काले, सफेद, हरे और मैजंटा पूर्णांक मूल्यों रहे हैं के लिए, मूल सेल के रंग से मेल नहीं खाता सही है, लेकिन यह अन्य सभी रंगों के लिए सच नहीं है। उदाहरण के लिए, आप एक्सेल पर लाल रंग के लिए देख सकते हैं, आउटपुट int और आरजीबी ट्रिपलेट नीले रंग के रंग के अनुरूप है।
मैं संदर्भ के लिए सही परिणाम मैं मिलना चाहिए के साथ निम्न तालिका को शामिल किया है,:
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
मैं this RGB Int Calculator का उपयोग कर प्रत्येक रंग के लिए सही पूर्णांक मूल्यों प्राप्त की।
यदि हम दो तालिकाओं की तुलना करते हैं, तो हम यह समझ सकते हैं कि लाल और नीले चैनल उलटा हो गए हैं।
कोड:
समारोह है कि मैं परीक्षण चलाने के लिए निष्पादित getCellColor
कहा जाता है। कोड पर एक नज़र डालें:
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
(*) यह निर्देश रंग पूर्णांक उबरने के जिम्मेदार है।
नोट: कार्यों अगले वर्णित है, समस्याबाद से वे रंग पूर्णांक (वे केवल माध्यमिक कार्यों के लिए उपयोग किया जाता है) के प्राप्त करने में हिस्सा नहीं लेते हैं कारण नहीं है। मैंने केवल इस जानकारी को पूर्णता के लिए शामिल किया है। validpath
, xlsCleanup
और openExcelWorkbook
:
इस प्रक्रिया के दौरान मैं तीन MATLAB के iofun फ़ोल्डर से निजी काम करता है, जो कर रहे हैं का उपयोग करें। मैंने बस उन्हें परियोजना फ़ोल्डर के अंदर निजी नामक फ़ोल्डर में कॉपी किया।
अंत में, रंग पूर्णांक से आरजीबी ट्रिपलेट प्राप्त करने के लिए, मैं एक फ़ंक्शन का उपयोग करता हूं जिसे मैंने this other function से अनुकूलित किया है जिसे मैंने नेट पर पाया था।
यहाँ मेरी int2rgb
समारोह के लिए कोड है:
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
मैं इस से बाहर कुछ समझ बनाने के लिए कोशिश कर रहा हूँ, लेकिन मैं वास्तव में क्या हो रहा है की कोई अंदाज़ा नहीं है। मैंने कुछ भाग्य किए बिना कुछ शोध किया है, लेकिन this post और this other post मेरा ध्यान आकर्षित किया। शायद यह मेरी समस्या के साथ कुछ करने के लिए है।
तो आंतरिक भी है। रंग संपत्ति वास्तव में रंगों को बदल देती है?
यदि ऐसा है, तो क्या मुझे इसे सामान्य व्यवहार के रूप में माना जाना चाहिए या यह एक बग है?
लिंक डाउनलोड करने के लिए:
मैं एक ज़िप फ़ाइल पर पूरी परियोजना पैक किया है और अपलोड की गई यह है, तो आप सीधे आपकी मशीन पर इस परीक्षण चला सकते हैं। फ़ाइल डाउनलोड करें और अनपैक करें।
क्या आप अब एक्सेल पैलेट में बदलाव कर सकते हैं? मैंने यह पाया जो उपयोगी हो सकता है। दुर्भाग्यवश, मेरे पास यह हल करने के लिए मैटलैब नहीं है: [लिंक] (http://www.cpearson.com/excel/colors.aspx) --- आप रंगों की सरणी को संशोधित करके डिफ़ॉल्ट पैलेट में मानों को बदलते हैं कार्यपुस्तिका वस्तु। उदाहरण के लिए, कलरइंडेक्स मान 3 से नीले रंग के संदर्भ में रंग बदलने के लिए, ==> 'वर्कबुक (" कुछबुक.एक्सएलएस ") का उपयोग करें। रंग (3) = आरजीबी (0,0,255)' –
मैंने कभी इस समस्या को नहीं देखा है Interior.Color। मेरा अनुमान है कि आपका आरजीबी-इंट रूपांतरण पिछड़ा है। जब मैं आंतरिक सेट करता हूं तो मैं आरजीबी को int में परिवर्तित करता हूं। रंग: 'longcolor = rgbcolor * [1 256 256 * 256]'; '। आपको पसंद के किसी भी रंग के लिए काम करता है। – buzjwa
मैंने अब आपकी 'int2rgb' विधि की जांच की है। यह वास्तव में आर और बी – buzjwa