image1.canvas.pixels[i,j]:=????
是个256的灰度图,那个???是我想添加的颜色,
应该写什么呀??类型,长度??
能不能将一幅256图的颜色经过均衡即ss[i,1]存颜色从0..255,s[i,2]存比例
image1.cancas.pixels[i,j]:= round( ss[此处是原图一点的颜色,2]*255)
我试不行,不知哪错了

解决方案 »

  1.   

    pixel需要一个Tcolor类型的值,
    不管你是什么模式的图,
    内部都是转成24位处理的,
    要处理灰度图的亮度比例,
    只要3原色分别做同样处理就可以了,
    首先取出原图一点的值:
    var myColor:Tcolor;//取的点的颜色
        r,g,b:byte;//3原色
        s: integer;//变换比例
    myColor:=image1.canvas.pixels[i,j];
    然后分别取出此点r,g,b值:
    r:=getrvalue(mycolor);
    g:=getgvalue(mycolor);
    b:=getbvalue(mycolor);
    再对r,g,b做变换:
    r:=r*s;
    g:=g*s;
    b:=b*s;
    最后写回去:
    image1.canvas.pixels[i,j]:=rgb(r,g,b);注意处理后的r,g,b值要控制在0-255间
    也就是s必须在0..1
      

  2.   

    你能明白DDB和DIB的区别吗?直接读写DIB的内存吧,用GDI来操作,实在没效率。
      

  3.   

    to: stlont
    这几天我已经自己弄出来了!!
    thank you all the same!!我等一等结贴
    to: ehom
    你好,我现在非常希望提高效率!!
    可我不懂ddb与gdi的区别呀!!我们这的老师也没牛的
    图象的作业我看c++书的代码执行效率特高,而我这就……
    拜托师兄给段代码吧!!!!
    谢谢
      

  4.   

    代码给不了你的需求说的实在是不太容易让人明白知道Bitmap.ScanLine吗?不明白可以查帮助,不过了解DIB的内存格式也是必须的。8位的比较简单,只要考虑每行的DWORD补齐。用Bitmap.ScanLine[Bitmap.Height-1]取到DIB内存的首地址,其它全部自己处理自然可以做到和你看到的那些C++一样的效率,如果你用MFC,用CDC类,或者直接用GDI SetPixel效率也和用Canvas毫无差别。这种问题和语言根本就毫无关系。
      

  5.   

    不明白DIB/DDB是什么,这种问题建议看本入门书籍,比如Windows程序设计,学会利用google会让你受益匪浅。
      

  6.   

    多谢批评
    最近正在学这个,我发现scanline在作有的东西时不方便,比如任意角度旋转!!
    只好用pixels,这时效率与vc++就有很大差距,怎么办呀
    google也不太会用,要你讲似乎挺麻烦你的,也超出了问题的范围!!!我自己看吧……
    哎,要学的太多了
      

  7.   

    >>我发现scanline在作有的东西时不方便,比如任意角度旋转!!
    >>只好用pixels,这时效率与vc++就有很大差距这和开发工具有关系???毫无关系.我上面已经把理由说的非常非常清楚!!!你觉得VC++效率高?很遗憾Delphi可以写出完全一样的代码?你可以把你认为效率高的任何C++代码用Delphi改写出来,效率不会有差别。如果你是选择用GDI,用VC++也是一样慢,会有区别?不会,一点区别都没有。什么叫方便?什么叫不方便?DIB内存一样可以用X、Y两个参数的方式去访问像素信息,这只是封装的问题。你的整个观点还是完全错误的。