2016-02-06 15 views
5

मैंने कोड का एक टुकड़ा लिखा है जो मुझे एक्सेल कार्यपुस्तिका की एक शीट के अंदर एक विशिष्ट सेल के छायांकन रंग को पुनर्प्राप्त करने की अनुमति देता है। मैंने MATLAB के actxserver का उपयोग कर COM सर्वर शुरू करके आरजीबी पूर्णांक मान सफलतापूर्वक पुनर्प्राप्त कर लिया है, और उसके बाद उस विशेष सेल ऑब्जेक्ट के आंतरिक ऑब्जेक्ट के Color Property तक पहुंच प्राप्त कर लिया है। फिर मैं उस पूर्णांक के बराबर आरजीबी ट्रिपलेट प्राप्त करता हूं, इसलिए मैं बाद में MATLAB में साजिश के लिए इसका उपयोग कर सकता हूं।आंतरिक। रंग संपत्ति inverts रंग?

आदेश है कि मेरे कोड ठीक से काम करता परीक्षण करने के लिए मैं निम्नलिखित परीक्षण के लिए बनाया गया:

enter image description here

तब मैं अपने MATLAB कोड चलाते हैं, जो अर्क: मैं एक Excel कार्यपुस्तिका 8 अलग अलग रंग के साथ colorTest.xlsx बुलाया बनाया बी कॉलम के प्रत्येक सेल पर रंग की जानकारी। मुझे एक ही लंबवत क्रम पर रंगों के साथ एक साजिश और int मान के साथ एक तालिका और प्रत्येक रंग के आरजीबी ट्रिपलेट प्राप्त करना चाहिए।

हालांकि कुछ अप्रत्याशित होता है! परिणाम को देखो:

enter image description here

सूचना है कि पूर्णांक मान रंग संपत्ति से प्राप्त होता है हमेशा काले, सफेद, हरे और मैजंटा पूर्णांक मूल्यों रहे हैं के लिए, मूल सेल के रंग से मेल नहीं खाता सही है, लेकिन यह अन्य सभी रंगों के लिए सच नहीं है। उदाहरण के लिए, आप एक्सेल पर लाल रंग के लिए देख सकते हैं, आउटपुट 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 मेरा ध्यान आकर्षित किया। शायद यह मेरी समस्या के साथ कुछ करने के लिए है।

तो आंतरिक भी है। रंग संपत्ति वास्तव में रंगों को बदल देती है?

यदि ऐसा है, तो क्या मुझे इसे सामान्य व्यवहार के रूप में माना जाना चाहिए या यह एक बग है?


लिंक डाउनलोड करने के लिए:

मैं एक ज़िप फ़ाइल पर पूरी परियोजना पैक किया है और अपलोड की गई यह है, तो आप सीधे आपकी मशीन पर इस परीक्षण चला सकते हैं। फ़ाइल डाउनलोड करें और अनपैक करें।

getCellColor.zip

+0

क्या आप अब एक्सेल पैलेट में बदलाव कर सकते हैं? मैंने यह पाया जो उपयोगी हो सकता है। दुर्भाग्यवश, मेरे पास यह हल करने के लिए मैटलैब नहीं है: [लिंक] (http://www.cpearson.com/excel/colors.aspx) --- आप रंगों की सरणी को संशोधित करके डिफ़ॉल्ट पैलेट में मानों को बदलते हैं कार्यपुस्तिका वस्तु। उदाहरण के लिए, कलरइंडेक्स मान 3 से नीले रंग के संदर्भ में रंग बदलने के लिए, ==> 'वर्कबुक (" कुछबुक.एक्सएलएस ") का उपयोग करें। रंग (3) = आरजीबी (0,0,255)' –

+0

मैंने कभी इस समस्या को नहीं देखा है Interior.Color। मेरा अनुमान है कि आपका आरजीबी-इंट रूपांतरण पिछड़ा है। जब मैं आंतरिक सेट करता हूं तो मैं आरजीबी को int में परिवर्तित करता हूं। रंग: 'longcolor = rgbcolor * [1 256 256 * 256]'; '। आपको पसंद के किसी भी रंग के लिए काम करता है। – buzjwa

+0

मैंने अब आपकी 'int2rgb' विधि की जांच की है। यह वास्तव में आर और बी – buzjwa

उत्तर

2
आरजीबी रंग मॉडल पर MSDN article से

:

रंग निर्दिष्ट करने के लिए आरजीबी रंग मॉडल का उपयोग किया जाता है। यह मॉडल 0 से 255 के पैमाने पर लाल, हरे और नीले रंग की तीव्रता निर्दिष्ट करता है, जिसमें 0 (शून्य) न्यूनतम तीव्रता दर्शाता है।

आरजीबी मूल्य = लाल + (ग्रीन * 256) + (ब्लू * 256 * 256)

यह के रूप में: तीन रंगों की सेटिंग इस सूत्र का उपयोग करके एक भी पूर्णांक मान में बदल रही हैं chris neilsen answer में सुझाव दिया गया था, रंग एन्कोडिंग के मामले में कोई "सही" या "गलत" नहीं है। माइक्रोसॉफ्ट ने केवल उन कारणों से रंगों को एन्कोड करने के लिए यह विशेष तरीका चुना है, और मुझे इसके साथ रहना चाहिए।

तो मुझे प्राप्त होने वाले आरजीबी मूल्य पूरी तरह से सही हैं।

निम्न तालिका में, मैंने एमएसडीएन लेख में प्रदान किए गए आरजीबी मूल्यों को शामिल किया है जो मुझे MATLAB में मिलता है, और वे एकदम सही मैच हैं।

Color  Int   RGB values from MSDN 
--------  -------- -------- 
Black    0   0 
White  16777215 16777215 
Red    255   255 
Green   65280  65280 
Blue   16711680 16711680 
Cyan   16776960 16776960 
Magenta  16711935 16711935 
Yellow   65535  65535 
3

आपका int2rgb विधि उलट आर और बी उन्हें बदलें और आप सही रूपांतरण मिल जाएगा। आंतरिक। रंग संपत्ति सम्मेलन का उपयोग करती है जहां आर कम से कम महत्वपूर्ण है, जबकि आपके द्वारा उपयोग किए गए फ़ाइल एक्सचेंज फ़ंक्शन विपरीत सम्मेलन का उपयोग करता है।

पूर्णांक से बदलने के लिए आरजीबी के लिए:

B = floor(colorInt/(256*256)); 
G = floor((colorInt - B*256*256)/256); 
R = colorInt - B*256*256 - G*256; 
colorRGB = [R G B]; 

आरजीबी से परिवर्तित करने के लिए int करने के लिए:

colorInt = colorRGB * [1 256 256*256]'; 
4

मेरी पहली सोचा चैनलों आदेश आरजीबी बनाम बीजीआर जाँच है।

आप शायद typecast का उपयोग कर typecast का उपयोग कर कार्य को सरल बना सकते हैं। यहाँ मूल्यों आप पोस्ट का उपयोग कर एक उदाहरण है:

clrs = [0; 16777215; 16711680; 65280; 255; 65535; 16711935; 16776960] 
for i=1:numel(clrs) 
    bgra = typecast(int32(clrs(i)), 'uint8') 
end 

उत्पादन:

clrs = 
      0 
    16777215 
    16711680 
     65280 
     255 
     65535 
    16711935 
    16776960 

bgra = 
    0 0 0 0 
bgra = 
    255 255 255 0 
bgra = 
    0 0 255 0 
bgra = 
    0 255 0 0 
bgra = 
    255 0 0 0 
bgra = 
    255 255 0 0 
bgra = 
    255 0 255 0 
bgra = 
    0 255 255 0 
5

कोई "सही" है या "गलत" यहाँ, मैटलैब और एक्सेल सिर्फ अलग ढंग से रंग सांकेतिक शब्दों में बदलना। आपको इसके लिए अपने कोड में खाते की आवश्यकता है।

निकटतम मैं एक आधिकारिक स्रोत के लिए मिल सकता है

इस MSDN लेख है, के बारे में आधे रास्ते नीचे "नीले"

MSDN article

निम्नलिखित उदाहरण के इंटीरियर सेट की एन्कोडिंग का उदाहरण देखें रंग नीले रंग के कोशिकाओं का चयन। चयन। आंतरिक। रंग = 16711680
चयन। आंतरिक।रंग = & HFF0000
Selection.Interior.Color = & O77600000
Selection.Interior.Color = आरजीबी (0, 0, 255)

+0

यह आश्चर्यजनक है। मैंने सोचा कि रंग एन्कोडिंग सभी के लिए समान था, जैसे मानक। – codeaviator

संबंधित मुद्दे