私はいくつかの画像処理機能を開発する必要があるプロジェクトを持っています。関数の1つは画像を縮小することです。 NONE この関数が呼び出されると、あなたが構成されます新しいイメージを作成する必要があります? 出力を平均化するために、ブロックの幅と高さを示す整数: これは、機能の説明イメージを縮小するC++ - 'System.AccessViolationException'
void averageRegions(int blockWidth, int blockHeight)
入力がありますサイズのブロックごとに1ピクセルのブロックサイズ blockWidth元のイメージのblockHeightピクセル。各ピクセルは元のイメージ内の 領域内のピクセルの平均カラーです。 これを2つの関数に分割し、この関数内からヘルパー関数を呼び出す方が簡単かもしれないことに注意してください。 2番目の関数は、与えられたピクセルのブロックの平均値を計算し、使用する元の関数にそれを返します。しかし、この実装はあなた次第です!あなたが適切と思うようにそれを完了してください。
私はしかし、アプリを閉じた後、私はこのエラー型「System.AccessViolationException」の未処理の例外がMCS2514Pgm2.exe で発生しました追加情報を得ることのコードを完了している
:読み取りまたは書き込みをしようとしました保護されたメモリ。これはしばしば、他のメモリが壊れていることを示します。
又はこれ
ヒープ破損検出:0x004cF6c0 CRTで通常ブロック(#126)の後に、アプリケーションがヒープ時間を浪費の終了後にメモリに書き込んだことを検出しました。
この
が、これはimage.h#ifndef IMAGE
#define IMAGE
#include <atlimage.h>
#include <string>
#include <cstdlib>
#include "globals.h"
#include "pixel.h"
using namespace std;
class image {
public:
image(); //the image constructor (initializes everything)
image(string filename); //a image constructor that directly loads an image from disk
~image(); //the image destructor (deletes the dynamically created pixel array)
void createNewImage(int width, int height); //this function deletes any current image data and creates a new blank image
//with the specified width/height and allocates the needed number of pixels
//dynamically.
bool loadImage(string filename); //load an image from the specified file path. Return true if it works, false if it is not a valid image.
//Note that we only accept images of the RGB 8bit colorspace!
void saveImage(string filename); //Save an image to the specified path
pixel** getPixels(); //return the 2-dimensional pixels array
int getWidth(); //return the width of the image
int getHeight(); //return the height of the image
void viewImage(CImage* myImage); //This function is called by the windows GUI. It returns the image in format the GUI understands.
private:
void pixelsToCImage(CImage* myImage); //this function is called internally by the image class.
//it converts our pixel struct array to a standard BGR uchar array with word spacing.
//(Don't worry about what this does)
pixel** pixels; // pixel data array for image
int width, height; // stores the image dimensions
};
#endif
ある
void averageRegions(int blockWidth, int blockHeight)
{
//please add the code
int height = inImage.getHeight();
int width = inImage.getWidth();
pixel** myPixels = inImage.getPixels();
pixel* pixelptr;
int Rsum = 0, Gsum = 0, Bsum = 0;
int Ravg, Gavg, Bavg, pcount = 0, m, n;
outImage.createNewImage(width/blockWidth, height/blockHeight);
pixel** outPixels = outImage.getPixels();
//pixelptr = &myPixels[0][4];
for(int x = 0; x < height; x +=blockHeight)
{
for(int y = 0; y < width; y += blockWidth)
{
for(int i = x; i < blockHeight+x; i++)
{
for(int j = y; j < blockWidth+y; j++)
{
Rsum += myPixels[i][j].red;
Gsum += myPixels[i][j].green;
Bsum += myPixels[i][j].blue;
pcount++;
}
}
Ravg = Rsum/pcount;
Gavg = Gsum/pcount;
Bavg = Bsum/pcount;
for(int i = x; i < blockHeight+x; i++)
{
for(int j = y; j < blockWidth+y; j++)
{
myPixels[i][j].red = Ravg;
myPixels[i][j].green = Gavg;
myPixels[i][j].blue = Bavg;
m = x/blockHeight;
n = y/blockWidth;
outPixels[m][n].red = myPixels[i][j].red;
outPixels[m][n].green = myPixels[i][j].green;
outPixels[m][n].blue = myPixels[i][j].blue;
}
}
pcount=0;
Rsum = 0;
Gsum = 0;
Bsum = 0;
}
}
inImage = outImage;
}
機能コードであり、これはいずれかの理由を教えてもらえますPixel.h
#ifndef PIXEL_H
#define PIXEL_H
class pixel
{
public:
unsigned char red; //the red component
unsigned char green; //the green component
unsigned char blue; //the blue component
};
#endif
ですこのエラーが発生しました
また: エラーは、アレイに割り当てられたメモリの外にアクセスしているため、このエラーが発生し
/* verify block type */
_ASSERTE(_BLOCK_TYPE_IS_VALID(pHead->nBlockUse));
は、画像要件の1つは、幅と高さに等しいを持つことはありません。 blockHeightの倍数になるように高さを試していても、私は同じエラーが発生しています – user2919378