2013-02-23 89 views
5

के लिए बाइट सरणी में छवि और स्थान का आकार बदलें मैंने इसे खोजने की कोशिश की है और जहां तक ​​मैं देख सकता हूं वहां कोड होना चाहिए, लेकिन मेरी क्रिस्टल रिपोर्ट में परिणामी छवि 1 के बजाय 5 पेज है कुछ कारण!CrystalReports BlobField

असल में, मेरे पास ब्लॉबफिल्ड से ली गई एक पूर्ण पृष्ठ छवि के साथ एक क्रिस्टल रिपोर्ट है जो पूरी तरह से काम करती है जब स्रोत छवि 240 9 पिक्सल चौड़ी और 3436 पिक्सल उच्च @ 300 डीपीआई होती है।

जब मैं 2436 उच्च @ 200 डीपीआई द्वारा एक स्रोत छवि है कि 1700 चौड़ा है इस्तेमाल करने की कोशिश, छवि ऊंचाई बहुत अधिक है और अगले पृष्ठ थोड़ा

मैंने सोचा था कि "कोई समस्या नहीं पर रिपोर्ट बंद लटका हुआ है, मैं बस छवि का आकार बदलूंगा और रिपोर्ट सही तरीके से प्रदर्शित होगी "लेकिन मुझे ऐसा करने में बड़ी कठिनाई हो रही है .. इस कोड का उपयोग मैं इस समय कर रहा हूं-" सामान्य "छवि आकार और इस कोड का उपयोग करते समय, सबकुछ प्रदर्शित होता है रिपोर्ट में ठीक है, लेकिन अगर मुझे आकार बदलने की जरूरत है, तो यह बड़े पैमाने पर व्यापक और पांच पृष्ठों पर फैला है जो इसे अकेले छोड़ने से भी बदतर है! :(

Dim fs As System.IO.FileStream = New System.IO.FileStream(FilePath, System.IO.FileMode.Open, System.IO.FileAccess.Read) 
Dim Image() As Byte = New Byte(fs.Length - 1) {} 
fs.Read(Image, 0, CType(fs.Length, Integer)) 
fs.Close() 

'Byte[] to image 
Dim imgMemoryStream = New IO.MemoryStream(Image) 
Dim myImage = Drawing.Image.FromStream(imgMemoryStream) 

' Check if image is 2409 wide, if it's not then resize to 2409 while preserving aspect ratio. WIN. 
If myImage.Width <> 2409 Then 
    MsgBox("myimage before: " & myImage.Width & " by " & myImage.Height) 
    myImage = ImageResize(myImage, 3436, 2409) 
    MsgBox("myimage after: " & myImage.Width & " by " & myImage.Height) 
Else 
    MsgBox("myimage (already correct for printing): " & myImage.Width & " by " & myImage.Height) 
End If 

Dim imgMemoryStream2 As IO.MemoryStream = New IO.MemoryStream() 
myImage.Save(imgMemoryStream2, System.Drawing.Imaging.ImageFormat.Jpeg) 
Image = imgMemoryStream2.ToArray 

objDataRow(strImageField) = Image 

तो मैं एक बाइट सरणी में मूल छवि हथियाने रहा हूँ (के रूप में मुझे लगता है छवि का आकार "सामान्य" है डिफ़ॉल्ट रूप से और बस सीधे डाल देगा BlobField में) और फिर इसे परिवर्तित करने में वापस छवि आकार की जांच करने के लिए एक छवि। यदि आकार "सामान्य" नहीं है, तो मैं छवि का आकार बदल रहा हूं, फिर इसे रिपोर्ट में ब्लॉबफिल्ड को फ़ीड करने के लिए इसे बाइट सरणी में परिवर्तित कर रहा हूं।

यह छवि का आकार बदल गया है कोड:

Public Shared Function ImageResize(ByVal image As System.Drawing.Image, _ 
ByVal height As Int32, ByVal width As Int32) As System.Drawing.Image 
Dim bitmap As System.Drawing.Bitmap = New System.Drawing.Bitmap(width, height, image.PixelFormat) 
If bitmap.PixelFormat = Drawing.Imaging.PixelFormat.Format1bppIndexed Or _ 
bitmap.PixelFormat = Drawing.Imaging.PixelFormat.Format4bppIndexed Or _ 
bitmap.PixelFormat = Drawing.Imaging.PixelFormat.Format8bppIndexed Or _ 
bitmap.PixelFormat = Drawing.Imaging.PixelFormat.Undefined Or _ 
bitmap.PixelFormat = Drawing.Imaging.PixelFormat.DontCare Or _ 
bitmap.PixelFormat = Drawing.Imaging.PixelFormat.Format16bppArgb1555 Or _ 
bitmap.PixelFormat = Drawing.Imaging.PixelFormat.Format16bppGrayScale Then 
Throw New NotSupportedException("Pixel format of the image is not supported.") 
End If 
Dim graphicsImage As System.Drawing.Graphics = System.Drawing.Graphics.FromImage(bitmap) 
graphicsImage.SmoothingMode = Drawing.Drawing2D.SmoothingMode.HighQuality 
graphicsImage.InterpolationMode = Drawing.Drawing2D.InterpolationMode.HighQualityBicubic 
graphicsImage.DrawImage(image, 0, 0, bitmap.Width, bitmap.Height) 
graphicsImage.Dispose() 
Return bitmap 
End Function 

शायद मैं समस्या को गलत तरीके से संबोधित कर रहा हूं लेकिन मूल सहयोगी मैं क्रिस्टल रिपोर्ट ब्लॉबफिल्ड में किसी भी आकार की छवियों को छोड़ने की अनुमति देने का एक तरीका खोजने की कोशिश कर रहा हूं और उन्हें एक पूर्ण ए 4 पृष्ठ लेना है।

उत्तर

0

आपके पास अपनी छवि (जैसा कि बाइट []) पहले से कहीं भी संग्रहीत होनी चाहिए, इसे अपने आकार की छवि को नए आयामों के साथ, इस ResizeBytes फ़ंक्शन पर पास करें।

private byte[] ResizeBytes(byte[] byteImageIn, int NewWidth, int NewHeight) 
{ 
    //Convert Bytes to Image 
    MemoryStream ms1 = new MemoryStream(byteImageIn); 
    Image img = Image.FromStream(ms1); 

    //Convert Image in to new image with new dimensions, padding with a white background 
    img = FixedSize(img, NewWidth, NewHeight); 

    //Convert image back to a byte array 
    MemoryStream ms2 = new MemoryStream(); 
    img.Save(ms2, System.Drawing.Imaging.ImageFormat.Jpeg); 
    byte[] imageBytes = ms2.ToArray(); 
    return imageBytes; 
} 

FixedSize समारोह:

private Image FixedSize(Image imgPhoto, int Width, int Height) 
{ 
    int sourceWidth = imgPhoto.Width; 
    int sourceHeight = imgPhoto.Height; 
    int sourceX = 0; 
    int sourceY = 0; 
    int destX = 0; 
    int destY = 0; 

    float nPercent = 0; 
    float nPercentW = 0; 
    float nPercentH = 0; 

    nPercentW = ((float)Width/(float)sourceWidth); 
    nPercentH = ((float)Height/(float)sourceHeight); 
    if (nPercentH < nPercentW) 
    { 
     nPercent = nPercentH; 
     destX = System.Convert.ToInt16((Width - 
         (sourceWidth * nPercent))/2); 
    } 
    else 
    { 
     nPercent = nPercentW; 
     destY = System.Convert.ToInt16((Height - 
         (sourceHeight * nPercent))/2); 
    } 

    int destWidth = (int)(sourceWidth * nPercent); 
    int destHeight = (int)(sourceHeight * nPercent); 

    Bitmap bmPhoto = new Bitmap(Width, Height, 
         PixelFormat.Format48bppRgb); //Format24bppRgb 
    bmPhoto.SetResolution(imgPhoto.HorizontalResolution, 
        imgPhoto.VerticalResolution); 

    Graphics grPhoto = Graphics.FromImage(bmPhoto); 
    grPhoto.Clear(Color.White); 
    grPhoto.InterpolationMode = 
      InterpolationMode.HighQualityBicubic; 

    grPhoto.DrawImage(imgPhoto, 
     new Rectangle(destX, destY, destWidth, destHeight), 
     new Rectangle(sourceX, sourceY, sourceWidth, sourceHeight), 
     GraphicsUnit.Pixel); 

    grPhoto.Dispose(); 
    return bmPhoto; 
} 
+0

आपके उत्तर डेव लिए बहुत-बहुत धन्यवाद! मैं वास्तव में रिपोर्ट ऑब्जेक्ट को संशोधित करना समाप्त कर दिया जिसने छवि को दिखाया, लेकिन मैं अभी भी इस सवाल का सीधा जवाब प्रदान करने की सराहना करता हूं :) मैं कोड पर वापस जाउंगा और देख सकता हूं कि आपका कैसा है। क्या आप मुझे बता सकते हैं कि मैंने जिस कोड का उपयोग करने का प्रयास किया है, उसके साथ क्या गलत है? इसमें msgstr "मैंने जो संकल्प बदल दिया है, उसकी पुष्टि करने वाले संदेश को पुष्टि कर रहा है, फिर भी जब मैंने रिपोर्ट में उस आकार का ब्लॉब डाल दिया तो यह भारी है! – user2101511

+0

मैंने इस समस्या के समाधान के लिए लंबे समय तक देखा, यहां तक ​​कि मेरे रिपोर्टिंग लड़के को भी कार्य सौंपा गया और वह केवल क्रिस्टल रिपोर्ट का उपयोग करके समाधान नहीं ढूंढ सका। तो हमें समस्या को हल करने के लिए ऊपर के साथ आना पड़ा और यह हमारे लिए बहुत अच्छा काम करता है। हालांकि, हम छोटे कंपनी लोगो का उपयोग कर रहे हैं, आदि आकार बदलने के बाद गुणवत्ता में थोड़ी गिरावट आई है, और हमारे उपयोग के कारण यह एक बड़ा सौदा नहीं है। आपका मिलेज भिन्न हो सकता है। –