Масштабирование и поворот изображений в C / C ++

Java имеет пул строк, в котором Java управляет распределением памяти для объектов String. См. String Pools в Java

Когда вы проверяете (сравниваете) два объекта с помощью оператора ==, он сравнивает равенство адресов в пуле строк. Если два объекта String имеют одинаковые адреса, то он возвращает true, в противном случае false. Но если вы хотите сравнить содержимое двух объектов String, вы должны переопределить метод equals.

equals - фактически метод класса Object, но он переопределяется в класс String и дается новое определение, которое сравнивает содержимое объекта.

Example:
    stringObjectOne.equals(stringObjectTwo);

Но помните, что это относится к случаю String. Если вы хотите сравнить регистр без учета регистра, вы должны пойти для метода equalsIgnoreCase класса String.

Давайте посмотрим:

String one   = "HELLO"; 
String two   = "HELLO"; 
String three = new String("HELLO"); 
String four  = "hello"; 

one == two;   // TRUE
one == three; // FALSE
one == four;  // FALSE

one.equals(two);            // TRUE
one.equals(three);          // TRUE
one.equals(four);           // FALSE
one.equalsIgnoreCase(four); // TRUE

13
задан Juha Syrjälä 8 May 2010 в 09:09
поделиться

8 ответов

Нет никакого "простого" способа acommplish этого. И масштабирование и вращение не "тривиальный" про-Цезис.

Google это для 2-й библиотеки обработки изображений. Magick ++ может быть идеей как divideandconquer.se точки, но существуют другие.

10
ответ дан Pablo Herrero 8 May 2010 в 09:09
поделиться
  • 1
    Я could' ve отвечают на это также, но что произошло с " никакой sed" правило? lol, безотносительно – KurzedMetal 9 April 2012 в 19:10

Дублирование или отбрасывание пикселей не являются лучшим изменением размеров метода или изображения, поскольку результаты покажут растрирование и зубчатость. Для лучших результатов Вы должны передискретизировать изображение, которое даст получающемуся изображению намного более гладкий взгляд. Существует много методов для передискретизации, как билинейный, bicubic, lanczos и т.д.

Смотрят на функция BicubicResample от wxWidgets. Это работает, будет все виды изображений, не только шкала полутонов, но и необходимо быть в состоянии адаптировать его к потребностям. Тогда там также передискретизирует код от VirtualDub. Google Codesearch может показать более связанный код.

РЕДАКТИРОВАНИЕ: связи выглядят хорошо в предварительном просмотре, но разорваны, когда отправлено. Это странно. Перейдите к Google codesearch и запросу для "wxwidgets resamplebicubic", и "virtualdub передискретизируют" соответственно для получения тех же результатов.

3
ответ дан user38329 8 May 2010 в 09:09
поделиться
  • 1
    Подробнее: это работает в Chrome над первой загрузкой страницы, но не над обновлением. Я думаю it' s из-за этой ошибки: code.google.com/p/chromium/issues/detail?id=280460 . Если я твердое обновление страница, это работает, т.е. нажимающий в панели URL и ударе, вхожу. Но мягкие перезагрузки как обновление страницы или нажимание кнопки Обновить (или удар F5) не работают. – jfritz42 29 October 2013 в 18:13

То, что Вы делаете, отображает ряд точек ввода на ряд выходных точек. Первая часть проблемы должна определить отображение для Вашего изменения размеров или вращения; вторая часть должна обработать точки, которые не лежат точно на границе пикселей.

Отображение для изменения размеры легко:

x' = x * (width' / width)
y' = y * (height' / height)

Отображение для вращения только немного более трудно.

x' = x * cos(a) + y * sin(a)
y' = y * cos(a) - x * sin(a)

техника для определения значения пикселей, которые перестают работать, сетку называют интерполяцией. Существует много таких алгоритмов, располагаясь широко в скорости и заключительном качестве изображения. Несколько из них в увеличивающемся порядке качества/времени являются самым близким соседом, билинейным, bicubic, и фильтр Sinc.

10
ответ дан Mark Ransom 8 May 2010 в 09:09
поделиться
  • 1
    Обратите внимание, что это требует доступа к сети (какое ответвление мерзавца - удаленный - список не делает), – Johan Lundberg 14 November 2013 в 19:58

Существует много способов масштабировать и повернуть изображения. Самый простой способ масштабироваться:

dest[dx,dy] = src[dx*src_width/dest_width,dy*src_height/dest_height]

, но это производит массивные эффекты при увеличении размера и потери детали при сокращении размера. Существуют способы привести к лучше выглядящим результатам, например, билинейная фильтрация .

Для вращения, src пиксельное местоположение может быть вычислено с помощью матрица вращения :

sx,sy = M(dx,dy)

, где M является матрицей, которая отображает целевые пиксели на исходное изображение. Снова, необходимо будет сделать интерполяцию для приведения к немассивным результатам.

, Но существует много библиотек, доступных, если Вы не хотите входить в математику обработки изображений.

13
ответ дан Tim Cooper 8 May 2010 в 09:09
поделиться

CxImage является свободной библиотекой для обработки изображений, которые могут сделать то, что Вы хотите. Я лично не использовал его за исключением тривиального материала, но я видел, что это неоднократно рекомендовало.

2
ответ дан peterchen 8 May 2010 в 09:09
поделиться
  • 1
    Для Вашей первой техники, как, Вы получаете его так it' s вниз к позиции определенного элемента? – Wex 8 January 2012 в 00:29

Вы хотите сделать грязную работу сами, или может ImageMagick делать это для Вас?

8
ответ дан activout.se 8 May 2010 в 09:09
поделиться
  • 1
    Это решение работает на меня под IE, но не Chrome. Какие-либо идеи? – jfritz42 29 October 2013 в 17:33
point scaling(point p,float sx,float sy) {
    point s;

    int c[1][3];
    int a[1][3]={p.x,p.y,1};
    int b[3][3]={sx,0,0,0,sy,0,0,0,1};

    multmat(a,b,c);

    s.x=c[0][0];
    s.y=c[0][1];

    return s;
}
0
ответ дан 1 December 2019 в 17:45
поделиться

Методы изменения размера CxImage дают странный результат. Я использовал функции Resample и Resample2 со всеми доступными вариантами методов интерполяции с тем же результатом. Например, попробуйте изменить размер изображения 1024 x 768, залитого белым цветом, до размера 802 x 582. Вы обнаружите, что на изображении есть пиксели, которые имеют цвет , отличный от белого! Вы можете проверить это: откройте изображение с измененным размером в Windows Paint и попробуйте залить его черным цветом. Результат наверняка вас развеселит.

0
ответ дан 1 December 2019 в 17:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: