image processing:مشکل در نمایش بعضی رنگ ها در BitmapData

hoceyn

Active Member
من یه کد نوشتم که با استفاده از ماتریس روی عکسها فیلتر اعمال می کنه.چیز های لازم برای اجرا:
1-یک movieClip به اسم loader_mc
2.یک دکمه به اسمloaderbtn
3-یک تکس باکس به اسم address_txt
کافیه یک عکس رو باز کنید و کد زی رو وارد کنید. نمی دونم مشکل چیه که همه جای عکس blur میشه بجز نگهای مشکی
PHP:
import flash.display.BitmapData;
var sharp:Array = 
[ 0, -1, 0,
-1, 5, -1,
0, -1, 0];


var blur:Array = 
[ 1, 2, 1,
  2, 4, 2,
  1, 2, 1];

var i:Number;
for(i=0;i<blur.length;i++)
blur[i]=blur[i]*1/16;

loaderbtn.addEventListener(MouseEvent.CLICK, loadonClick);
function loadonClick(evt:MouseEvent):void 
{
var myLoader:Loader = new Loader();
myLoader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, onProgressStatus);
myLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, onLoaderReady);

var fileRequest:URLRequest = new URLRequest(address_txt.text);
myLoader.load(fileRequest);

function onProgressStatus(e:ProgressEvent) {   
      // this is where progress will be monitored     
      trace(e.bytesLoaded, e.bytesTotal); 
}

function onLoaderReady(e:Event) {
    var bit:Bitmap = Bitmap(myLoader.content);
    bit.bitmapData=matrixapply(bit.bitmapData,blur);
    stage.addChild(bit)
}}
function matrixapply(imbmd:BitmapData,matris:Array):BitmapData
{
    var bmd:BitmapData=imbmd.clone();
    
    for(var i:Number=1;i<bmd.width;i++)
        for(var j:Number=1;j<bmd.height;j++)
        {
            var color:Array=new Array();
            for(var k:Number=-1;k<=1;k++)
                for(var l:Number=-1;l<=1;l++)
                {
                    var pixelValue:uint=imbmd.getPixel(i+k, j+l);
                    var s:String= pixelValue.toString(16);
                    var r:uint=parseInt(s.substr(0,2),16);
                    var g:uint=parseInt(s.substr(2,2),16);
                    var b:uint=parseInt(s.substr(4,2),16);
                    color.push([r,g,b]);
                }
                
            
       var red:uint = color[0][0]*matris[0]
                    + color[1][0]*matris[1]
                    + color[2][0]*matris[2]
                    + color[3][0]*matris[3]
                    + color[4][0]*matris[4]
                    + color[5][0]*matris[5]
                    + color[6][0]*matris[6]
                    + color[7][0]*matris[7]
                    + color[8][0]*matris[8];

      var green:uint = color[0][1]*matris[0]
                    + color[1][1]*matris[1]
                    + color[2][1]*matris[2]
                    + color[3][1]*matris[3]
                    + color[4][1]*matris[4]
                    + color[5][1]*matris[5]
                    + color[6][1]*matris[6]
                    + color[7][1]*matris[7]
                    + color[8][1]*matris[8];
                    
       var blue:uint= color[0][2]*matris[0]
                    + color[1][2]*matris[1]
                    + color[2][2]*matris[2]
                    + color[3][2]*matris[3]
                    + color[4][2]*matris[4]
                    + color[5][2]*matris[5]
                    + color[6][2]*matris[6]
                    + color[7][2]*matris[7]
                    + color[8][2]*matris[8];
                    
            s=red.toString(16)+green.toString(16)+blue.toString(16)
            bmd.setPixel(i,j,parseInt(s,16));
        }//for loop
    return bmd;
}
چرا روی رنگ مشکی(و هر جا که رنگ آبی 256) مشکلنمایش داره؟؟؟
 

پیوست ها

  • Desktop.rar
    402.1 کیلوبایت · بازدیدها: 35
سلام دوست عزیز همه چیز درسته نمیدونم شاید به خاطر عکستون باشه با یه عکس دیگه این کار رو بکنید من با یک عکس دیگه انجام دادم

مشکل نداشت اگه فهمیدی مارو هم بی خبرنزار
 

benyamin_pc

Well-Known Member
نه مشکل که داره اما بهترین راه برای این کار استفاده از توابع و کلاسهای آماده خود فلش هست
 

BehrouzPc

پــــادشــاه فــلــــش
دوست عزیز ، برای این کار می توانید این تابع را با تابع خودتات جا به جا کنید
نمونه شما پردازش زیادی انجام می دهد که در نهایت سرعت پروژه را بسیار کاهش خواهد داد...
PHP:
function matrixapply(imbmd:BitmapData,matris:Array):BitmapData
{
    var bmd:BitmapData = imbmd.clone();
    
    var effect_Blur:BlurFilter = new BlurFilter (4,4,3);
    bmd.applyFilter(bmd , new Rectangle(0,0,bmd.width , bmd.height),new Point(0,0) , effect_Blur);

    return bmd;
}

موفق و پیروز باشید
 

hoceyn

Active Member
نه مشکل که داره اما بهترین راه برای این کار استفاده از توابع و کلاسهای آماده خود فلش هست
مرسی. اما این پروژه است نمی شه از توابع آماده استفاده کرد.

دوست عزیز ، برای این کار می توانید این تابع را با تابع خودتات جا به جا کنید
نمونه شما پردازش زیادی انجام می دهد که در نهایت سرعت پروژه را بسیار کاهش خواهد داد...
نمونه بهترش استفاده از این کلاسه که اجازه ی فیلتر های بر مینای ماتریس رو میده:
PHP:
var blur:Array = 
[ 1, 2, 1,
  2, 4, 2,
  1, 2, 1];
var conv:ConvolutionFilter = new ConvolutionFilter(3, 3,blur);
    my_bitmap_or_movieclip.filters = [conv]
راه میونبر زیاده!! اما من می خوام مشکل کدم رو بهم بگید!

بی نهایت متشکر اما اگه ایده ای داشتید ، پاسخ بدید.
 

benyamin_pc

Well-Known Member
بنده هم منظورم همین کلاس و توابعش بود که تو هلپ فلشم نمونش هست ConvolutionFilter حالا نمیدونم چرا گفتین نمیشه استفاده کرد
البته راه معمول و پرکاربردش همونه که بهروز جان گفت
راه شما کاری به فلش نداره و پایه ایه و من اونو تو مت لب پیاده کرده بودم و تقریبا همینطور بود
 

hoceyn

Active Member
مشکل رو یه جورای ماست مالی کردم. اگه از متغیر از کلاس color برای نگه داشتن رنگها استفاده کنیم به جای uint مشکل حل میشه. اما هنوز نمی دونم چرا با uint جواب نداد.:-?
 

benyamin_pc

Well-Known Member
احتمال داره مشکل از thread باشه (چون همچین مشکل مشابهی تو فلش داشتم و با شبیه سازی ترد حلش کردم) بررسیش می کنم و اینجا میگم
 

جدیدترین ارسال ها

بالا