⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hi2bw.cpp

📁 djgpp bt878 capture for DOS
💻 CPP
字号:
#include "hi2bw.h"
#include "mydefs.h"
#include "graphics.h"
#include "textout.h"
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

void hi2bw(int video, int x, int y, int dx, int dy, char* data)
{
    register int i;
    register int j;
    register int offset = video + (y*384 + x)*2;
    register short* addr;
    register int value;
    char r;
    char g;
    char b;
    
    for(i=0; i<dy; i++)
    {
        addr = (short*)(offset + i*768);
        for(j=0; j<dx; j++)
        {
             value = *addr;
             b = ((value&0x001f)*0x1c)>>5;
             g = ((value&0x07e0)*0x97)>>11;
             r = ((value&0xf800)*0x4d)>>16;
             *data = r+g+b;
             data++;
             addr++;
        }   
    }
}

char Filter(char* data, int dx, int dy)
{
    int i, j;
    int value;
    int sum = 0;
    int minim = 255;
    int len = 0;
    for(j=0; j<dy; j++) { 
        for(i=1; i<dx; i++)
        {
            value = abs(*(data+j*dx + i-1) - *(data+j*dx+i));
            
            if(value > 5) {
                minim = min(minim, value);
                sum = sum + value;
                len++;
            }
        }
    }
    if(!sum) {
        len = 1;
    }
    return ((unsigned char) (((sum-minim*len)*8)/len));
}

void ShowProgress(int video, int x, int y, unsigned char value)
{
    char buff[8];

    y += 32;
    int delta = 256 - value;
    sprintf(buff, "%-3d", value);
    SetLineColor(RGB(255, 255, 255));
    DrawVerLine(video, x, y, y + 256);
    DrawVerLine(video, x+1, y, y + 256);
    DrawVerLine(video, x+2, y, y + 256);
    DrawVerLine(video, x+3, y, y + 256);
    SetLineColor(RGB(127, 127, 255));
    DrawVerLine(video, x, y + delta , y + 256);
    DrawVerLine(video, x+1, y + delta , y + 256);
    DrawVerLine(video, x+2, y + delta , y + 256);
    DrawVerLine(video, x+3, y + delta , y + 256);
    SetLineColor(RGB(255, 127, 127));
    DrawText(video, x+10, y, buff);
}

void ShowSelectPart(int video, int x, int y, int dx, int dy, unsigned char* data)
{
    int i, j;
    unsigned char temp;
    unsigned char value = 0;
    double delta;
    
    
    for(j=0; j<dy; j++)
    {
        for(i=0; i<dx; i++)
        {
            temp = *(data + j*dx + i);
            if(value < temp) value = temp;
        }
    }
    
    asm ("emms");
    delta = 255.0 / (double)value; 
    for(j=0; j<dy; j++)
    {
        for(i=0; i<dx; i++)
        {
            value = *(data + j*dx + i);
            value = (unsigned char)(((double)value) * delta);
            SetBWPixel(video, x+i*2, y+j*2, value);
            SetBWPixel(video, x+i*2+1, y+j*2, value);
            SetBWPixel(video, x+i*2, y+j*2+1, value);
            SetBWPixel(video, x+i*2+1, y+j*2+1, value);
        }
    }
}
    
void ClearHistogram(int video, int x, int y)
{
    int i;
    SetLineColor(RGB(0, 0, 0));
    for(i=0; i<256; i++)
    {
        DrawVerLine(video, x+i, y-256, y);
    }
}

void ShowHistogram(int video, int x, int y, int dx, int dy, unsigned char* data)
{
    int i, j;
    unsigned char value;
    unsigned char buffer[256] = {0};
    double delta;
    
    SetLineColor(RGB(0, 191, 191));
    
    for(j=0; j<dy; j++)
    {
        for(i=0; i<dx; i++)
        {
            value = *(data + j*dx + i);
            buffer[value]++;
        } 
    }
    
    value = 0;
    for(i=0; i<256; i++)
    {
        //value = max(buffer[i], value);
        if(value<buffer[i]) value = buffer[i];
        
    }

    asm ("emms");
    
    delta = 255.0 / (double)value;
    int y1 = y-256;
    
    for(i=0; i<256; i++)
    {
        value = (int)(((double)buffer[i])*delta);
        SetLineColor(RGB(0, 191, 191));
        DrawVerLine(video, x+i, y - value, y);
        SetLineColor(RGB(255, 0, 255));
        DrawVerLine(video, x+i, y1, y - value);
    }
}

void ShowLineHistogram(int video, int x, int y, int dx, int dy, unsigned char* data)
{
    int i, j;
    int middle = (dy+1)/2;
    unsigned char value = 0;
    unsigned char temp;
    double delta;
    
    for(i=0; i<dx; i++)
    {
        temp = *(data + middle*dx + i);
        if(value < temp) value = temp;
    }
    
    asm ("emms");
    delta = 1.0;//255.0 / (double)value;
    int y1 = y-256;
    
    for(i=0; i<dx; i++)
    {
        temp = *(data + middle*dx + i);
        value = (int)((double)temp*delta);
        SetLineColor(RGB(0, 191, 191));
        DrawVerLine(video, x+i, y - value, y);
        SetLineColor(RGB(255, 127, 127));
        DrawVerLine(video, x+i, y1, y-value);
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -