2012-05-10 14 views
10

मुझे किसी दिए गए पृष्ठभूमि रंग कुंजी द्वारा बिटमैप के लिए एक करीबी फसल आयत की गणना करने की आवश्यकता है। निम्नलिखित चित्रों में आप देख सकते हैं कि निकट फसल होने का क्या अर्थ है।बिटमैप के करीबी फसल आयत की गणना कैसे करें?

enter image description here

enter image description here

आप देख सकते हैं, मैं सर्वोच्च, वाम-पंथी, सब से नीचा और दायीं पिक्सल खोजने की जरूरत है: पर बाईं ओर स्रोत, बंद फसल के दाईं ओर उत्पादन पर है जो करीबी फसल आयताकार बनाने के लिए पृष्ठभूमि से रंग में भिन्न होता है। तो, करीबी फसल आयत प्राप्त करने के लिए उन अलग बाहरी पिक्सल को कैसे ढूंढें? या, दूसरे शब्दों में, बिटमैप के करीबी फसल आयत की गणना कैसे करें?

+0

मैं कुछ जवाब दाऊद मुझ पर मदद की हाल ही में से कोड का एक मिश्रण की कोशिश की है। कॉम/प्रश्न/10503428/आकार बदलने के लिए-कैनवास-आसपास-ए-बिटमैप और http://stackoverflow.com/questions/10499069/moving-bitmap-pixels मैंने सोचा कि मैं इसे समझ सकता हूं लेकिन वास्तव में नहीं। मुझे ऐसा करने के लिए ResizeBitmapCanvas प्रक्रिया को अनुकूलित करने में सक्षम होना चाहिए, लेकिन मैं नहीं कर सका, मैं आसानी से भ्रमित हो जाता हूं। –

+0

@ ब्लॉबी ऐसा करने का एक तरीका है बिटमैप के प्रत्येक तरफ से शुरू करना और लूप वैरिएबल को कम करना जब तक आपको पृष्ठभूमि रंग से अलग पिक्सेल नहीं मिलता है, प्रत्येक तरफ और वॉयला के लिए प्रक्रिया दोहराएं, आपको स्वयं एक ऑटो क्रॉपिंग टूल मिल गया है – ComputerSaysNo

+0

@Dorin, आप इसे एक में 'ScanLine' पास गर्त कर सकते हैं, तो आप सिर्फ सीमा ;-) – TLama

उत्तर

11

आप इस कोड का उपयोग कर सकते हैं (आप इस पोस्ट की commented version रूप में अच्छी तरह पालन कर सकते हैं): http: // stackoverflow

procedure CalcCloseCrop(ABitmap: TBitmap; const ABackColor: TColor; 
    out ACropRect: TRect); 
var 
    X: Integer; 
    Y: Integer; 
    Color: TColor; 
    Pixel: PRGBTriple; 
    RowClean: Boolean; 
    LastClean: Boolean; 
begin 
    if ABitmap.PixelFormat <> pf24bit then 
    raise Exception.Create('Incorrect bit depth, bitmap must be 24-bit!'); 

    LastClean := False; 
    ACropRect := Rect(ABitmap.Width, ABitmap.Height, 0, 0); 

    for Y := 0 to ABitmap.Height-1 do 
    begin 
    RowClean := True; 
    Pixel := ABitmap.ScanLine[Y]; 
    for X := 0 to ABitmap.Width - 1 do 
    begin 
     Color := RGB(Pixel.rgbtRed, Pixel.rgbtGreen, Pixel.rgbtBlue); 
     if Color <> ABackColor then 
     begin 
     RowClean := False; 
     if X < ACropRect.Left then 
      ACropRect.Left := X; 
     if X + 1 > ACropRect.Right then 
      ACropRect.Right := X + 1; 
     end; 
     Inc(Pixel); 
    end; 

    if not RowClean then 
    begin 
     if not LastClean then 
     begin 
     LastClean := True; 
     ACropRect.Top := Y; 
     end; 
     if Y + 1 > ACropRect.Bottom then 
     ACropRect.Bottom := Y + 1; 
    end; 
    end; 

    if ACropRect.IsEmpty then 
    begin 
    if ACropRect.Left = ABitmap.Width then 
     ACropRect.Left := 0; 
    if ACropRect.Top = ABitmap.Height then 
     ACropRect.Top := 0; 
    if ACropRect.Right = 0 then 
     ACropRect.Right := ABitmap.Width; 
    if ACropRect.Bottom = 0 then 
     ACropRect.Bottom := ABitmap.Height; 
    end; 
end; 

procedure TForm1.Button1Click(Sender: TObject); 
var 
    R: TRect; 
    Bitmap: TBitmap; 
begin 
    CalcCloseCrop(Image1.Picture.Bitmap, $00FFA749, R); 
    Bitmap := TBitmap.Create; 
    try 
    Bitmap.SetSize(R.Width, R.Height); 
    Bitmap.Canvas.CopyRect(Rect(0, 0, R.Width, R.Height), Image1.Canvas, R); 
    Image1.Picture.Bitmap.Assign(Bitmap); 
    finally 
    Bitmap.Free; 
    end; 
end; 
+3

+1 अच्छा काम आदमी! – ComputerSaysNo

+0

उत्कृष्ट सामान TLama, इस से कोई क्रेडिट नहीं ले रहा है;) मैं बस इच्छा करता हूं कि मैं सिर्फ आपका जवाब नहीं समझ सकता, बल्कि कई अन्य। संपादित करें: बिटमैप पर पिक्सेल, क्या वे मूल रूप से सोचा गया है कि वे एक अदृश्य बॉक्स (बाउंडिंग बॉक्स) से घिरे हुए हैं? यदि ऐसा है तो यह Rect का उपयोग करके पाया जाता है? –

+0

मैं इस पर टिप्पणी करने की कोशिश करूंगा, लेकिन समीक्षा के बाद। अदृश्य बॉक्स के बारे में, क्या आपका मतलब फसल की छवि के आस-पास कुछ खाली जगह है, है ना? मैं कुछ जोड़ दूंगा, लेकिन अगर पहली (गैर-पृष्ठभूमि) पिक्सेल स्थिति [0; 0] पर होगी, तो क्या आप इसे छवि आकार के पीछे विस्तारित करना चाहते हैं और इस बाहरी स्थान को ABackColor से भरना चाहते हैं? – TLama

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