Есть ли функция обрезки, как в Photoshop в .net GDI? - PullRequest
1 голос
/ 06 июля 2011

Большинство людей, работающих в Photoshop, знают, что это делает, в основном, оно изменяет размеры изображения, удаляя все пустое пространство.

Есть ли в GDI + функция, которая делает что-то подобное? Или я должен написать свой собственный? Или, если у кого-то есть, это было бы неплохо.

Ответы [ 3 ]

1 голос
/ 06 июля 2011

Нет, нет ни одного стандартного устройства, вам нужно было бы написать свое собственное, определив, что такое «пустое» пространство, а затем отрегулировав (или скопировав) изображение, чтобы удалить это «пустое» пространство.

0 голосов
/ 06 июля 2011

На самом деле, написать это не было бы слишком сложно. Поскольку я ежедневно использую Photoshop для разработки веб-сайтов, а графику своего приложения для своего собственного программного обеспечения я разрабатываю, Trim основывается на выбранном вами пиксельном цвете. Вы можете выполнить вычисление за четыре прямоугольных прохода, перемещаясь по рядам пикселей, сравнивая их цвет с цветом, который вы хотите обрезать, сохраняя цепочки, в которых вы находитесь на своем пути. Позвольте мне объяснить.

enter image description here enter image description here

По сути, вы выполняете навигацию по пикселям слева направо, сверху вниз, создавая объект Rectangle, который хранит область (в данном случае) белых пикселей. Это будет сделано за четыре прохода, поэтому вы сгенерируете четыре прямоугольных области, которые вы могли бы вырезать из изображения.

Логика расчета следующая (в коде полупсевдо C #)

int x = 0, y = 0;
Rectangle rect = new Rectangle();
bool nonWhitePixelFound = false;

for (int row = 0; row < image.Bounds.Height; row++) {
    if (!nonWhitePixelFound) {
        for (int column = 0; column = image.Bounds.Width; column++) {
            if (pixel.getColor() != Color.White) {
                rect.Width++;
            }
            else {
                rightBoundPixelFound = true; // Okay, we encountered a non-white pixel
                                             // so we know we cannot trim anymore to the right
                rect.Height--; // Since we don't want to clip the row with the non-white pixel
                nonWhitePixelFound = true;
                return rect; // I did not wrap this code in a function body in this example,
                             // but to break both loops you should return, or this would be 
                             // a rare case to use goto
            }
        }
    }
    rect.Height++; // Since we have not found a non-white pixel yet, and went through the
                   // entire row if pixels, we can go ahead and check the next row
}

По сути, вы бы повторили этот алгоритм для 4 проходов (4 стороны изображения), пока вы не урежете все пробелы (или любой другой цвет, который вам нужен). Это должно работать для нетрадиционных фигурных изображений с разбросанными цветами также из-за алгоритма. Он прекращает вычисление области, как только обнаруживает небелые пиксели, и вам следует затем обрезать эту область и выполнить еще один проход. Промыть и повторить.

Обратите внимание, что я не проверял это; все это в теории, но я хотел бы дать вам общую идею или подход к этому, а не просто ссылку на стороннюю библиотеку или компонент.

Edit:

0 голосов
/ 06 июля 2011

В GDI + нет ничего встроенного, но вы можете использовать AForge.NET Library , которая делает это и даже больше.

...