2011-02-18 37 views
0

我有两种方法完全相同,除了一个在位图上,另一个在图像上。我想只能有一种方法,因此它更干净,但我不知道如何实现这一点。如果不能将这两种方法放在一起,那么简化和压缩这些代码的最好方法是什么?将这两种图像处理方法合为一体?

谢谢!

static private Bitmap resizeBitmap(Bitmap inputBitmap, Orientation orientation) { 
    double scaleX = 1; 
    double scaleY = 1; 
    int pageWidth = orientation == Orientation.Portrait ? (int)PageDimensions.Width : (int)PageDimensions.Height; 
    int pageHeight = orientation == Orientation.Portrait ? (int)PageDimensions.Height : (int)PageDimensions.Width; 
    if (inputBitmap.Width > pageWidth) { 
     scaleX = Convert.ToDouble(pageWidth)/Convert.ToDouble(inputBitmap.Width); 
     scaleY = scaleX; 
    } 
    if (inputBitmap.Height * scaleY > pageHeight) { 
     scaleY = scaleY * Convert.ToDouble(pageHeight)/Convert.ToDouble(inputBitmap.Height); 
     scaleX = scaleY; 
    } 
    Bitmap outputImage = new Bitmap(Convert.ToInt16(inputBitmap.Width * scaleX), Convert.ToInt16(inputBitmap.Height * scaleY)); 
    using (Graphics g = Graphics.FromImage(outputImage)) 
     g.DrawImage(inputBitmap, 0, 0, outputImage.Width, outputImage.Height); 
    return outputImage; 
} 
static private Image resizeImage(Image inputImage, Orientation orientation) { 
    double scaleX = 1; 
    double scaleY = 1; 
    int pageWidth = orientation == Orientation.Portrait ? (int)PageDimensions.Width : (int)PageDimensions.Height; 
    int pageHeight = orientation == Orientation.Portrait ? (int)PageDimensions.Height : (int)PageDimensions.Width; 
    if (inputImage.Width > pageWidth) { 
     scaleX = Convert.ToDouble(pageWidth)/Convert.ToDouble(inputImage.Width); 
     scaleY = scaleX; 
    } 
    if (inputImage.Height * scaleY > pageHeight) { 
     scaleY = scaleY * Convert.ToDouble(pageHeight)/Convert.ToDouble(inputImage.Height); 
     scaleX = scaleY; 
    } 
    Bitmap outputImage = new Bitmap(Convert.ToInt16(inputImage.Width * scaleX), Convert.ToInt16(inputImage.Height * scaleY)); 
    using(Graphics g = Graphics.FromImage(outputImage)) 
     g.DrawImage(inputImage, 0, 0, outputImage.Width, outputImage.Height); 
    return outputImage; 
} 

回答

1

你只需要一个单个函数采用Image参数并且返回类型为Bitmap,因为实际上您在resizeImage方法中返回Bitmap。此作品自Bitmap继承Image

static private Bitmap resizeImage(Image inputImage, Orientation orientation) 
{ 
    ... 
} 

这样您不必如果你将其分配给Bitmap类型的变量(我以为是你写的这两种功能的最初原因)投resizeImage的结果。

+0

现在这就是我所希望的,我刚刚实施了你的解决方案,它的效果非常好:) – sooprise 2011-02-18 19:17:41

0

我不知道这将是非常有用的,但,你可以在这些功能中的一个,添加一个IF知道,如果你的参数的类型是位图或图像的对象。和你一起加入2个功能

祝你好运!

3

我不是一个C#专家,但据the documentation,位图影像(从它继承),所以你可以只调用了位图作为参数的第二种方法,它应该工作。如果我是正确的,那么只要删除第一个,这是没有用的了。

1

在一般情况下,如果你在处理两个没有公共基类或接口的类(并且你不能添加一个),最好的办法是把不依赖于特定的代码类转换为两个现有方法调用的新方法。例如,像:

/// getNewDimensions 
static private void getNewDimensions(int ImageWidth, int ImageHeight, Orientation orientation, out int NewWidth, out int NewHeight) { 
    double scaleX = 1; 
    double scaleY = 1; 
    int pageWidth = orientation == Orientation.Portrait ? (int)PageDimensions.Width : (int)PageDimensions.Height; 
    int pageHeight = orientation == Orientation.Portrait ? (int)PageDimensions.Height : (int)PageDimensions.Width; 
    if (ImageWidth > pageWidth) { 
     scaleX = Convert.ToDouble(pageWidth)/Convert.ToDouble(ImageWidth); 
     scaleY = scaleX; 
    } 
    if (ImageHeight * scaleY > pageHeight) { 
     scaleY = scaleY * Convert.ToDouble(pageHeight)/Convert.ToDouble(ImageHeight); 
     scaleX = scaleY; 
    } 

    NewWidth = ImageWidth * scaleX; 
    NewHeight = ImageHeight * scaleY; 

} 

/// resizeBitmap 
static private Bitmap resizeBitmap(Bitmap inputBitmap, Orientation orientation) { 
    int NewWidth = 0; 
    int NewHeight = 0; 
    getNewDimensions(inputBitmap.Width, inputBitmap.Width, orientation, NewWidth, NewHeight); 
    Bitmap outputImage = new Bitmap(Convert.ToInt16(newWidth), Convert.ToInt16(newHeight)); 
    using (Graphics g = Graphics.FromImage(outputImage)) 
     g.DrawImage(inputBitmap, 0, 0, outputImage.Width, outputImage.Height); 
    return outputImage; 
} 

/// resizeImage (I'll leave as an exercise to the reader) 
+0

这是我最终会做的,如果没有更好的选择,但不应该有一种方法来简单地将图像转换为位图,如果这是输入图像类型? – sooprise 2011-02-18 19:06:33

0

我不喜欢张贴的答案我自己的问题,但是这似乎是相当不错的了,是一个简单的解决方案:

static private Bitmap resizeBitmap(Bitmap inputBitmap, Orientation orientation) { 
    return (Bitmap)resizeImage(inputBitmap, orientation); 
} 

//Resizes images 
static private Image resizeImage(Image inputImage, Orientation orientation) { 
    double scaleX = 1; 
    double scaleY = 1; 
    int pageWidth = orientation == Orientation.Portrait ? (int)PageDimensions.Width : (int)PageDimensions.Height; 
    int pageHeight = orientation == Orientation.Portrait ? (int)PageDimensions.Height : (int)PageDimensions.Width; 
    if (inputImage.Width > pageWidth) { 
     scaleX = Convert.ToDouble(pageWidth)/Convert.ToDouble(inputImage.Width); 
     scaleY = scaleX; 
    } 
    if (inputImage.Height * scaleY > pageHeight) { 
     scaleY = scaleY * Convert.ToDouble(pageHeight)/Convert.ToDouble(inputImage.Height); 
     scaleX = scaleY; 
    } 
    Bitmap outputImage = new Bitmap(Convert.ToInt16(inputImage.Width * scaleX), Convert.ToInt16(inputImage.Height * scaleY)); 
    using (Graphics g = Graphics.FromImage(outputImage)) 
     g.DrawImage(inputImage, 0, 0, outputImage.Width, outputImage.Height); 
    return outputImage; 
} 
相关问题