2010-07-17 15 views
5

मैं वास्तविक छवि (फसल) छोड़कर, एक छवि से सभी सफेद या पारदर्शी पिक्सल को हटाने की कोशिश कर रहा हूं। मैंने कुछ समाधानों की कोशिश की है, लेकिन कोई भी काम नहीं कर रहा है। कोई सुझाव या क्या मैं रात्रि लेखन छवि फसल कोड खर्च करने जा रहा हूं?सी # - फसल पारदर्शी/सफेद स्थान

+0

तो वहाँ अन्य लोग हैं, जो लगातार बार बार कोड की एक ही पंक्ति लिख का सपना हैं? मैंने सोचा कि मैं अकेला था :-) –

+1

यदि आप कम से कम एक दृष्टिकोण का विवरण देते हैं और समझाया कि यह कैसे काम नहीं करता है तो यह समुदाय की मदद करेगा। –

उत्तर

3
public Bitmap CropBitmap(Bitmap original) 
{ 
    // determine new left 
    int newLeft = -1; 
    for (int x = 0; x < original.Width; x++) 
    { 
     for (int y = 0; y < original.Height; y++) 
     { 
      Color color = original.GetPixel(x, y); 
      if ((color.R != 255) || (color.G != 255) || (color.B != 255) || 
       (color.A != 0)) 
      { 
       // this pixel is either not white or not fully transparent 
       newLeft = x; 
       break; 
      } 
     } 
     if (newLeft != -1) 
     { 
      break; 
     } 

     // repeat logic for new right, top and bottom 

    } 

    Bitmap ret = new Bitmap(newRight - newLeft, newTop - newBottom); 
    using (Graphics g = Graphics.FromImage(ret) 
    { 
     // copy from the original onto the new, using the new coordinates as 
     // source coordinates for the original 
     g.DrawImage(...); 
    } 

    return ret 
} 

ध्यान दें कि यह कार्य गंदगी के रूप में धीमा हो जाएगा। GetPixel() अविश्वसनीय रूप से धीमा है, और Width और Height को एक लूप के अंदर Bitmap के गुणों को भी धीमा कर रहा है। LockBits ऐसा करने का सही तरीका होगा - यहां स्टैक ओवरफ्लो पर कई उदाहरण हैं।

+1

धन्यवाद, मुझे वहां आधा रास्ता मिला। एकमात्र समस्या यह है कि, यदि मैं निर्दिष्ट आकार से बड़ा हूं तो भी मैं छवि का आकार बदलना चाहता हूं। टिप्पणी बॉक्स में फिट होने की तुलना में अधिक कोड है, लेकिन मूल छवि केवल अंतिम छवि के बारे में आधा लेती है। कोड http://pastebin.com/He3S8aCH – Echilon

+0

पर है, मैंने दो चर ट्रांसफर किए हैं: पी। समस्या ठीक हो गई है, जल्द ही एक ब्लॉग पोस्ट की उम्मीद है (यहां से लिंक होगा)। – Echilon

+0

मुझे लगता है कि मैं भी खराब हो गया। बिट्स जो 'रंग। आर! = 0' आदि कहती हैं, वास्तव में' रंग। आर! = 255' कहनी चाहिए, क्योंकि एक सफेद पिक्सेल में प्रत्येक के लिए 255 के आर, जी और बी मान होंगे (0 जीबी का आरजीबी, 0 काला है)। यदि मूल संस्करण आपके लिए काम करता है, तो शायद यह केवल पारदर्शी (और काला) पिक्सल फसल हो गया है। – MusiGenesis

2

प्रति-पिक्सेल जांच को चाल करना चाहिए। शीर्ष & नीचे से खाली रेखा खोजने के लिए प्रत्येक पंक्ति को स्कैन करें, बाएं & दाएं बाधाओं को खोजने के लिए प्रत्येक पंक्ति को स्कैन करें (यह पंक्तियों या स्तंभों के साथ एक पास में किया जा सकता है)। जब बाधा पाई जाती है - छवि के हिस्से को दूसरे बफर में कॉपी करें।

9

तो, आप जो करना चाहते हैं वह शीर्ष, बाएं सबसे अधिक सफेद/पारदर्शी पिक्सेल और नीचे, सबसे अधिक गैर सफेद/पारदर्शी पिक्सेल है। ये दो निर्देशांक आपको एक आयताकार देंगे जो आप निकालने के बाद कर सकते हैं।

// Load the bitmap 
    Bitmap originalBitmap = Bitmap.FromFile("d:\\temp\\test.bmp") as Bitmap; 

    // Find the min/max non-white/transparent pixels 
    Point min = new Point(int.MaxValue, int.MaxValue); 
    Point max = new Point(int.MinValue, int.MinValue); 

    for (int x = 0; x < originalBitmap.Width; ++x) 
    { 
    for (int y = 0; y < originalBitmap.Height; ++y) 
    { 
     Color pixelColor = originalBitmap.GetPixel(x, y); 
     if (!(pixelColor.R == 255 && pixelColor.G == 255 && pixelColor.B == 255) 
     || pixelColor.A < 255) 
     { 
     if (x < min.X) min.X = x; 
     if (y < min.Y) min.Y = y; 

     if (x > max.X) max.X = x; 
     if (y > max.Y) max.Y = y; 
     } 
    } 
    } 

    // Create a new bitmap from the crop rectangle 
    Rectangle cropRectangle = new Rectangle(min.X, min.Y, max.X - min.X, max.Y - min.Y); 
    Bitmap newBitmap = new Bitmap(cropRectangle.Width, cropRectangle.Height); 
    using (Graphics g = Graphics.FromImage(newBitmap)) 
    { 
    g.DrawImage(originalBitmap, 0, 0, cropRectangle, GraphicsUnit.Pixel); 
    } 
+0

महान समाधान! मैंने '|| हटा दिया pixelColor.A <255' इसे काम करने के लिए। – krlzlx

0

मुझे लगभग 10 मिनट में कुछ हज़ार .jpg फ़ाइलों को ट्रिम करने के लिए एक विधि मिली, लेकिन मैंने कोड में ऐसा नहीं किया। मैंने स्नैग-इट संपादक की कनवर्ट फीचर का इस्तेमाल किया। मुझे नहीं पता कि यह आपके लिए एक विकल्प है, अगर आपको एक बार या आपकी आवश्यकता चल रही है, तो सॉफ़्टवेयर की कीमत के लिए, जो कि बहुत कुछ नहीं है, मैंने इसे एक सभ्य कामकाज माना। (मैं के लिए काम नहीं है या Techsmith प्रतिनिधित्व करते हैं।)

जॉय

संबंधित मुद्दे