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