2013-02-19 38 views
1

是否可以通過編程測量C#中PNG邊(左上角)的填充(空白區域)?我可以以某種方式從像素開始一邊逐像素地分析圖像,檢查像素是否有任何不清晰或空的東西?我如何確定像素是空的而不是顏色?以編程方式測量PNG圖像的填充/清除側邊空間

我的PNG被加載到UIImageView,但我可以處理PNG或UIImage/UIImageView。什麼都有效。

Here's a PNG

這裏有一個PNG

Here's what I want to measure

這是我希望以編程方式測量的東西。

--------------這裏的解決方案顯然貼----------------

UIImage Image = UIImage.FromFile("image.png"); 
    IntPtr bitmapData = RequestImagePixelData(Image); 


    PointF point = new PointF(100,100); 

    //Check for out of bounds 
    if(point.Y < 0 || point.X < 0 || point.Y > Image.Size.Height || point.X > Image.Size.Width) 
    { 
     Console.WriteLine("out of bounds!"); 
    } 
    else 
    { 
     Console.WriteLine("in bounds!"); 


     var startByte = (int) ((point.Y * Image.Size.Width + point.X) * 4); 

     byte alpha = GetByte(startByte, bitmapData); 

     Console.WriteLine("Alpha value of an image of size {0} at point {1}, {2} is {3}", Image.Size, point.X, point.Y, alpha); 
    } 




    protected IntPtr RequestImagePixelData(UIImage InImage) 
    { 
     CGImage image = InImage.CGImage; 
     int width = image.Width; 
     int height = image.Height; 
     CGColorSpace colorSpace = image.ColorSpace; 
     int bytesPerRow = image.BytesPerRow; 
     int bitsPerComponent = image.BitsPerComponent; 
     CGImageAlphaInfo alphaInfo = image.AlphaInfo; 

     IntPtr rawData; 

     CGBitmapContext context = new CGBitmapContext(rawData, width, height, bitsPerComponent, bytesPerRow, colorSpace, alphaInfo); 
     context.SetBlendMode(CGBlendMode.Copy); 
     context.DrawImage(new RectangleF(0, 0, width, height), image); 

     return context.Data; 
    } 


    //Note: Unsafe code. Make sure to allow unsafe code in your 
    unsafe byte GetByte(int offset, IntPtr buffer) 
    { 
     byte* bufferAsBytes = (byte*) buffer; 
     return bufferAsBytes[offset]; 
    } 

現在我需要做解析每個像素並確定清晰像素停止位置的邏輯。這個邏輯非常簡單,所以我不打算髮布。簡單地從雙方開始,按照自己的方式工作,直到找到不爲零的alpha值。

感謝大家的幫助!

+0

請更具體。你想處理PNG文件,或加載到你的應用程序的圖像?你有嘗試過什麼嗎? – 2013-02-19 14:55:14

+0

我正在考慮處理PNG文件。如果有辦法處理UIImage,我也可以這樣做,但我現在還不知道怎麼做 – LampShade 2013-02-19 14:56:36

回答

1

您可以通過檢查其Alpha值是否等於(或接近)0來檢查像素是否爲空。不知道您正在使用哪個API,但是您應該能夠獲取RGBA中的像素顏色。

行掃描應該允許您確定多少邊界是「空的」。

+0

你知道如何解析UIImage或PNG本身嗎?如果我的UIImage變量名爲「myImage」,我可以看到一些有用的信息,比如myImage.CGImage.BytesPerRow和myImage.CGImage.Height,myImage.CGImage.Width。但是,我如何解析圖像? – LampShade 2013-02-19 15:32:42

+1

我沒有安裝Monotouch,所以我不能給你一個確切的答案,但它看起來類似於這個問題:http://stackoverflow.com/questions/2597198/retrieving-a-pixel-alpha-value- for-a-uiimage-monotouch – 2013-02-19 15:44:25

+0

非常感謝!我在看這個,但有一些問題實現它,因爲從那篇文章後代碼語法已經改變。我爲任何感興趣的人提供了我的工作源代碼。 – LampShade 2013-02-19 16:23:50

相關問題