2010-10-28 74 views
4

你好,我想改變規模GDIplus ::位圖和保存在內存中縮放BItmap,我有問題。我嘗試了很多不同的示例,並且我的結果是NULL。例如,我嘗試改變圖像分辨率,使用SetResolution,也嘗試從圖像 - >圖形轉換位圖,並使用構造函數之一GDIplus ::位圖比例尺,但我沒有結果。例如我嘗試下面的代碼:GDIplus比例位圖

Bitmap *bitmap = new Bitmap((int32)width, (int32)height,PixelFormat32bppARGB); 
bitmap=bmp.Clone(0,0,W,H,PixelFormat32bppPARGB); 
mBitmap=(void *)bitmap->Clone(0.0f,0.0f,width,height,PixelFormat32bppPARGB); 

回答

0

http://msdn.microsoft.com/en-us/library/e06tc8a5.aspx

Bitmap myBitmap = new Bitmap("Spiral.png"); 
Rectangle expansionRectangle = new Rectangle(135, 10, 
    myBitmap.Width, myBitmap.Height); 

Rectangle compressionRectangle = new Rectangle(300, 10, 
    myBitmap.Width/2, myBitmap.Height/2); 

myGraphics.DrawImage(myBitmap, 10, 10); 
myGraphics.DrawImage(myBitmap, expansionRectangle); 
myGraphics.DrawImage(myBitmap, compressionRectangle); 
+1

的問題是要獲得換算出位現有的。不以不同的比例繪製相同的位圖。 – mhcuervo 2014-06-05 15:33:05

6

計算的新高度和寬度(如果你有縮放因子)

float newWidth = horizontalScalingFactor * (float) originalBitmap->GetWidth(); 
float newHeight = verticalScalingFactor * (float) originalBitmap->GetHeight(); 

或縮放因子,如果新尺寸已知

float horizontalScalingFactor = (float) newWidth/(float) originalBitmap->GetWidth(); 
float verticalScalingFactor = (float) newHeight/(float) originalBitmap->GetHeight(); 

創建具有足夠空間的新的空位圖縮放圖像

Image* img = new Bitmap((int) newWidth, (int) newHeight); 

創建一個新的圖形上繪製創建位圖:

Graphics g(img); 

應用比例轉換爲圖形和繪製圖像

g.ScaleTransform(horizontalScalingFactor, verticalScalingFactor); 
g.DrawImage(originalBitmap, 0, 0); 

img現在是另一個帶縮放版原始圖像的位圖。

0

solution proposed by mhcuervo效果很好,除非原始圖像具有特定的分辨率,例如,如果它是通過讀取圖像文件創建的。

在這種情況下,你必須將原始圖像的分辨率適用於縮放因子:

Image* img = new Bitmap((int) newWidth, (int) newHeight); 
horizontalScalingFactor *= originalBitmap->GetHorizontalResolution()/img->GetHorizontalResolution(); 
verticalScalingFactor *= originalBitmap->GetVerticalResolution()/img->GetVerticalResolution(); 

(注:新Bitmap默認分辨率好像是96 ppi的,至少在我的電腦上)

或者更簡單地說,你可以更改新圖像的分辨率:

Image* img = new Bitmap((int) newWidth, (int) newHeight); 
img->SetResolution(originalBitmap->GetHorizontalResolution(), originalBitmap->GetVerticalResolution());