#c# #ruby #ienumerable #ironruby
#c# #ruby #ienumerable #ironruby
Вопрос:
У меня есть метод C #:
public static IEnumerator getPixels(Picture picture) {
for (int x=0; x < picture.width; x ) {
for (int y=0; y < picture.height; y ) {
yield return picture.getPixel(x, y);
}
}
}
Я могу вызвать это нормально в IronPython:
for pixel in getPixels(pic):
r, g, b = getRGB(pixel)
gray = (r g b)/3
setRGB(pixel, gray, gray, gray)
Но я не вижу, как вызвать это из IronRuby:
Myro::getPixels(pic) do |pixel|
r, g, b = Myro::getRGB pixel
gray = (r g b)/3
Myro::setRGB(pixel, gray, gray, gray)
end
Все, что я получаю в ответ, это Graphics <getPixels>c__Iterator0.
Что мне нужно сделать, чтобы действительно получить каждый пиксель в IronRuby и обработать его?
Комментарии:
1. Я не могу прямо ответить на ваш вопрос, но существует неточность вычисления воспринимаемого серого: это должно быть точечное произведение rgb и 0,3, 0,59, 0,11. Люди по-разному воспринимают яркость разных цветов. Все это применимо, если вы хотите представить исходную яркость цвета.
2. Вы правы: это не прямой ответ. И даже не косвенный ответ 🙂 Вы также правы в том, что люди воспринимают яркость RGB неодинаково, и существует множество возможных значений для весовых коэффициентов RGB для создания более приятного изображения в оттенках серого. Но это не имеет никакого отношения к рассматриваемой проблеме (и код, на самом деле, создает совершенно прекрасное изображение в оттенках серого). Теперь мне нужно выяснить, как вызвать генератор в IronRuby…
Ответ №1:
От Джимми Шементи:
http://rubyforge.org/pipermail/ironruby-core/2011-May/007982.html
Если вы измените возвращаемый тип getPixels на IEnumerable, то это сработает:
Myro::getPixels(pic).each do |pixel|
...
end
И, возможно, это должно быть IEnumerable, а не IEnumerator, как
IEnumerable.GetEnumerator() выдает вам IEnumerator.
Ваш пример кода передает замыкание методу getPixels, который просто игнорируется (все методы Ruby синтаксически принимают блок / замыкание, и они могут выбрать его использование), и возвращает IEnumerator.
IronRuby сегодня не поддерживает сопоставление перечисляемого модуля Ruby объектам IEnumerator, поскольку довольно неудобно возвращать IEnumerator вместо IEnumerable из общедоступного API, но поскольку IronPython устанавливает приоритет для его поддержки, мы должны изучить это. Открыт http://ironruby.codeplex.com/workitem/6154.
~ Джимми