#c# #image-processing
#c# #обработка изображений
Вопрос:
У меня есть изображение «рыбий глаз», и то, что я пытаюсь сделать, это преобразовать его в альбомную ориентацию. Написанный мной код преобразует его в альбомную ориентацию, но когда дело доходит до разделения его на разные части, к ним добавляются черные части.
Кто-нибудь может помочь
using System;
using System.Drawing;
namespace fisheye_image
{
class Program
{
static void Main()
{
// assume the source image is square, and its width has even number of pixels
Bitmap bm = (Bitmap)Image.FromFile(@"C:UsersabcDesktoplillestromfisheye.jpg");
int l = bm.Width / 2;
int i, j;
int x, y;
double radius, theta;
// calculated indices in Cartesian coordinates with trailing decimals
double fTrueX, fTrueY;
int iSourceWidth = (2 * l);
int run = 0, lastWidth = 1;
while (run<4)
{
Bitmap bmDestination = new Bitmap(lastWidth*l, l);
for (i = 0; i < bmDestination.Height; i)
{
radius = (double)(l - i);
for (j = run*l; j < lastWidth*l ; j)
{
// theta = 2.0 * Math.PI * (double)(4.0 * l - j) / (double)(4.0 * l);
theta = 2.0 * Math.PI * (double)(-j) / (double)(4.0 * l);
fTrueX = radius * Math.Cos(theta);
fTrueY = radius * Math.Sin(theta);
// "normal" mode
x = (int)(Math.Round(fTrueX)) l;
y = l - (int)(Math.Round(fTrueY));
// check bounds
if (x >= 0 amp;amp; x < iSourceWidth amp;amp; y >= 0 amp;amp; y < iSourceWidth)
{
bmDestination.SetPixel(j, i, bm.GetPixel(x, y));
}
}
}
bmDestination.Save(@"C:UsersabcDesktopfisheyelandscape" run.ToString() ".jpg",System.Drawing.Imaging.ImageFormat.Jpeg);
run ;
lastWidth ;
}
}
}
}
Ниже приведены исходные и обработанные изображения
Ответ №1:
Нам просто нужно добавить еще одну переменную ‘k’ во втором цикле for, которая изменяется от нуля до ширины целевого изображения.
while (run<4)
{
Bitmap bmDestination = new Bitmap(l, l);
for (i = 0; i < bmDestination.Height; i)
{
radius = (double)(l - i);
for (j = run * l, k = 0; j < lastWidth * l||k < bmDestination.Width; j, k)
{
// theta = 2.0 * Math.PI * (double)(4.0 * l - j) / (double)(4.0 * l);
theta = 2.0 * Math.PI * (double)(-j) / (double)(4.0 * l);
fTrueX = radius * Math.Cos(theta);
fTrueY = radius * Math.Sin(theta);
// "normal" mode
x = (int)(Math.Round(fTrueX)) l;
y = l - (int)(Math.Round(fTrueY));
// check bounds
if (x >= 0 amp;amp; x < iSourceWidth amp;amp; y >= 0 amp;amp; y < iSourceWidth)
{
bmDestination.SetPixel(k, i, bm.GetPixel(x, y));
}
}