Cs50 Pset4。调整更多。我想不出怎么把它变小

Cs50 Pset4。调整更多。我想不出怎么把它变小,c,cs50,C,Cs50,我知道如何把图像放大,但就我个人而言,我不知道如何把它缩小。当前代码将使位图大小正确,但填充随机颜色。当前的代码对我来说很有意义,我认为问题可能在于标题或填充。请帮忙! #包括 #包括 #包括 #包括 #包括“bmp.h” int main(int argc,char*argv[]) { //确保正确使用 如果(argc!=4) { fprintf(标准,“用法:./f infle outfile\n”的大小); 返回1; } /*获取因子*/ 浮动f=atof(argv[1]); 如果(f1

我知道如何把图像放大,但就我个人而言,我不知道如何把它缩小。当前代码将使位图大小正确,但填充随机颜色。当前的代码对我来说很有意义,我认为问题可能在于标题或填充。请帮忙!

#包括
#包括
#包括
#包括
#包括“bmp.h”
int main(int argc,char*argv[])
{
//确保正确使用
如果(argc!=4)
{
fprintf(标准,“用法:./f infle outfile\n”的大小);
返回1;
}
/*获取因子*/
浮动f=atof(argv[1]);
如果(f<0.0 | | f>100.0)
{
fprintf(stderr,“系数超出界限\n”);
返回5;
}
//看看我们是不是在把它弄大
布尔大=真;
整数因子=0;

如果(f我在代码中发现的问题是,在源代码的宽度/高度上进行迭代,并尝试边读边写,最终会写入更多的数据,并可能导致文件指针不同步

例如,如果源图像为512x512,系数为3,则每行写入额外像素,这两种情况都是因为512*0.33与512/3不同,并且512%3!=0

我通常的做法是将数据加载到内存中,并在目标宽度/高度上迭代,从源中分配适当的像素

我没有BMP.h,所以我把Windows .h替换成了二进制文件模式,因为你不想让任何行结尾被翻译。我也在C++模式下编译,所以如果编译成C.</P>,你可能不需要几个版本。

#define WIN32_LEAN_AND_MEAN
#include <Windows.h>
#include <stdio.h>
#include <stdlib.h>

int main()
{
    float f = 0.33f;
    int factor = 1 / f;
    FILE *inptr = fopen("infile.bmp", "rb");
    FILE *outptr = fopen("outfile.bmp", "wb");

    BITMAPFILEHEADER bf, bfn;
    fread(&bf, sizeof(BITMAPFILEHEADER), 1, inptr);
    bfn = bf;
    BITMAPINFOHEADER bi, bin;
    fread(&bi, sizeof(BITMAPINFOHEADER), 1, inptr);
    bin = bi;

    if (bf.bfType != 0x4d42 || bf.bfOffBits != 54 || bi.biSize != 40 || bi.biBitCount != 24 || bi.biCompression != 0)
    {
        fclose(outptr);
        fclose(inptr);
        fprintf(stderr, "Unsupported file format.\n");
        return 4;
    }

    bin.biWidth *= f;
    bin.biHeight *= f;
    int srcStride = (bi.biWidth * sizeof(RGBTRIPLE) + 3) & ~3;
    int dstStride = (bin.biWidth * sizeof(RGBTRIPLE) + 3) & ~3;

    bin.biSizeImage = dstStride * abs(bin.biHeight);
    bfn.bfSize = bin.biSizeImage + sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
    fwrite(&bfn, sizeof(BITMAPFILEHEADER), 1, outptr);
    fwrite(&bin, sizeof(BITMAPINFOHEADER), 1, outptr);

    char* srcData = (char*)calloc(1, bi.biSizeImage);
    fread(srcData, bi.biSizeImage, 1, inptr);
    char* dstData = (char*)calloc(1, bin.biSizeImage);

    for (int i = 0, binHeight = abs(bin.biHeight); i < binHeight; i++)
    {
        RGBTRIPLE* src = (RGBTRIPLE*)&srcData[srcStride * i * factor];
        RGBTRIPLE* dst = (RGBTRIPLE*)&dstData[dstStride * i];
        for (int j = 0; j < bin.biWidth; j++)
        {
            dst[j] = src[j * factor];
        }
    }
    fwrite(dstData, bin.biSizeImage, 1, outptr);
    fclose(inptr);
    fclose(outptr);
    free(srcData);
    free(dstData);
    return 0;
}
#定义WIN32_LEAN_和_MEAN
#包括
#包括
#包括
int main()
{
浮球f=0.33f;
整数系数=1/f;
文件*inptr=fopen(“infile.bmp”、“rb”);
文件*outptr=fopen(“outfile.bmp”、“wb”);
位图文件头bf,bfn;
fread(&bf,sizeof(BITMAPFILEHEADER),1,inptr);
bfn=bf;
BitMapInfo标头bi,bin;
fread(&bi,sizeof(BitMapInfo标头),1,inptr);
bin=bi;
如果(bf.bfType!=0x4d42 | | bf.BFOFFFITS!=54 | | | bi.biSize!=40 | | bi.BIBIBITCOUNT!=24 | | bi.biCompression!=0)
{
fclose(outptr);
fclose(inptr);
fprintf(stderr,“不支持的文件格式。\n”);
返回4;
}
bin.biWidth*=f;
bin.biHeight*=f;
int srcStride=(bi.biWidth*sizeof(RGBTRIPLE)+3)和~3;
int-dststrade=(bin.biWidth*sizeof(RGBTRIPLE)+3)和~3;
bin.BISIZEMAGE=dstStride*abs(bin.biHeight);
bfn.bfSize=bin.biSizeImage+sizeof(BITMAPFILEHEADER)+sizeof(BitMapInfo Header);
fwrite(&bfn,sizeof(BITMAPFILEHEADER),1,outptr);
fwrite(&bin,sizeof(BitMapInfo头文件),1,outptr);
char*srcData=(char*)calloc(1,bi.biSizeImage);
fread(srcData,bi.biSizeImage,1,inptr);
char*dstData=(char*)calloc(1,bin.biSizeImage);
对于(inti=0,binHeight=abs(bin.biHeight);i
您是否检查了此行后面的系数?
系数=楼层(1/f)
这是整数除法,所以几乎可以肯定它是零。如果你要每2、3或4个像素采样一次,你希望你的因子是2、3、4j,就像你把它变大时一样,但不是每源像素写N个像素,而是忽略采样和写入之间的N个源像素。谢谢你的回答,例如,这行是有效的,f=0.25将返回4您是对的,我没有看到f是一个浮点。因为我不知道源图像或目标图像是什么样子,所以很难猜出问题。如果您有填充问题,第一行将是正确的,然后后面的每一行都将偏移一定量,如果不是偶数,颜色也将发生偏移。尝试bm白色背景和垂直黑色条纹的p。这会使填充问题变得非常明显。谢谢你这么多退休的忍者,我回家后会试一试!
#define WIN32_LEAN_AND_MEAN
#include <Windows.h>
#include <stdio.h>
#include <stdlib.h>

int main()
{
    float f = 0.33f;
    int factor = 1 / f;
    FILE *inptr = fopen("infile.bmp", "rb");
    FILE *outptr = fopen("outfile.bmp", "wb");

    BITMAPFILEHEADER bf, bfn;
    fread(&bf, sizeof(BITMAPFILEHEADER), 1, inptr);
    bfn = bf;
    BITMAPINFOHEADER bi, bin;
    fread(&bi, sizeof(BITMAPINFOHEADER), 1, inptr);
    bin = bi;

    if (bf.bfType != 0x4d42 || bf.bfOffBits != 54 || bi.biSize != 40 || bi.biBitCount != 24 || bi.biCompression != 0)
    {
        fclose(outptr);
        fclose(inptr);
        fprintf(stderr, "Unsupported file format.\n");
        return 4;
    }

    bin.biWidth *= f;
    bin.biHeight *= f;
    int srcStride = (bi.biWidth * sizeof(RGBTRIPLE) + 3) & ~3;
    int dstStride = (bin.biWidth * sizeof(RGBTRIPLE) + 3) & ~3;

    bin.biSizeImage = dstStride * abs(bin.biHeight);
    bfn.bfSize = bin.biSizeImage + sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
    fwrite(&bfn, sizeof(BITMAPFILEHEADER), 1, outptr);
    fwrite(&bin, sizeof(BITMAPINFOHEADER), 1, outptr);

    char* srcData = (char*)calloc(1, bi.biSizeImage);
    fread(srcData, bi.biSizeImage, 1, inptr);
    char* dstData = (char*)calloc(1, bin.biSizeImage);

    for (int i = 0, binHeight = abs(bin.biHeight); i < binHeight; i++)
    {
        RGBTRIPLE* src = (RGBTRIPLE*)&srcData[srcStride * i * factor];
        RGBTRIPLE* dst = (RGBTRIPLE*)&dstData[dstStride * i];
        for (int j = 0; j < bin.biWidth; j++)
        {
            dst[j] = src[j * factor];
        }
    }
    fwrite(dstData, bin.biSizeImage, 1, outptr);
    fclose(inptr);
    fclose(outptr);
    free(srcData);
    free(dstData);
    return 0;
}