如题,最好有代码。也可以是链接。
发到。顶者有分

解决方案 »

  1.   

    http://www.pudn.com/downloads70/sourcecode/graph/detail252655.html 这个是转换成黑白的也想问一下,黑白的是多少位的? 
      

  2.   

    http://topic.csdn.net/t/20061212/15/5224925.htmlhttp://topic.csdn.net/t/20050304/14/3824679.html
      

  3.   

    分别取出256色、16位、24位的R,G,B三个值,然后再组合成一个32位的值即可。
    一个简单的色彩解码然后再编码的过程。
      

  4.   

    有点莫名这个作用是什么
    把rgb的格式值设置成32位的方式自然就ok
    但是这样的图像和原来没有什么分别,毕竟原图像素信息并没有发生变化
      

  5.   

    逐个像素转换。256色用索引值查颜色表;16位色R、G、B分别占5、6、5位,用位运算来分别提取;24位直接取R、G、B。转32位就是把R、G、B作为前3字节,第4字节补0。
      

  6.   

    256的处理调色板,用调色板中的每个结构体的前3字节替换该调色板对应的那个颜色值。也就是一个查表的过程,和你的显卡做的工作差不多。16位要把5位(或6位)按比例扩展成8位就行了以上都是把图转为24位的方法,
    然后把透明数据全置0,即每个点的第4个字节变逐个转换听上去麻烦,因为是位图,完全不需要考虑与周边其它点的关系,每个点的处理时间都是常数,实际上复杂度为O(n), 复杂度看来应该是最简单的了。当然在并行机上你可以同时进行N个点的转换。还有一个变32位的方法,把图处理成CMYK格式的,每个点需要4个字节。
    把RGB 查表换算成 CMY值,
    然后直接用G值直接作K值就行。
      

  7.   

    这句话  :逐个像素转换是不是效率太低啊  就是一句错误的话图像处理  很多情况下的算法都是要遍历每个像素的,并且遍历本身速度的快慢是由算法的内容有关的。如何将256色、16位、32位的位图转为32位 //至少我现在已经找到了一段非常简洁的代码,确实不用逐个像素转换,只是还需要再测试一下而已。不错,有些函数表面上是不需要遍历,比如实现你这个功能 可以直接调用GDI+的Lockbits函数,设置一个简单的参数就可以了,但是他内部的实现上肯定还是要一个一个像素的计算的。
      

  8.   

    看来楼上是不明白什么叫效率。运算速度是效率,编码就不是效率吗?
    看下面两行代码:
    for(int i = 0; i < 10; i++) Func();
    Func();Func();Func();Func();Func();Func();Func();Func();Func();Func();
    你说哪个运算效率高,哪个代码效率高?是不是都应该写成第二行的格式。
      

  9.   

    Ok
    你对 
    我也不想说了。至于你这问题的答案 ,提个参考意见吧,纯粹学术性的。我给你一段VB的代码,其中的Host.InitializeDIB是一个创建32位的DIBSECITON的过程。
    希望我得到的不在是攻击
    同时为我前面不当的言语表示道歉。 If IsBmp(FileName) = True Then
            Dim Image       As Long
            Dim Dimensions  As RECTF, Rct           As RECT
            Dim BmpData     As BitmapData, Rtn      As Long
            GdipLoadImageFromFile StrPtr(FileName), Image     ‘使用GDI+加载图像
            If Image <> 0 Then
                GdipGetImageBounds Image, Dimensions, UnitPixel   ' 得到图像的大小,以像素为单位,这个函数理论上不会不成功
                If Host.InitializeDIB(CLng(Dimensions.nWidth), CLng(Dimensions.nHeight)) = True Then
                    Rct.Right = Dimensions.nWidth
                    Rct.Bottom = Dimensions.nHeight
                    GdipBitmapLockBits Image, Rct, ImageLockModeRead, PixelFormat32bppARGB, BmpData     '以ARGB格式读取图像数据
                    CopyMemory ByVal Host.Pointer, ByVal BmpData.scan0, Dimensions.nWidth * Dimensions.nHeight * 4  '复制图像数据
                    GdipBitmapUnlockBits Image, BmpData
                    GdipDisposeImage Image
                     LoadPictureFromFile = True
                End If
            Else
                GdipDisposeImage Image              '不知道在这种情况下需要不需要Dispose
            End If
        End If
        
      

  10.   

    谢啦,我要的就是类似这样的代码,而且也已经找到mfc的版本了。
    为什么我不喜欢用逐个像素处理的方法,就是因为第一我没法对所有格式进行测试,第二不能保证兼容性。
    我想既然我们都在微软的平台下干活,最好的情况还是尽量采用它所提供的方法,牺牲一定的速度,换来整个项目的速度。
    本人最近因为项目的关系,刚刚接触mfc+gdi才一个月,难免会有很多大家看起来很幼稚的问题,但是我想这是每一个新手的必经之路吧,
    就是希望能帮忙的尽量帮个忙,帮不了的顶一下也可以。
      

  11.   

    想要再快就比较难了,首先要知道与效率有关的一些基础知识,例如顺序执行比循环快,DWORD操作比BYTE操作快等,然后再考虑如何利用这些特性提高效率。很多时候需要做多个分支(每个分支都有很多代码)针对不同情况分别设计,以提高效率,例如把256色、16位色、24位色分别处理,此外还可以根据图象的内容特性来做分支。
    源位图的数据肯定是都要读一遍的,目标位图的数据也肯定是要写一遍的,这部分没法省,只能是考虑尽量减少循环次数、减少循环内的分支、少用BYTE操作。